Одна и та же процедура то работает, то нет - 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
Решение задачи: «Одна и та же процедура то работает, то нет»
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
Объяснение кода листинга программы
- Объявлена макроcубстанция
crlf
, которая будет использоваться для формирования символа переноса строки. - Если данная макроcубстанция не определена (т.е.
ifndef crlf
), то выполняется следующий блок кода:- Push строка регистров AX на стек.
- Перемещение значения регистра AX в 0D0Ah.
- Вызов прерывания 29h для вывода символа.
- Обмен значениями регистра AH и AL.
- Вызов прерывания 29h для вывода символа.
- Pop строка регистров AX из стека.
- Возврат из процедуры.
- Если макроcубстанция
crlf
уже определена (т.е.ifdef crlf
), то выполняется другой блок кода:- Вызов процедуры
crlf
.
- Вызов процедуры
- Завершается объявление макроса
crlf
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д