Kezzya
@Kezzya

Объясните участки кода на ассемблере?

.model tiny
.code
.486
org 100h
.startup
  a:xor   ax,ax
    int   16h
    and   ax,255
    imul  dx,ax,5
    add   dx,offset roman-'1'*5
    mov   ah,9
    int   21h
  jmp a
roman db 'I$$$$II$$$III$$IV$$$V$$$$VI$$$VII$$VIII$IX$'  
end


Как вообще этот код переводит арабские цифры в римские?
int16h - записывает то что мы вводим с клавиатуры, например число 5, но при этом тут нет функции, я не понимаю в какой регистр записывается число, чисто из моего предположения в регистр ах
and ax,255 - я так понимаю переводится в двоичный код и сравниваются побитого, значит в ах будет 5? и непонятно зачем это вообще делали
imul dx,ax,5 - 5 умножается на 5 и записывается в dx, dx = 25, непонятно зачем
add dx,offset roman-'1'*5 - добавить к 25 строку??? и что вообще происходит
дальше просто вывод я так понимаю
  • Вопрос задан
  • 195 просмотров
Решения вопроса 1
@User700
Вызывается int 16h с кодом ф-ии 0 (xor ax,ax это ax:=0). Это чтение символа с клавиатуры. Далее в ax оставляется только бладший байт (он же AL, AH очищается =0) (and ax, 0000000011111111b (=255)). В AL будет код символа. Умножается на 5 и прибавляется к смещению в начале строки с вычетом смещения для нажатия 1 (т.е. в случае нажатия 1 будет получено начальное смещение этой строки, при 2 - по идеи начальное смещение плюс 5 и т.д.). С учётом, что строка это соединённые 5 строк по 5 символов, а символ '$' сигнализирует конец вывода (для ф-ии 09 сервиса DOS), будет получен адрес строки с римским обозначением введённой цифры (по идеи). Далее она выводится ф-ией 9 прерывания int 21h.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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