|
Ввести с клавиатуры массив чисел. Найти суммы положительных и отрицательных чисел. Вывести результат.
.model small .stack 256 .data mas dw 8 dup(0) zz db 0Dh, 0Ah,'-$' .code start: mov ax,@data mov ds,ax mov cx,8 mas_in: xor bx,bx num_s_in: cmp bx,6 je end_num_s_in mov ah,01h int 21h cmp al,0Dh je end_num_s_in inc bx xor ah,ah push ax jmp num_s_in end_num_s_in: mov bp,1 xor di,di num_p: cmp bx,1 je end_num_p pop ax sub al,'0' mul bp add di,ax mov ax,bp mov bp,10 mul bp mov bp,ax dec bx jmp num_p end_num_p: pop ax cmp al,'-' jne ee neg di ee: mov ax,cx ;sub ax,2 shl ax,1 mov si,offset mas add si,ax mov word ptr [si],di loop mas_in ____SOBSTVENNO SLOGENIE____ mov di,offset mas xor ax,ax ;summa bolhih 0 xor bx,bx ;summa menshih 0 mov cx,9 add_num: cmp word ptr[di],0 jl add_less_zero add ax,word ptr [di] jmp e add_less_zero: add bx,word ptr [di] e: add di,2 loop add_num ___VYVOD_______ div_num_s: mov cx,10 xor bp,bp div_num: cmp ax,0 je end_div_num xor dx,dx div cx add dx,'0' push dx inc bp jmp div_num end_div_num: vyvod: cmp bp,0 je end_vyvod pop ax mov ah,02h mov dl,al int 21h dec bp jmp vyvod end_vyvod: cmp bx,0 je exit neg bx mov ah,9 mov dx,offset zz int 21h mov ax,bx xor bx,bx jmp div_num_s exit: mov ax,4C00h int 21h end start Дан массив строк. Найти строку с max длинной и вывести ее на экран. .model small .stack 100h .data str0 db "Hello",'$' str1 db "Good day",'$' str2 db "Hi!",'$' str3 db "How do you do?",'$' str4 db "I greet you",'$' StrArray dw offset str0 dw offset str1 dw offset str2 dw offset str3 dw offset str4 StrCount dw 5 .code program: mov ax, @data mov ds, ax mov si, offset StrArray ; si - начало массива строк mov cx, StrCount ; инициализация счетчика xor ax, ax ; в ax - макс. длина строки calc_length: mov bx, [si] ; bx - смещение текущей строки add si, 2 ; si сдвигается на следующую строку push cx ; сохраняем счетчик call str_len ; определяем длину строки cmp ax, cx ja end_loop ; если найденная длмна больше макс. mov ax, cx ; сохраняем эту длину в ax mov dx, bx ; сохраняем в dx смещение строки end_loop: pop cx ; восстанавливаем счетчик loop calc_length mov ah, 9 ; выводим макс. строку на экран int 21h mov ax, 4c00h int 21h ; Находит длину строки ; bx - смещение строки ; Результат: cx - искомая длина str_len proc near push bx push ax xor cx, cx mov al, '$' mov ah, 0 len_lp: cmp al, [bx] je end_len cmp ah, [bx] je end_len inc cx inc bx jmp len_lp end_len: pop ax pop bx ret str_len endp end program Перевод числа из одной системы счисления в другую. Данные вводить с клавиатуры. .modl small .stack 256 .data Mess1 db 'Enter number in 10c: $' Mess2 db 0Dh, 0Ah,'Result in 16c: $' .code start: mov ax,@data mov ds,ax mov ah,9 mov dx,offset Mess1 int 21h; Выводим первое сообщение xor bx,bx num_in: ; Вводим символы числа, пока не нажмется энтэр mov ah,01h int 21h cmp al,0Dh je end_num_in sub al,'0' ; переводим в десятичный вид xor ah,ah push ax ; и ложим его в стек inc bx jmp num_in end_num_in: mov cx,1 num_preobr: cmp bx,0 je end_num_preobr ; если цифры ;числа закончились, то переходим на ;end_num_preobr pop ax xor dx,dx ; умножаем на число в cx (1, 10, 100, 1000, …) mul cx ; и добавляем к конечному числу add di,ax dec bx ; умножаем на 10, чтобы получить 10, 100, 1000, … mov ax,10 mul cx mov cx,ax jmp num_preobr end_num_preobr: ; Выводится сообщение 2 mov ah,9 mov dx,offset Mess2 int 21h ; начало коныертации в 16 систему mov ax,di mov bx,0 mov cx,16 num_convert: ; непосредственно перевод cmp ax,0 je end_convert xor dx,dx ; делим на систему счисления div cx ; сравниваем остаток от деления с 9, если больше, добавляем ‘7’, иначе ‘0’ cmp dx,9 ja above_9 add dx,'0' jmp next above_9: add dx,'7' next: push dx inc bx jmp num_convert end_convert: out_num: ; если цифры закончились, то переходим ;на end_out_num cmp bx,0 je end_out_num pop dx mov ah,02h int 21h dec bx jmp out_num end_out_num: mov ax,4C00h int 21h end start Вычислить сумму столбцов матрицы с полным вводом/выводом (программа типа exe) .model small .stack 300h .code endl macro push ax dx mov ah, 02h mov dl, 0Ah int 21h mov dl, 0Dh int 21h pop dx ax endm outint macro value local outint_l1, outint_l2 push ax bx cx dx mov ax, value mov bx, 10 xor cx, cx outint_l1: xor dx, dx div bx push dx inc cx cmp ax, 0 jne outint_l1 mov ah, 02h outint_l2: pop dx add dl, '0' int 21h loop outint_l2 pop dx cx bx ax endm proc readint push cx si bx dx mov buf_str, 8 mov ah, 0Ah lea dx, buf_str int 21h xor cx, cx mov si, 2 xor ax, ax mov bx, 10 in_loop: mul bx mov dl, [buf_str+si] sub dl, '0' add ax, dx inc si inc cl cmp cl, [buf_str+1] jl in_loop pop dx bx si cx endl ret endp start: mov ax, @data mov ds, ax
xor cx, cx xor dx, dx xor di, di input_loop: push dx mov ah, 09h lea dx, str_1 int 21h outint cx lea dx, str_2 int 21h mov si, sp mov dx, [ss:si] outint dx lea dx, str_3 int 21h call readint mov word ptr matrix[di], ax add di, 2 pop dx inc cx cmp cx, N jl input_loop xor cx, cx inc dx cmp dx, N jl input_loop xor ax, ax cont_summ: mov si, ax shl si, 1 xor dx, dx cont_summ_2: add dx, word ptr matrix[si] add si, N*2 cmp si, N*N*2 jl cont_summ_2 outint dx endl
inc ax cmp ax, N jl cont_summ
mov ax, 4C00h int 21h .data N equ 3 matrix db N*N*2 dup(?) buf_str db 10 dup(?) str_1 db "Input matrix[$" str_2 db "][$" str_3 db "]:",10,13,"$" sum1 dw 0 sum2 dw 0 end start Перевод строки в число. .model small .stack 100h .data num dw ? c10 db 10 .code begin: mov ax,@data mov ds,ax xor bx,bx again: mov ah,1 int 21h cmp al, 0dh ; если энтер, то закончим ввод je con sub al,'0' ; вычитаем ‘0’ из символа для xor ah,ah ; mov si,ax mov ax,bx ; помещаем конечный на данный момент результат в ax mul c10 ; и умножаем его на 10 add ax,si ; добавляем к полученному значению введенную только что цифру mov bx, ax ; формируем в bx конечное на данный момент значение jmp again ; зацикливаем con: mov num,bx ; полученное число mov ax, 4c00h int 21h end begin В сегменте данных дана матрица. Отсортировать ее побочную дигональ .model small .stack 100h .data razmer equ 4 matrix dw 1,2,3,13 dw 5,6,10,8 dw 9,7,11,12 dw 4,14,15,16 .code start: mov ax,@data mov ds,ax mov cx,razmer dec cx mov bx,cx shl bx,1 ; bx - смещение (длина строки -2) loop1: mov si,bx push cx loop2: mov dx,matrix[si] ; mov di,matrix[si][bx] ; перестановка cmp dx,di ; jl cont_loop2 mov matrix[si],di mov matrix[si][bx],dx cont_loop2: add si,bx ; loop loop2 ; смещение на следующую строку pop cx ; loop loop1 lea dx,matrix mov ah,4ch int 21h end start Вводится матрица чисел. Найти сумму элементов по каждой диагонали и вывести на экран. .model small .stack 300h .code endl macro push ax dx mov ah, 02h mov dl, 0Ah int 21h mov dl, 0Dh int 21h pop dx ax endm outint macro value local outint_l1, outint_l2 push ax bx cx dx mov ax, value mov bx, 10 xor cx, cx outint_l1: xor dx, dx div bx push dx inc cx cmp ax, 0 jne outint_l1 mov ah, 02h outint_l2: pop dx add dl, '0' int 21h loop outint_l2 pop dx cx bx ax endm proc readint push cx si bx dx mov [buf_str], 8 mov ah, 0Ah lea dx, buf_str int 21h xor cx, cx mov si, 2 xor ax, ax mov bx, 10 in_loop: mul bx mov dl, [buf_str+si] sub dl, '0' add ax, dx inc si inc cl cmp cl, [buf_str+1] jl in_loop pop dx bx si cx endl ret endp start: mov ax, @data mov ds, ax
xor cx, cx xor dx, dx xor di, di input_loop: push dx mov ah, 09h lea dx, str_1 int 21h outint cx lea dx, str_2 int 21h mov si, sp mov dx, [ss:si] outint dx lea dx, str_3 int 21h
call readint mov word ptr matrix[di], ax add di, 2 pop dx inc cx cmp cx, N jl input_loop xor cx, cx inc dx cmp dx, N jl input_loop xor si, si xor ax, ax count_sum1: add ax, word ptr matrix[si] add si, N*2+2 cmp si, N*N*2 jl count_sum1 mov sum1, ax mov si, N*2-2 xor ax, ax count_sum2: add ax, word ptr matrix[si] add si, N*2-2 cmp si, N*(N-1)*2+2 jl count_sum2 mov sum2, ax mov ah, 09h lea dx, str_4 int 21h outint sum1 lea dx, str_5 int 21h outint sum2 lea dx, str_6 int 21h mov ax, 4C00h int 21h .data N equ 3 matrix db N*N*2 dup(?) buf_str db 10 dup(?) str_1 db "Input matrix[$" str_2 db "][$" str_3 db "]:",10,13,"$" str_4 db "Sum1=$" str_5 db 10,13,"Sum2=$" str_6 db 10,13,"$" sum1 dw 0 sum2 dw 0 end start Работа с окнами в текстовом режиме. Работа с окнами в текстовом режиме. (результат работы проги: синее окно, ;в нем - зеленое окно, в зеленом окне - текст :)) .MODEL small .STACK 100h .DATA str_ db 'TEXT' len equ $-str_ .CODE main: mov ax, @data mov ds, ax mov es, ax mov ah, 06h ;очистка окна mov al, 00h ;режим окна mov bh, 17h ;видео-атрибут для пустых строк mov cx, 0000h ;очистка экрана от (00;00) до (24;79) mov dx, 1b4fh int 10h mov ax, 0600h ;в ah - 06h в al - 00h mov bh, 20h mov cx, 0a1ch mov dx, 0c31h int 10h mov ah, 13h ;вывод на экран в позиции курсора mov al, 0 ;не менять положение курсора mov bh, 0 ;номер страницы mov bl, 07h ;цвет выводимого текста mov cx, len mov dx, 0b25h ;координаты на экране (dh - y, dl - x) lea bp, str_ ;адрес выводимой строки int 10h mov ah, 4ch int 21h end main Сложение и вычитание длинных чисел. .model small .stack 100h .data num1 dw 1234h, 5678h num2 dw 8765h, 4321h res1 dw 0,0 res2 dw 0,0 .code start: mov ax, @data mov ds, ax ; сложение mov ax, num1[0] add ax, num2[0] mov res1[0], ax mov ax, num1[2] adc ax, num2[2] mov res1[2], ax ; вычитание mov ax, num1[0] sub ax, num2[0] mov res2[0], ax mov ax, num1[2] sbb ax, num2[2] mov res2[2], ax mov ax, 4C00h int 21h end start |
|
|