Отладка выполнения программы в DOSBOX

Рейтинг: 0Ответов: 1Опубликовано: 12.05.2023

Всем привет. Дело такое, у меня задание в универе по языку ассемблер. Задание: Х= 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Принят
  1. На скрине отладчик td.exe borland turbo debugger, одна из более менее удобных программ для отладки на ассемблере. Т.к. программа довольно старая, под winxp x86 и ранее она работает и так, под современной виндой она работает через DosBox

  2. Результат виден сразу после выполнения программы в правом окне светятся регистры 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".