Вывод Hello World в цикле 10 раз - Assembler

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

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

Задача: Модифицировать текст программы так, чтобы надпись выводилась на экран 10 раз. Указание: для выполнения задачи достаточно добавить LOOP в нужном месте, при этом не требуется детально разбираться с текстом программы. Если не сложно поясните вкратце код...
! Simple "hello world" program
! See section 9.8.1.
 
    _EXIT   = 1     !  1
    _WRITE  = 4     !  2
    _STDOUT = 1     !  3
.SECT .TEXT         !  4
start:              !  5
    MOV CX,de-hw    !  6
    PUSH    CX      !  7
    PUSH    hw      !  8
    PUSH    _STDOUT     !  9
    PUSH    _WRITE      ! 10
    SYS         ! 11
    ADD SP,8        ! 12
    SUB CX,AX       ! 13
    PUSH    CX      ! 14
    PUSH    _EXIT       ! 15
    SYS         ! 16
.SECT .DATA         ! 17
hw:             ! 18
.ASCII  "Hello World\n"     ! 19
de: .BYTE   0       ! 20
.SECT .BSS
Все мои попытки были неудачны...Там CX не уменьшается и происходит зацикливание.Вот мой код.
! Simple "hello world" program
! See section 9.8.1.
 
    _EXIT   = 1     !  1
    _WRITE  = 4     !  2
    _STDOUT = 1     !  3
.SECT .TEXT         !  4
        MOV CX, 10
start:              !  5
    MOV CX,de-hw    !  6
    PUSH    CX      !  7
    PUSH    hw      !  8
    PUSH    _STDOUT     !  9
    PUSH    _WRITE      ! 10
    SYS         ! 11
        LOOP start
    ADD SP,8        ! 12
    SUB CX,AX       ! 13
    PUSH    CX      ! 14
    PUSH    _EXIT       ! 15
    SYS         ! 16
.SECT .DATA         ! 17
hw:             ! 18
.ASCII  "Hello World\n"     ! 19
de: .BYTE   0       ! 20
.SECT .BSS

Решение задачи: «Вывод Hello World в цикле 10 раз»

textual
Листинг программы
! Simple "hello world" program
! See section 9.8.1.
 
    _EXIT   = 1     !  1
    _WRITE  = 4     !  2
    _STDOUT = 1     !  3
.SECT .TEXT         !  4
      MOV CX, 10 ; до цикла счётчик зарядил правильно
start:              !  5
push cx ; только его нужно сныкать в стек потому что дальше будет
    MOV CX,de-hw    !  6 ; хуерга которая перебивала твой счётчик
    PUSH    CX      !  7
    PUSH    hw      !  8
    PUSH    _STDOUT     !  9
    PUSH    _WRITE      ! 10
    SYS         ! 11
pop cx ; а тут мы извлекаем счётчик из стека, а не минусуем ту хуергу что косорезит сразу после старта
        LOOP start 
    ADD SP,8        ! 12
    SUB CX,AX       ! 13
    PUSH    CX      ! 14
    PUSH    _EXIT       ! 15
    SYS         ! 16
.SECT .DATA         ! 17
hw:             ! 18
.ASCII  "Hello World\n"     ! 19
de: .BYTE   0       ! 20
.SECT .BSS

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

  1. Объявлены три переменные: _EXIT = 1, _WRITE = 4, _STDOUT = 1.
  2. Установлены сегменты для текста и данных.
  3. В цикле, который выполняется 10 раз, выводится Hello World\n с помощью функции _WRITE, которая указывает на переменную hw.
  4. Стек используется для сохранения и последующего восстановления счётчика цикла.
  5. В начале цикла счётчик CX устанавливается в 10.
  6. Перед рекурсивным вызовом функции, на вершину стека кладутся CX и hw.
  7. Функция _WRITE вызывается с параметрами CX и hw.
  8. После вызова функции, стек восстанавливается, и цикл продолжается.
  9. После выполнения цикла, в стеке остаётся только CX.
  10. По CX находится адрес строки Hello World\n.
  11. Вызывается функция _WRITE с параметрами CX и _EXIT.
  12. В конце программы, в стеке остаётся только CX.
  13. Выполняется команда SYS, которая завершает выполнение программы.

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


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

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

11   голосов , оценка 3.545 из 5
Похожие ответы