Сборка вывода (я не понял)
Я хочу напечатать одну строку computer
на экране
Но мой вывод отображает строку дважды так:
computercomputer
Мой код:
data segment
mesaj db "computer$"
ends
stack segment
dw 128 dup(0)
ends
code segment
start:
mov ax,@data
mov ds,ax
call ekransil
lea dx,mesaj
call yaz
yaz proc
mov ah,09
int 21h
ret
yaz endp
ekransil proc ;create procedur
mov ax,0600h
mov bh,74h
mov cx,0000h
mov dx,184fh
int 10h
ret
ekransil endp
int 20h
end start ;finish program
Почему значение, отображаемое в сегменте данных, печатается дважды? Я не понимаю Кто-нибудь, помогите мне.
2 ответа
Какую следующую инструкцию выполнить после этой call yaz
? Следующие инструкции будут выполнены
mov ah,09
int 21h
ret
следовательно, вы получили 2x "компьютерное" слово. После этой строки call yaz
Вы должны прыгать в конце программы или ret
вызов.
Ты видел это?
call ekransil
lea dx,mesaj
call yaz
; next instructions to execute are below
yaz proc
mov ah,09
int 21h
ret
yaz endp
Чтобы не отображать вашу строку дважды, вы можете выполнить одно из следующих действий:
Обычно Путь:
добавлять jmp exit
после call yaz
а затем добавить эти строки перед end start
:
exit:
mov ah, 04ch ; exit the program
int 21h ; and return the control to your OS
Предпочитаемый путь:
или вы можете просто поместить определения обеих ваших процедур после кода выхода следующим образом:
mov ah, 04ch ; exit
int 21h ; code
yaz proc ; definition of first procedure
mov ah,09
int 21h
ret
yaz endp
ekransil proc ; definition of second procedure
mov ax,0600h
mov bh,74h
mov cx,0000h
mov dx,184fh
int 10h
ret
ekransil endp
end start ; finish program
Обратите внимание, что в предпочтительной версии нам не нужно jmp
маркировать exit
и определить это. Он предпочтительнее, чем первый, потому что он делает вашу программу менее запутанной, и у вас будут все определения ваших процедур отдельно от основной процедуры (начало). Кроме того, это становится очень полезным для отладки.
Ура Ахтишам:)