 |
Ассемблер в примерах - Объяснение работы программы
- Вопрос:
- нужно объяснить в программе назначение команд.
dseg segment "data"
a dw -13
b dw 8
c dw -128
dseg ends
sseg segment stack
db 65535 dup(?)
sseg ends
cseg segment "code"
main proc
assume cs:cseg,ds:dseg,ss:sseg
mov ax,dseg
mov ds, ax
mov ax, a
add ax, b ;a+b
mov bx, 3
imul bx
add ax, c ;3(a+b)+c
push ax
mov bx, 0
mov bx, a
imul bx
imul b
mov dx, 7
imul dx ; 7*b*a^2
push bx
mov ax, 0
mov ax, c
mov bx, 2
imul bx ;2*c
pop bx
sub ax, bx
pop ax
mov ax, 0
idiv bx
call write_int
mov ax, 4c00h
int 21h
main endp
write_int proc
cmp dx, 0
jge not_neg
push dx
mov ah, 06h
mov dl, 2dh
int 21h
pop dx
neg dx
not_neg:
mov cx, 0
mov ax, dx
get_next:
mov dx, 0
mov bx, 10
div bx
push dx
inc cx
cmp ax, 0
jne get_next
write_next:
mov ah, 06h
pop dx
add dx, 30h
int 21h
loop write_next
ret
write_int endp
cseg ends
end main
- Ответ:
-
;сегмент данных
dseg segment "data"
a dw -13
b dw 8
c dw -128
dseg ends
;сегмент кода
cseg segment "code"
assume cs:cseg,ds:dseg,ss:sseg
;---------------------------------------------------------------------
;вывести на экран результат вычисления (2*c - 7*b*a^2) MOD (3*(a+b)+c)
;---------------------------------------------------------------------
main proc
;поместить в ds сегментный адрес сегмента dseg
mov ax,dseg
mov ds, ax
;3*(a+b)+c
mov ax, a
add ax, b ;ax = a+b
mov bx, 3
imul bx ;dx:ax = ax*bx
add ax, c ;ax = ax + c
push ax ;[3*(a+b)+c]
;7*b*a^2
mov ax, a
mov bx, a
imul bx ;dx:ax = ax*bx
imul b ;dx:ax = ax*b
mov dx, 7
imul dx ;dx:ax = ax*dx
push ax ;[7*b*a^2]
;2*c
mov ax, c
mov bx, 2
imul bx ;dx:ax = ax*bx
pop bx ;[7*b*a^2]
;2*c - 7*b*a^2
sub ax, bx ;ax = ax - bx
pop bx ;[3*(a+b)+c]
;(2*c - 7*b*a^2) / (3*(a+b)+c)
idiv bx ;ax,dx = dx:ax / bx
call write_int
mov ax, 4c00h
int 21h
main endp
;------------------------------------------------------------------
;подпрограмма вывода текстового представления целого числа на экран
;DX = целое знаковое
;------------------------------------------------------------------
write_int proc
push bx
push cx
cmp dx, 0
jge not_neg
push dx
;вывод символа '-'
mov ah, 06h
mov dl, '-'
int 21h
pop dx
neg dx ;модуль отрицательного числа
not_neg:
mov cx, 0 ;cx - счетчик значащих разрядов десятичного числа
mov ax, dx
;цикл деления на 10
get_next:
mov dx, 0
mov bx, 10
div bx ;ax,dx = dx:ax / bx
push dx ;остаток
inc cx
cmp ax, 0
jne get_next
;цикл вывода значащих разрядов
write_next:
mov ah, 06h
pop dx
add dx, '0'
int 21h
loop write_next
pop cx
pop bx
ret
write_int endp
cseg ends
;сегмент стека
;неинициализированные данные лучше размещать в конце модуля, в этом случае размер EXE файла будет меньше
sseg segment stack
db 65535 dup(?)
sseg ends
end main
|  |