Доброго времени суток.
Задача стоит весьма тривиальная: подсчёт выражения
(22 / c + 3 * b)
, где
c, b - вводятся с клавиатуры.
Есть два файла - кресты и asm. Так как проще будет вводить с клавиатуры числа на с++, то во втором файле я просто получаю эти переменные с помощью extern. Но это не столь важно для контекста этой задачки.
Код первого файла я опущу, всё что необходимо знать в контексте этого вопроса- это то, что числа вводятся и эксетрнятся в asm файл.
Вот код на ASM:
MODEL Large, C
.data
Extrn b:byte, c:byte, numerator:word ; numenator - результат
.code
Public Delim
Delim proc far
; Подсчёт выражения
mov al, 3
imul b
; al = 3 * b
mov bx, ax
mov ax, 22
idiv c
; должно быть ax = 22 / c
cbw ;?
add bx, ax
mov ax, bx
; ax =22/c + 3*b
cbw ; Что делает этот мнемоник?
mov word ptr numenator, ax
mov word ptr numenator + 2, dx
ret
Delim endp
end
Так вот, я не понимаю, работает ли это правильно?
Меня смущает этот момент:
mov bx, ax
mov ax, 22
idiv c
; ax = 22 / c
Вообще если представить это, то выйдет:
Дальше в регистр BX записывается сумма BX и AX. Но регистр BX не имеет нужного значения.
И ещё я не совсем понимаю, ведь мнемоник cbw меняет значение регистра ax на то, что находится в al (я не совсем уверен, но компиляция мне показала именно такой результат).
Итак, мой вопрос: Вообще есть ли тут ошибка (надо ли копировать значения регистра AX после того, как в AX запишется 22 / a), или тут моя логика неправильная? И ещё, верно ли, что cbw записывает в регистр AX значение регистра AL? если вам не трудно, то буду рад, если поясните по шагам что вообще происходит, дабы удостовериться