2017-04-27 1 views
2

단일 단어 (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_MSGGOODBYE_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가 내 옆에 추가됩니다.

+5

주소'bx'에서 시작하는 2 바이트를 비교하는'cmp word [bx], 0'을하고 있습니다. 당신은 아마도 단일 바이트를 비교하기를 원할 것입니다. 'cmp byte [bx], 0' –

+0

또한 세그먼트 레지스터와 스택 등을 올바르게 설정하는 것이 좋습니다. [일반 부트 로더 팁] (http://stackoverflow.com/a/)이 Stackoverflow 답변에 몇 가지 팁을 제공합니다. 32705076/3857942) –

+1

또한 print_string에 _BX_ 이외의 레지스터를 사용할 수도 있습니다. [_Int 10/AH = 0Eh_] (http://www.ctyme.com/intr/rb-0106.htm)는 쓸 페이지 번호로 _BH_를 사용합니다. 0으로 설정하려고합니다. 즉, _BX_ 이외의 레지스터를 문자열 포인터로 사용해야합니다. 아마 _SI_ 대신. –

답변

3

워드가 2 바이트를 포함해야하기 때문에 CMP 명령어가 단일 워드 비교를 위해 작동하지 않는 이유가 있습니다.

cmp byte [bx], 0 

나는 컴파일 된 출력 형식 가정의 실수를 : 컴파일 된 출력은 1 바이트가 두 개의 메시지 사이에 있다는 것을 표시하기 때문에 바이트 단어에서 CMP 명령의 크기를 변경해야합니다 그러나, Michael Petch의 다음 주석의 도움으로 :

라인 4는 00으로 시작합니다. 6f 6f (공백으로 분리 된) 값은 각각 2 개가 아닌 1 바이트입니다 바이트. 00은 2 바이트가 아닌 0의 단일 바이트입니다.

실수를 실현할 수있었습니다.

+0

➕1입니다. –

관련 문제