2017-03-08 1 views
2

https://github.com/cfenollosa/os-tutorial/tree/master/05-bootsector-functions-strings에서 배우면서, 나는 나 자신의 부트 섹터를 작성하려고 노력해왔다.NASM 인스트럭션 시퀀스

현재 주어진 문자열을 인쇄하려고합니다.

boot_main.asm

print: 
    pusha 

start: 
    mov al, [bx] 
    cmp al, 0 
    je done 

    mov ah, 0x0e 
    int 0x10 

    add bx, 1 
    jmp start 

done: 
    popa 
    ret 

print_nl: 
    pusha 
    mov ah, 0x0e 
    mov al, 0x0a 
    int 0x10 
    mov al, 0x0d 
    int 0x10 

    jmp done 

지금이 스크린에 완벽하게 인쇄합니다 "HI"작동

[org 0x7c00] 

mov bx, hello 
call print 
jmp $ 

hello db 'HI', 0 

%include "boot_print.asm" 

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

boot_print.asm :

내 두 개의 파일입니다. 하지만 지시문을 처음으로 옮기면 hello db 'HI', 0이됩니다. boot_main.asm

[org 0x7c00] 

hello db 'HI', 0 

mov bx, hello 
call print 
jmp $ 

%include "boot_print.asm" 

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

이 전혀 아무것도 인쇄하지

즉. 저는이 둘의 차이를 이해하려고 노력하고 있습니다. 어떤 도움이 필요합니까?

답변

3

어셈블러는 소스 파일에 쓰는 위치에 따라 메모리에 내용을 넣습니다. org 지시문 뒤에 처음에 넣으면 HI\0 문자열이 배치되고 CPU는 마치 코드 인 것처럼 실행합니다 (의미없는 작업을 수행하고 오류 발생 가능성이 있음).

원래의 코드 대신 문자열이 jmp $ 뒤에 있으며 명령 포인터가 도달하지 않는 위치에 안전하게 저장됩니다.

당신은 CPU가 다시 작동하기 시작 것을 볼 수 있습니다 문자열 회피하기 위해 코드를 수정하는 경우 : 다시

[org 0x7c00] 
    jmp real_start 
    hello db 'HI', 0 
real_start: 
    mov bx, hello 
    call print 
    jmp $ 
    %include "boot_print.asm" 
    times 510 - ($ - $$) db 0 
    dw 0xaa55 

을, 이것이 당신이 db 정말 마술 아무것도하지 않는 것을 생각하면 분명하게 문자열에 관해서는 출력 바이너리에서 임의의 바이트를 출력하는 위치에 출력합니다. CPU를 실행 경로에 써 넣으면 CPU가 그 위에 실행하게됩니다. CPU를 뛰어 넘으면 CPU를 피할 수 있습니다.

+1

귀하의 예를 들어, 회피와 케이크에 입힌, 감사합니다, 감사합니다! :) –

+1

@KarthikNayak : 다행스럽게 도와 줬어! 흥미롭게도, 위치 데이터와 혼합 된 데이터를 가로 지르는 코드는 위치 독립적 코드를 생성 할 때 실제로 "실제 상황"에서 사용됩니다. 그러나 작지만 크기는 작지만 즉각적인 결과를 얻을 수는 없지만 여전히 혜택을 누릴 수있는 데이터가있는 경우 그것을 사용하는 감기와 함께 캐시에 이미 있습니다. –

+0

주제에서 벗어나 프로필에서 농담을 설명해 주시겠습니까? –