If/else в ассемблере - Assembler

Узнай цену своей работы

Формулировка задачи:

День добрый, есть небольшой вопрос. Сегодня решил поучиться работать с if/else в асм, но что-то, вот, не получилось... Вот код:
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
Асм начал изучать позавчера, поэтому для меня сложновато :3 Компилирую NASM'ом

Решение задачи: «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,'$'

Объяснение кода листинга программы

  1. Задается начальный адрес кода – org 100h.
  2. Создается метка begin: для начала выполнения программы.
  3. Загружается значение 3 в регистр cx – mov cx, 3.
  4. Создается метка showText: для отображения текста.
  5. Загружается адрес строки message1 в регистр dx – mov dx, message1.
  6. Выполняется сравнение значения, находящегося в ячейке памяти textnow, с 1 – cmp byte [textnow], 1.
  7. Если условие равенства выполняется, то отображается сообщение – je show.
  8. Иначе, загружается адрес строки message2 в регистр dx и также выполняется сравнение значения textnow с 2 – mov dx, message2 и cmp byte [textnow], 2.
  9. Если условие равенства выполняется, то отображается соответствующее сообщение.
  10. В противном случае отображается сообщение из строки message3.
  11. Загружается значение 9 в регистр ah для вызова функции вывода строки – mov ah, 9.
  12. Вызывается прерывание 21h для вывода сообщения на экран.
  13. Увеличивается содержимое ячейки памяти textnow на 1 – inc byte [textnow].
  14. Происходит циклический повтор отображения текста указанное количество раз, определяемое изначально цифрой, загруженной в регистр cx – loop showText.
  15. Вызывается прерывание 20h для завершения программы.
  16. Объявляется переменная textnow и присваивается значение 1 – textnow db 1.
  17. Объявляются строки сообщений 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,'$'.
  18. Вся программа заканчивается.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.273 из 5