我们有以下任务:编写一个程序,设置x和y的默认值(程序中分别为3和5),然后比较这些数字,用x和y的半和替换其中较小的数字,用x和y的乘积的两倍替换其中较大的数字。
section .data
x dw 3
y dw 5
section .text
global _start
_start:
; Сравним значения x и y
mov ax, [x]
cmp ax, [y]
; Если x <= y, переходим к метке less_than
jle less_than
; Если x > y, переходим к метке greater_than
jmp greater_than
less_than:
; Найдем полусумму x и y и заменим меньшее значение на нее
mov bx, [x]
add bx, [y]
shr bx, 1
mov [x], bx
; Умножим большее значение на 2
mov bx, [y]
shl bx, 1
mov [y], bx
; Выведем значения x и y
mov ah, 02h ; функция вывода символа на экран
mov dl, byte [x] ; выводим x
add dl, '0' ; преобразуем в символ
int 21h ; вызов BIOS
mov ah, 02h ; функция вывода символа на экран
mov dl, byte [y] ; выводим y
add dl, '0' ; преобразуем в символ
int 21h ; вызов BIOS
; Завершаем программу
mov ah, 4Ch
xor al, al
int 21h
greater_than:
; Найдем полусумму x и y и заменим меньшее значение на нее
mov bx, [x]
add bx, [y]
shr bx, 1
mov [y], bx
; Умножим большее значение на 2
mov bx, [x]
shl bx, 1
mov [x], bx
; Выведем значения x и y
mov ah, 02h ; функция вывода символа на экран
mov dl, byte [x] ; выводим x
add dl, '0' ; преобразуем в символ
int 21h ; вызов BIOS
mov ah, 02h ; функция вывода символа на экран
mov dl, byte [y] ; выводим y
add dl, '0' ; преобразуем в символ
int 21h ; вызов BIOS
; Завершаем программу
mov ah, 4Ch
xor al, al
int 21h
当我编译我的程序时,我只得到了“Pp”,而我应该分别得到4和30。
1条答案
按热度按时间3yhwsihp1#
您的结果之一(4和30)超过1位。您需要一个更好的方法来输出多位数。请参阅Displaying numbers with DOS。
然后比较这些数字,用x和y的半和替换较小的数字,用x和y乘积的两倍替换较大的数字
mov [x], bx
会在下次使用x之前破坏x)替换其中较小的
jle less_than
指令正在LessOrEqual上进行分支。按照任务说明,实际上应该变为jl less_than
。