我试图在汇编中制作一个简单的计算器。我使用了 TASM(学校政策)。问题是在 DT 变量中打印使用 FBSTP 命令(协处理器命令)保存的数字。
FBSTP adr - 将位于堆栈顶部的值 (ST (0)) 存储在地址“adr”中作为压缩十进制数(在“adr”中定义为 DT)。堆栈指针递减。转换是在存储过程中完成的。
我调试了程序,当除以 10 时,结果被破坏了。例如:12*1=12。res2 中的结果是正确的。将它移动到 AX 后它仍然是正确的,但是当我将它除以 10 时,DX 变为 8 而不是 2,所以它打印出 18 而不是 12。我还注意到 12h=18d 但我无法建立连接。LE:如果我在 word 变量中使用一个简单的整数存储并打印它,它就可以正常工作。
这是我认为重要的代码部分:
multiplication:
FINIT
FILD x
FILD y
FMUL
FBSTP res2
FWAIT
MOV ax,WORD PTR res2
call write
jmp_line
jmp exit
write PROC NEAR ;my printing proc moves cursor x spaces and starts writing
from back to front
PUSH DX
PUSH AX
PUSH CX
MOV CX,0
CMP AX, 0;check sign
JNS ok_write
NEG AX ;negate if <0
MOV CX,1 ;used to know if number is negative
ok_write:
printspace ;macro that jumps 5 spaces(maximum number length)
;starts printing the number backwards
print_digit:
inc len
;print each digit
MOV DX,0 ;prepare DX for storing the remeinder
DIV CS:ten ;divide AX by 10 so that the last digit of the number is stored
ADD dl,30h ;transform to ascii
PUSH AX ;save AX
MOV ah,02h
INT 21h ;print last digit
printchar 8 ;put cursor over last printed digit
printchar 8 ;move cursor in front of last printed digit
cmp divi,1 ;
JNE not_div
cmp len,1
JNE not_div
printchar '.'
printchar 8
printchar 8
not_div:
POP AX ;retreive AX
CMP AX,0 ;when AX=0 the number is written
JNE print_digit
;/print each digit
CMP CX,1
JNE end_print
printchar '-'
end_print:
POP CX
POP AX
POP DX
RET
write ENDP
非常感谢。