1

我正在使用我的程序,它应该将十进制数字从 0 到 65535 转换为十六进制。问题是我的程序不会打印 4 位十六进制数字。例如,它将打印 5FF 而不是 FFFF 或 711 而不是 1111,我找不到错误。请帮忙。

继承人的代码:

;***************************************************************
; decimal to hexadecimal
;***************************************************************

.model small

bufSize EQU 121

.stack 100h

.data

    bufSize DB  bufSize     
    read DB  ?              ;how many symbols
    buf  DB  bufSize dup (?)    

    msg  DB  'Please, enter decimal digit: $'
    enterr  DB  13, 10, '$'
    errormsg DB  'wrong input $'
    form     DB  'answer is: $'

.code

begin:
    MOV ax, @data       
    MOV ds, ax          

;****reads line****
    MOV ah, 9
    MOV dx, offset msg
    INT 21h         

    MOV ah, 0Ah
    MOV dx, offset bufSize
    INT 21h         

    MOV ah, 9
    MOV dx, offset enterr
    INT 21h         

;****algorythm****
    XOR ax, ax          
    MOV cl, read        ;how many symbols

    MOV bx, offset buf  ;first symbol to bx






check: 
    CMP cl, 0
    MOV ah, 9
    JNE loop0
    MOV dx, offset errormsg
    INT 21h         ;spausdiname rezultato žinutę
    JE ending

errorr:
    MOV ah, 9
    MOV dx, offset errormsg
    INT 21h         ;spausdiname rezultato žinutę
    JMP ending
loop0:
    PUSH ax
    PUSH dx
    XOR ax,ax
    XOR dx,dx
    JMP loop1


loop1:
    MOV dh,0Ah
    MUL dh
    MOV dl,[bx] 
    cmp dl, '0'
    JB errorr
    cmp dl, '9'
    JA errorr

    SUB dl,30h
    ADD al,dl

loop2:  
    INC bx          

    DEC cl          
    CMP cl, 0           
    JNE loop1           

    MOV cx, 16
    PUSH '$$'

Division:
    MOV dx, 0       
    DIV cx      ;[DX,AX]:10 = AX(remainder DX)
    PUSH dx     
    CMP ax, 0       
    JA  Division        

    ;printing
    MOV ah, 9
    MOV dx, offset form
    INT 21h         
    MOV ah, 2       
Print:
    POP dx      
    CMP dx, "$$"    
    JE  ending      
    CMP dx, 9
    JNBE above
less:
    ADD dl, '0'     
    INT 21h     
    JMP Print   
above:
    ADD dl, '7'     
    INT 21h 
    JMP Print   

    pop dx
    pop ax



ending:
    MOV ah, 4Ch
    MOV al, 0           
    INT 21h         



END begin

谢谢您的回答。:)

4

1 回答 1

0

问题出在第一个循环中的乘法步骤中:

MUL dh

这种形式的MUL指令采用 8 位寄存器或内存操作数(此处DH为 ),将其与 8 位AL寄存器相乘,并将 16 位结果存储在AX. 因为这只允许 8 位操作数,所以它只能对最大为 255 的输入值正确工作。如果您希望它对最大为 65535 的值工作,您将需要使用将两个 16 位值相乘的形式来产生一个32 位结果DX:AX(并忽略该结果的高 16 位,放入DX),例如:

MUL dx

但这将需要对您的寄存器进行改组,因为您当前已经在使用DL来保存当前数字,并且正如我所说,DX将设置为 32 位结果的高 16 位。在这种情况下,最好使用带IMUL符号的乘法指令,这很方便,因为它最多可以使用 3 个参数(在 x86 中不常见):

MOV dx,0Ah;
IMUL ax,ax,0Ah

这将设置AX为结果的底部 16 位并丢弃顶部 16 位。乘法是有符号的这一事实在这里没有任何区别,因为在这两种情况下,底部的 16 位都是相同的。

于 2012-11-04T16:49:24.887 回答