我试图将两个十进制数转换为浮点数,将它们相除并以16位汇编显示结果,但我得到的只是符号

问题描述 投票:0回答:1

我正在尝试将两个十进制数转换为浮点数,将它们相除并在类项目的 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

我不知道为什么每当我运行时它都会打印奇怪的符号。我不知道有什么问题。是不是溢出的问题?

assembly x86-16 number-formatting
1个回答
0
投票
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
    
© www.soinside.com 2019 - 2024. All rights reserved.