Организация условных переходов. Ввод и вывод информации - Assembler
Формулировка задачи:
Когда записать a=2 и b=3 (a<b) выводит 21844. Почему? Как это исправить и что сделать, чтобы выполнялось условие задания?
.MODEL SMALL .STACK 100h .DATA EnterA DB 'Please , enter A',13,10,'$' EnterB DB 'Please , enter B',13,10,'$' Result DB 'X= ',7,7,'$' Error DB "Incorrect number$" Buff DB 6,7 Dup(?) C10 DB 10 .CODE START: mov ax,@data mov ds,ax mov ah,9 mov dx,OFFSET EnterA int 21h call InputInt push ax mov ah,9 mov dx,OFFSET EnterB int 21h call InputInt pop bx cmp ax, bx je one jb two ja thre re: push ax mov ah,9 mov dx,OFFSET Result int 21h xor ax,ax pop ax call OutInt mov ah,4ch int 21h one: mov ax, -2 jmp re two: add ax ,2 idiv ax jmp re thre: sub ax ,5 idiv bx jmp re OutInt proc test ax, ax jns oi1 mov cx, ax mov ah, 02h mov dl, '-' int 21h mov ax, cx neg ax oi1: xor cx, cx mov bx, 10 oi2: xor dx,dx div bx push dx inc cx ; кількість цифр test ax, ax jnz oi2 mov ah, 02h oi3: pop dx add dl, '0' int 21h loop oi3 ret OutInt endp InputInt proc mov ah,0ah xor di,di mov dx,offset Buff int 21h mov dl,0ah mov ah,02 int 21h mov si,offset Buff+2 cmp byte ptr [si],"-" jnz ii1 mov di,1 inc si ii1: xor ax,ax mov bx,10 ii2: mov cl,[si] cmp cl,0dh jz endin cmp cl,'0' jl er cmp cl,'9' ja er sub cl,'0' mul bx add ax,cx inc si jmp ii2 er: mov dx, offset Error mov ah,09 int 21h mov ah,4ch int 21h endin: cmp di,1 jnz ii3 neg ax ii3: ret InputInt endp END START
Решение задачи: «Организация условных переходов. Ввод и вывод информации»
textual
Листинг программы
call GetInt pop bx cmp bx, ax je one jns two ; jb thre thre: xchg ax, bx sub ax, 5 cwd idiv bx ; jmp re re: push ax mov ah,9 mov dx,OFFSET Result int 21h xor ax,ax pop ax call OutInt mov ah,4ch int 21h one: mov ax, -2 jmp re two: add ax, 2 cwd idiv bx jmp re
Объяснение кода листинга программы
В этом коде организованы условные переходы. Вот список действий:
- Вызов функции GetInt (предположительно, это функция, которая получает целочисленный ввод от пользователя).
- Изъятие значения из регистра BX.
- Сравнение значения в регистрах BX и AX.
- Если BX меньше AX, то переход к метке one.
- Если BX больше или равно AX, то переход к метке two.
- Если BX больше AX, то переход к метке thre.
- Обмен значений в регистрах AX и BX.
- Вычитание 5 из значения в регистре AX.
- Преобразование значения в регистре AX в слово с использованием CWD.
- Деление значения в регистре AX на значение в регистре BX с использованием IDIV.
- Переход к метке re.
- Push значение в регистре AX.
- Mov значение -2 в регистр AX для обработки случая, когда BX меньше AX.
- Переход к метке re.
- Add значение 2 к значению в регистре AX.
- CWD.
- IDIV значение в регистре BX.
- Переход к метке re.
- Вывод результата ввода с использованием функции OutInt.
- Вывод сообщения об успешном выполнении программы с использованием функции OutString.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д