Задать вопрос
Arti-Jack
@Arti-Jack

Что делает cwb и правильно ли посчитает выражение программа?

Доброго времени суток.

Задача стоит весьма тривиальная: подсчёт выражения (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


Вообще если представить это, то выйдет:
5ad5de7120efe411121156.png

Дальше в регистр BX записывается сумма BX и AX. Но регистр BX не имеет нужного значения.

И ещё я не совсем понимаю, ведь мнемоник cbw меняет значение регистра ax на то, что находится в al (я не совсем уверен, но компиляция мне показала именно такой результат).

Итак, мой вопрос: Вообще есть ли тут ошибка (надо ли копировать значения регистра AX после того, как в AX запишется 22 / a), или тут моя логика неправильная? И ещё, верно ли, что cbw записывает в регистр AX значение регистра AL? если вам не трудно, то буду рад, если поясните по шагам что вообще происходит, дабы удостовериться
  • Вопрос задан
  • 351 просмотр
Подписаться 1 Простой Комментировать
Решения вопроса 1
@assembled
Сначала всё правильно:
- поместили в AL 3 и умножили на b, результат получился в AX;
- записали его в BX ;
- поместили в AX 22, разделили на с, частное получилось в AL;
- расширили знак с пом. cbw, результат в АХ;
- сложили ВХ ( 3*b) и АХ (22/с), и потом записали в AX.
Но потом вместо второго cbw надо было написать cwd - расширить знак АХ на DX.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы