단일 단어 (2 바이트)를 비교할 때 CMP
명령에 문제가 있습니다. 안녕하세요x86 CMP 명령이 단일 단어 비교를 위해 작동하지 않습니다.
다음 밖으로
print_string: pusha mov ah, 0x0e loop: call print_char cmp word [bx], 0 jne loop popa ret print_char: mov al, [bx] int 0x10 add bx, 1 ret
이 코드를 인쇄 :
[org 0x7c00] mov bx, HELLO_MSG call print_string mov bx, GOODBYE_MSG call print_string jmp $ %include "print_string.asm" ; Data HELLO_MSG: db 'Hello, World!', 0 GOODBYE_MSG: db 'Goodbye!', 0
이것은 print_string.asm 파일은 다음과 같습니다
다음 내 main.asm입니다 세계! 안녕! 안녕!
나는 내가 HELLO_MSG과 GOODBYE_MSG 사이에
db 0
를 추가 할 때 의도 한대로 코드가 작동하는지 알고있다. 누구든지 CMP
이 문자열 사이에 0의 4 바이트가있을 때만 작동하는 이유를 설명 할 수 있습니까? 사람이 컴파일 된 출력에서 찾고에 관심이 있다면
, 여기있다 : 나는 부트 로더로이 코드를 사용하고 있기 때문에
bb 23 7c e8 08 00 bb 31 7c e8 02 00 eb fe 60 b4
0e e8 07 00 83 3f 00 75 f8 61 c3 8a 07 cd 10 83
c3 01 c3 48 65 6c 6c 6f 2c 20 57 6f 72 6c 64 21
00 47 6f 6f 64 62 79 65 21 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
*
00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa
끝에 55 aa
가 내 옆에 추가됩니다.
주소'bx'에서 시작하는 2 바이트를 비교하는'cmp word [bx], 0'을하고 있습니다. 당신은 아마도 단일 바이트를 비교하기를 원할 것입니다. 'cmp byte [bx], 0' –
또한 세그먼트 레지스터와 스택 등을 올바르게 설정하는 것이 좋습니다. [일반 부트 로더 팁] (http://stackoverflow.com/a/)이 Stackoverflow 답변에 몇 가지 팁을 제공합니다. 32705076/3857942) –
또한 print_string에 _BX_ 이외의 레지스터를 사용할 수도 있습니다. [_Int 10/AH = 0Eh_] (http://www.ctyme.com/intr/rb-0106.htm)는 쓸 페이지 번호로 _BH_를 사용합니다. 0으로 설정하려고합니다. 즉, _BX_ 이외의 레지스터를 문자열 포인터로 사용해야합니다. 아마 _SI_ 대신. –