Отладка выполнения программы в DOSBOX
Всем привет. Дело такое, у меня задание в универе по языку ассемблер. Задание: Х= 3(А - 2В) +50 – С / 2 , в программе я задал такие значения: a = 10 ,b = 20 ,c = 5,x = ? Код программы:
data segment
a dw 10
b dw 20
c dw 5
x dw ?
data ends
code segment
assume cs:code, ds:data
start:
mov ax, data
mov ds, ax
mov ax, a ; AX = A
sub ax, b ; AX = A - B
sub ax, b ; AX = A - 2B
add ax, ax ; AX = 2A - 4B
add ax, ax ; AX = 4A - 8B
sub ax, bx ; AX = 4A - 8B - BX
add ax, ax ; AX = 8A - 16B - 2BX
add ax, 50 ; AX = 8A - 16B - 2BX + 50
mov bx, 2 ; BX = 2
mov cx, c ; CX = C
shr cx, 1 ; CX = C / 2
sub ax, cx ; AX = 8A - 16B - 2BX + 50 - C/2
mov x, ax ; сохранить результат в переменную X
quit:
mov ax, 4C00h ; завершить программу
int 21h
code ends
end start
Теперь ,проблема. Я не могу найти в DOSBOX результат, т.е x. 
(Я знаю,что результат представлен в 16-тиричной системе, и чтобы получить его в десятичную ,мне надо отнять от него FFFF и 1, полученное значение перевести в десятиричную и должно получится -42.5 по идее)
Ответы (1 шт):
На скрине отладчик td.exe borland turbo debugger, одна из более менее удобных программ для отладки на ассемблере. Т.к. программа довольно старая, под winxp x86 и ранее она работает и так, под современной виндой она работает через DosBox
Результат виден сразу после выполнения программы в правом окне светятся регистры ax 0192 bx 0531 и т д (ax bx cx dx di di bp sp ds es ss sp ip). Для выполнения программы по шагам используем F7
Начинаем выполнение (нажимаем F7 и смотрим регистры), для перехода к следующему шагу нажимаем F7 ещё раз и ещё раз:
; a = 10 b = 20 c = 5
; ax мусор bx мусор сx мусор
mov ax, a ; AX = A
; ax 000A bx мусор сx мусор
sub ax, b ; AX = A - B
; ax FFF6 (-10) bx мусор сx мусор
sub ax, b ; AX = A - 2B
; ax FFE2 (-30) bx мусор сx мусор
add ax, ax ; AX = 2A - 4B
; ax FFC4 (-60) bx мусор сx мусор
add ax, ax ; AX = 4A - 8B
; ax FF88 (-120) bx мусор сx мусор
sub ax, bx ; AX = 4A - 8B - BX
; ax мусор bx мусор сx мусор
Кажется дальше нет смысла трассировать, нужно править ошибки.
Тут задача с подвохом, целочисленная арифметика не считает дроби. какоето_число - 2.5 = -42.5 так не будет, будет какоето_число - 2 = -43 т.е. FFD5. Проще всего перевести - калькулятор (calc.exe) вид программист, забиваем -43, переводим в hex и лишние "F" убираем. Результат в регистрах будет актуален с момента получения результата до момента перетирания его другим числом, т.е. в точке останова "quit".
