assembly 在NASM汇编程序中向DOS控制台输出数字时出现问题

9cbw7uwe  于 2023-03-18  发布在  其他
关注(0)|答案(1)|浏览(146)

我们有以下任务:编写一个程序,设置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。

3yhwsihp

3yhwsihp1#

您的结果之一(4和30)超过1位。您需要一个更好的方法来输出多位数。请参阅Displaying numbers with DOS
然后比较这些数字,用x和y半和替换较小的数字,用x和y乘积的两倍替换较大的数字

  • 最好不要从比较数字开始,然后重复大量的代码。首先计算替换表达式,并将结果保存在寄存器中。(例如,mov [x], bx会在下次使用x之前破坏x)
mov bx, [x]
  add bx, [y]
  shr bx, 1      ; -> BX is "half-sum of x and y"

  mov ax, [x]
  mul word [y]
  shl ax, 1      ; -> AX is "twice the multiplication of x and y"
  • 然后比较数字并相应地加载x和y:
mov  cx, [x]
    cmp  cx, [y]
    jl   less_than
    xchg ax, bx    ; Just swapping the new values
  less_than:
    mov  [x], bx
    mov  [y], ax

替换其中较小的
jle less_than指令正在LessOrEqual上进行分支。按照任务说明,实际上应该变为jl less_than

相关问题