Одна и та же процедура то работает, то нет - Assembler

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

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

Доброго времени суток.
Изучаю MASM по книге Ирвина Кипа. Выполняю практическое задание. Первые 5 заданий выводятся нормально, а вот в 6 (вывести 7 первых чисел Фиббоначи) просто выскакивает "Press ENTER..." Когда запустил через отладчик, выяснилось, что

макрос newline

, который до этого 5 раз

нормально работал, теперь не переносит курсор

на новую сроку! source:
TITLE 4-7
INCLUDE bear.inc
.data
  task byte '4.7.0',0
.code
  main PROC
    xor eax,eax
    mov edx,offset task    
                    ;4.7.1
    inc byte ptr task[4]
    call writestring
    newline
    mov al,0FFh
    add al,1
    call dumpregs
    sub al,2
    call dumpregs
    sub al,2
    call dumpregs
    call waitmsg
    call clrscr
                    ;4.7.2
    inc byte ptr task[4]
    call writestring
    newline
    mov al,0
    dec al
    call dumpregs
    call waitmsg
    call clrscr
                    ;4.7.3
    inc byte ptr task[4]
    call writestring
    newline
    add al,1
    call dumpregs
    sub al,2
    call dumpregs
    call waitmsg
    call clrscr
                    ;4.7.4
    inc byte ptr task[4]
    call writestring
    newline
    mov al,0FFh
    add al,80h
    call dumpregs
    mov al,20h
    add al,0F0h
    call dumpregs
    call waitmsg
    call clrscr
                    ;4.7.5
    inc byte ptr task[4]
    call writestring
    newline
  .data
    Uarray dword 1000h,2000h,3000h,4000h
    Sarray sdword -1,-2,-3,-4
  .code
    push edx
    mov eax,[Uarray]
    mov ebx,[Uarray + 4]
    mov ecx,[Uarray + 8]
    mov edx,[Uarray + 12]
    call dumpregs
    mov eax,[Sarray]
    mov ebx,[Sarray + 4]
    mov ecx,[Sarray + 8]
    mov edx,[Sarray + 12]
    call dumpregs
    pop edx
    call waitmsg
    call clrscr
                    ;4.7.6
    inc byte ptr task[4]
    call writestring
    newline
    mov eax,1
    mov ebx,1
    mov edx,0
    mov ecx,7
    L1:
      call writeinc
      newline
      mov eax,ebx
      add eax,edx
      mov edx,ebx
      mov ebx,eax
    LOOP L1
    call waitmsg
         
    exit
  main ENDP
END main
В архиве лежат INCLUDE и LIB Заранее спасибо

Решение задачи: «Одна и та же процедура то работает, то нет»

textual
Листинг программы
newline macro
ifndef  crlf 
crlf:   push    ax
    mov ax,0D0Ah
    int 29h
    xchg    ah,al
    int 29h
    pop ax
    ret
else
    call    crlf
endif
endm

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

  1. Объявлена макроcубстанция crlf, которая будет использоваться для формирования символа переноса строки.
  2. Если данная макроcубстанция не определена (т.е. ifndef crlf), то выполняется следующий блок кода:
    • Push строка регистров AX на стек.
    • Перемещение значения регистра AX в 0D0Ah.
    • Вызов прерывания 29h для вывода символа.
    • Обмен значениями регистра AH и AL.
    • Вызов прерывания 29h для вывода символа.
    • Pop строка регистров AX из стека.
    • Возврат из процедуры.
  3. Если макроcубстанция crlf уже определена (т.е. ifdef crlf), то выполняется другой блок кода:
    • Вызов процедуры crlf.
  4. Завершается объявление макроса crlf.

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


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

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

8   голосов , оценка 4 из 5