If/else в ассемблере - Assembler
Формулировка задачи:
День добрый, есть небольшой вопрос.
Сегодня решил поучиться работать с if/else в асм, но что-то, вот, не получилось...
Вот код:
Асм начал изучать позавчера, поэтому для меня сложновато :3
Компилирую NASM'ом
begin:
textnow db 1
mov cx,3
showText:
mov ax,9
sh1:
mov dx,offset message1
message1 db 'Hello!',0
sh2:
mov dx,offset message2
message2 db 'My name is Assembler',0
sh3:
mov dx,offset message3
message3 db 'I have a big functional, but very hard!!!',0
cmp textnow,1
je sh1,
cmp textnow,2
je sh2
cmp textnow,3
je sh3
int 21h
int 20h
inc textnow
loop showTextРешение задачи: «If/else в ассемблере»
textual
Листинг программы
org 100h begin: mov cx, 3 showText: mov dx, message1 cmp byte [textnow], 1 je show mov dx, message2 cmp byte [textnow], 2 je show mov dx, message3 show: mov ah, 9 int 21h inc byte [textnow] loop showText int 20h textnow db 1 message1 db 'Hello!',13,10,'$' message2 db 'My name is Assembler',13,10,'$' message3 db 'I have a big functional, but very hard!!!',13,10,'$'
Объяснение кода листинга программы
- Задается начальный адрес кода –
org 100h. - Создается метка
begin:для начала выполнения программы. - Загружается значение 3 в регистр cx –
mov cx, 3. - Создается метка
showText:для отображения текста. - Загружается адрес строки
message1в регистр dx –mov dx, message1. - Выполняется сравнение значения, находящегося в ячейке памяти
textnow, с 1 –cmp byte [textnow], 1. - Если условие равенства выполняется, то отображается сообщение –
je show. - Иначе, загружается адрес строки
message2в регистр dx и также выполняется сравнение значенияtextnowс 2 –mov dx, message2иcmp byte [textnow], 2. - Если условие равенства выполняется, то отображается соответствующее сообщение.
- В противном случае отображается сообщение из строки
message3. - Загружается значение 9 в регистр ah для вызова функции вывода строки –
mov ah, 9. - Вызывается прерывание 21h для вывода сообщения на экран.
- Увеличивается содержимое ячейки памяти
textnowна 1 –inc byte [textnow]. - Происходит циклический повтор отображения текста указанное количество раз, определяемое изначально цифрой, загруженной в регистр cx –
loop showText. - Вызывается прерывание 20h для завершения программы.
- Объявляется переменная
textnowи присваивается значение 1 –textnow db 1. - Объявляются строки сообщений
message1,message2иmessage3с соответствующими текстами, завершенными символами перехода на новую строку и завершения строки –db 'Hello!',13,10,'$',db 'My name is Assembler',13,10,'$',db 'I have a big functional, but very hard!!!',13,10,'$'. - Вся программа заканчивается.