Вот попытался описать каждую строку фрагмента программы ассемблера, предназначенную для ввода числа, но не всё понял (там где не понял написано - "Зачем? "):
inint proc near ; Начало описания процедуры
push cx ; занесение в стек сx
push dx ; занесение в стек dx
push si ; занесение в стек si (признак знака)
xor si, si ; Обнуляем si (Зачем? )
xor bx, bx ; Обнуляем bx (Зачем? )
xor cx, cx ; Обнуляем cx (Зачем? )
mov ah, 01h ; ввод первого символа (Только здесь может быть введён знак минус)
int 21h ; отображение его на экране (Печать символов и строк)
cmp al, '-' ; проверка - нажата ли клавиша "-"
jne short ii1 ; если не "-", то переход на метку ii1
inc si ; прибавили 1 к si: si+1 (Зачем? )
ii0: mov ah, 01h ; ввод следующего символа
int 21h ; отображение его на экране
ii1: cmp al, 39h ; сравнение al и 9, (если Al равен 9)
ja short ii2 ; если al>9, то передаёт управление по метке ii2
sub al, 30h ; перевод символа в число
jb short ii2 ; переход по метке ii2 если Al<30h
mov cl, al ; al:=cl (Поместим цифру из AL в Cl. (Именно для этого он обнулялся?)) .
shl bx, 1 ; сдвиг влево на 1 позицию bx (тоже, что и умножение текущего результата на 10) (Зачем? )
mov ax, bx ; bx:=ax (Зачем? )
shl ax,1 ; сдвиг влево на 1 позицию ax (Зачем? )
shl ax,1 ; сдвиг влево на 1 позицию ax (Зачем? )
add bx, ax ; ax+bx (Зачем? )
add bx, cx ; cx+bx (Зачем? )
jmp short ii0 ; передача управления на метку ii0.
ii2: test si, si ; Команда TEST полезна при проверке значения конкретного бита (?).
jz short ii3 ; Переход если ноль на метку ii3 (Зачем? )
neg bx ; формирование негативного значения коэфициента bx.
ii3: mov ah, 02h ; Переход на новую строку (Зачем)
mov dl, 0Dh ; ?
int 21h ; Отображение символа на экране.
mov dl, 0Ah ; ?
int 21h ; Отображение символа на экране.
pop si ; Занесение в стек si
pop dx ; Занесение в стек dx
pop cx ; Занесение в стек cx
ret ; Возврат после обработки прерывания
inint endp ; Конец описания процедуры
Другие языки программирования и технологии
Помогите доразбираться в фрагменте программы ассемблера.
shl bx, 1 = умножение на 2 а не 10
Во-вторых везде одна и та же ошибка. Результат заносится в левый операнд
mov ax, bx ; bx:=ax (Зачем? ) Правильно - ax<- bx
В-третих
test si, si проверка на 0 а не какой-то бит
В-четвертых
pop выталкивает из стека а не заносит
SI - флаг, который выставляется если число отрицательное, и в конце в зависимости от него производится инверсия
Весь геморой с двумя с двигами и сложением - только чтоб умножить на 10. команду imul автор видать не знает, или что сдвигать можно не только на 1 позицию, а например сразу на несколько
Если бы не знак -, то процедура выводила бы символ по его ASCII коду.
И еще процедура подвержена переполнению, если введенное число будет больше 65535
Во-вторых везде одна и та же ошибка. Результат заносится в левый операнд
mov ax, bx ; bx:=ax (Зачем? ) Правильно - ax<- bx
В-третих
test si, si проверка на 0 а не какой-то бит
В-четвертых
pop выталкивает из стека а не заносит
SI - флаг, который выставляется если число отрицательное, и в конце в зависимости от него производится инверсия
Весь геморой с двумя с двигами и сложением - только чтоб умножить на 10. команду imul автор видать не знает, или что сдвигать можно не только на 1 позицию, а например сразу на несколько
Если бы не знак -, то процедура выводила бы символ по его ASCII коду.
И еще процедура подвержена переполнению, если введенное число будет больше 65535
что бы заменить эти "Зачем" - нужно знать задание этой процедуры. Если не знаешь - в дебаггер!
если эти строки ты неправильно комментируешь, то гадать смысла нету!
push cx ; занесение в стек сx
push dx ; занесение в стек dx
push si ; занесение в стек si (признак знака)
....
pop si ; Занесение в стек si
pop dx ; Занесение в стек dx
pop cx ; Занесение в стек cx
// это сохранение изменяемых регистров и их восстановление после выполнения кода!
а так это преоразование строки с фильтрацией в число. . что тут непонятного!
если эти строки ты неправильно комментируешь, то гадать смысла нету!
push cx ; занесение в стек сx
push dx ; занесение в стек dx
push si ; занесение в стек si (признак знака)
....
pop si ; Занесение в стек si
pop dx ; Занесение в стек dx
pop cx ; Занесение в стек cx
// это сохранение изменяемых регистров и их восстановление после выполнения кода!
а так это преоразование строки с фильтрацией в число. . что тут непонятного!
страшная, ужасно страшная процедура,, , считает, считает, обрабатывает, НО ничего не выводит, ,
НО думаю есиб она и норм работала то онасчитала бы количество тире в вводимой по-символьно вами строке
"""ret ; Возврат после обработки прерывания""-и почему именно прерывание? ?
И на кой хрен в конце она тупо выводит ВК т ПС,
НО думаю есиб она и норм работала то онасчитала бы количество тире в вводимой по-символьно вами строке
"""ret ; Возврат после обработки прерывания""-и почему именно прерывание? ?
И на кой хрен в конце она тупо выводит ВК т ПС,
Похожие вопросы
- Рабочая ли это программа (Ассемблер)?
- Изменение программы ассемблера.
- Почему на компонуется программа (Ассемблер)
- Будет ли работать программа? ассемблер.
- Помогите исправить ошибку в программе (c++).
- Дан фрагмент программы на двух языках программирования
- Обьсните фрагмент программы для 1 класса С++
- ОЧЕНЬ НУЖНО!!!ПОМОГИТЕ!!!я слышал есть программа которая делает обратню хэш функцыю в МD5.
- Помогите с расширением знака в ассемблере
- ВАЖНО! помогите, скачала на телефон программу какую-то теперь деньги снимают (( далее внутри.