Я попытался сделать простой калькулятор в сборке. Я использовал TASM (школьная политика). Проблема заключается в печати номера, сохраненного командой FBSTP (команда сопроцессора) в переменной DT.Печать упакованного BCD (DT) - язык ассемблера (TASM)
FBSTP адр - магазины по адресу «адр» значения, расположенного на верхней части стека (ST (0)) в виде упакованного десятичного числа (определены в „адр“ с DT). Указатель стека уменьшается. Конверсия выполняется во время процесса хранения.
Я отлаживал программу, и при делении на 10 результат был поврежден. Например: 12 * 1 = 12. Результат в res2 правильный. Переместив его в AX, все еще правильно, но когда я делю его на 10 DX, становится 8 вместо 2, поэтому вместо 12 он выводит 18. Я также заметил , что 12h = 18d, но я не могу установить соединение. LE: Если я использую простое целочисленное хранилище в переменной слова и печатаю то, что он отлично работает.
Вот часть кода, который я думаю, что рассчитывает:
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
Спасибо большое.
Я не проанализировал весь код, который вы опубликовали, но одна странная вещь: 'DIV CS: десять'. Если 'ten' находится в сегменте данных, а' CS' - это не то же самое, что 'DS', вы можете делиться чем-то другим, чем' десять'. Попробуйте делить на регистр, предварительно загруженный с 10, например. 'mov si, 10' +' div si'. –