我正在尝试将两个十进制数转换为浮点数,将它们相除并在类项目的 16 位汇编中显示结果,而不使用浮点单元。我不知道为什么每当我运行时它都会打印奇怪的符号。我不知道有什么问题。是不是溢出的问题?
.model small
.stack 100h
.data
decimal_number1 dw 1234
decimal_number2 dw 5678
output_string db "Result: $"
.code
start:
mov ax, [decimal_number1]
mov bx, ax
shr bx, 8
and ax, 0FFh
mov dx, bx
mov cx, ax
mov ax, [decimal_number2]
mov bx, ax
shr bx, 8
and ax, 0FFh
add dx, bx
adc cx, ax
push ax
mov ah, 02h
lea dx, [output_string]
int 21h
pop ax
mov cx, 10
mov si, 6
float_convert_and_display:
xor dx, dx
div cx
push dx
test ax, ax
jnz float_convert_and_display
float_pop_and_display:
pop dx
add dl, '0'
mov ah, 02h
int 21h
loop float_pop_and_display
mov ah, 4Ch
int 21h
end start
我不知道为什么每当我运行时它都会打印奇怪的符号。我不知道有什么问题。是不是溢出的问题?
mov ah, 02h lea dx, [output_string] int 21h
需要使用DOS.PrintString函数09h
loop float_pop_and_display
float_convert_and_display代码使用loop
指令,该指令依赖于CX寄存器来包含堆栈上的实际项目数。遗憾的是它包含固定的除法器 10,因此您将从堆栈中弹出许多字节。你可以用堆栈上的哨兵来解决:
mov cx, 10
push cx ; Sentinel
float_convert_and_display:
xor dx, dx
div cx
push dx
test ax, ax
jnz float_convert_and_display
pop dx
float_pop_and_display:
add dl, '0'
mov ah, 02h
int 21h
pop dx
cmp dx, cx
jb float_pop_and_display