2015-01-18 1 views
1

nasm에 부트 로더를 작성하는 순간, 문자열을 출력하는 순간입니다.nasm bootloader, 왜 내가 문자열 문제를 정의합니까?

[BITS 16] 
 
[org 0x7c00] 
 

 
mov bp, 0x8000 
 
mov sp, bp 
 

 
myString: 
 
\t db 'Hello World', 0x00 
 

 
mov bx, myString 
 
call printString 
 

 
jmp $ 
 

 
printString: 
 
\t pusha 
 
\t mov ah , 0x0e 
 
\t printStringA: 
 
\t 
 
\t mov al , [bx] 
 
\t cmp al, 0x00 
 
\t je printStringB 
 
\t 
 
\t int 0x10 
 
\t add bx, 0x01 
 
\t jmp printStringA 
 
\t 
 
\t printStringB: 
 
\t popa 
 
\t ret 
 

 
times 510 -($ - $$) db 0 
 
dw 0xaa55

이 메신저는 Bochs와이 실행, 쓰레기를 출력 : 잘 작동하지만 내가 여기에 문자열 정의를 이동하는 경우

[BITS 16] 
 
[org 0x7c00] 
 

 
myString: 
 
\t db 'Hello World', 0x00 
 

 
mov bp, 0x8000 
 
mov sp, bp 
 

 
mov bx, myString 
 
call printString 
 

 
jmp $ 
 

 
printString: 
 
\t pusha 
 
\t mov ah , 0x0e 
 
\t printStringA: 
 
\t 
 
\t mov al , [bx] 
 
\t cmp al, 0x00 
 
\t je printStringB 
 
\t 
 
\t int 0x10 
 
\t add bx, 0x01 
 
\t jmp printStringA 
 
\t 
 
\t printStringB: 
 
\t popa 
 
\t ret 
 

 
times 510 -($ - $$) db 0 
 
dw 0xaa55

그게 도움이된다면 창문 밑에.

+0

생각해 보면 ive가 생각한 것만 큼 프로세서는 아마도 문자열이 코드라고 생각하고 그것을 실행하고 엉망으로 만드는 코드 일 것입니다. 만약 내가 문자열 정의를 결코 끝나지 않는 루프로 이동 시킨다면, 그 모든 좋은 것 –

답변

1

원시 기계 코드로 어셈블됩니다. 데이터 섹션과 텍스트 섹션은 없습니다. 모든 것은 db로 삽입 한 것을 포함하여 코드로 해석됩니다. 따라서 모두 코드 스 니펫이 잘못되었습니다.

무한 루프 (예에서와 같이) 또는 중지 명령을 완료하면 코드에 도달하지 않아도 데이터를 안전하게 저장할 수 있습니다. 그렇지 않으면 건너 뛸 데이터를 준비해야합니다.

또한 시작시 세그먼트 레지스터를 올바르게 설정해야합니다. 첫 번째 예에서, 데이터를 코드로 해석되었다

[BITS 16] 
[org 0x7c00] 

;;; Set CS and DS 
jmp 0:start 

start: 
mov ax, cs 
mov ds, ax 

;;; set SP  
mov bp, 0x8000 
mov sp, bp 

;;; skip over data 
jmp L1 

myString: 
    db 'Hello World', 0x00 

L1: 

mov bx, myString 
... 

참고 : 여기에

데이터의 초기 선언, 수정 된 버전입니다.
db 'Hello World', 0x00 

48 65 6c 6c 6f 20 57 6f 72 6c 64 00 

로 조립에 해당됩니다 :이 코드 전에 실행됩니다 실제로

dec ax 
gs insb 
insb 
outsw 
and [bx+0x6f],dl 
jc short 0x76 
fs 
db 0x00 

. 이 조각이 코드가 작동하지 못하게하는 것은 순수한 행운입니다.