NASM 어셈블러에 대한 x86 어셈블리 코드를 다음과 같이 작성했습니다.
hello.asm
[org 0x7c00]
mov bx, HELLO_MSG
call print_string
mov bx, GOODBYE_MSG
call print_string
jmp $
%include "print_string.asm"
HELLO_MSG:
db 'hello, world',0
GOODBYE_MSG:
db 'good bye',0
times 510-($-$$) db 0
dw 0xaa55
print_string.asm
print_string:
mov ah, 0x0e
push bx
loop:
cmp WORD [bx], 0
je end
mov al, [bx]
int 0x10
inc bx
jmp loop
end:
pop bx
ret
bochs 2.2.6 에뮬레이터에서 코드를 실행했습니다.
예상되는 outpur
안녕 세상
내가 얻는 출력
안녕 세상 안녕 안녕 안녕
왜 good bye
두 번 인쇄됩니까? 또한 뒤에 추가 공간이 있음을 확인하십시오 hello, world
. 어디에서 오는가? 주의 : 하나의 문자열 코드 만 인쇄하면 정상적으로 작동합니다.
당신의 문제는 라인에서 나옵니다
cmp WORD [bx], 0
이것은 "bx가 가리키는 주소에있는 단어를 0과 비교하라"는 의미입니다. 그러나보고있는 문자열은 단어가 아닌 바이트로 구성됩니다. 이 비교가 성공하려면 둘 다 0을 포함하는 행 (일명 단어)에서 2 바이트를 찾아야합니다.
이것은 HELLO_MSG의 끝에서 발생하지 않으므로에서 마침내 쌍을 찾을 때까지 문자를 계속 인쇄하고 다음 문자열 (GOODBYE_MSG)을 통과합니다 times 510-($-$$) db 0
.
이것은 또한 실제로 HELLO_MSG 끝에 0을 인쇄하기 때문에 표시되는 추가 공간을 설명합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다