Другие языки программирования и технологии

Помогите доразбираться в фрагменте программы ассемблера.

Вот попытался описать каждую строку фрагмента программы ассемблера, предназначенную для ввода числа, но не всё понял (там где не понял написано - "Зачем? "):

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
Isrofil Maksumov
Isrofil Maksumov
12 551
Лучший ответ
что бы заменить эти "Зачем" - нужно знать задание этой процедуры. Если не знаешь - в дебаггер!
если эти строки ты неправильно комментируешь, то гадать смысла нету!
push cx ; занесение в стек сx
push dx ; занесение в стек dx
push si ; занесение в стек si (признак знака)
....
pop si ; Занесение в стек si
pop dx ; Занесение в стек dx
pop cx ; Занесение в стек cx
// это сохранение изменяемых регистров и их восстановление после выполнения кода!

а так это преоразование строки с фильтрацией в число. . что тут непонятного!
Сергей Ирена
Сергей Ирена
91 407
страшная, ужасно страшная процедура,, , считает, считает, обрабатывает, НО ничего не выводит, ,
НО думаю есиб она и норм работала то онасчитала бы количество тире в вводимой по-символьно вами строке
"""ret ; Возврат после обработки прерывания""-и почему именно прерывание? ?
И на кой хрен в конце она тупо выводит ВК т ПС,