2014-12-06 6 views
1

bios 인터럽트 0x10을 사용하여 문자열을 인쇄하고 싶습니다. 하지만 나는 편지에 글자가없는 단지 푸른 사자를 얻는다. 어쩌면 내 끈을 두드리는 것으로 문제를 일으킬 수 있습니다.bios 인터럽트가있는 인쇄 문자열 0x10

편집 : 두 개의 코드 파일이 있습니다. 첫 번째는 플로피의 첫 번째 섹터에 기록됩니다. 플로피의 두 번째 섹터를 메모리 (0x5000에서 시작)로 복사하고 0x5000으로 점프합니다. 두 번째 파일은 내 문자열을 인쇄해야합니다.

[BITS 16] 
org 0x5000 

sect2: 
    mov ah, 0x03 ;get curser position 
    mov bh, 0x00 ;page number 

    int 0x10 

    mov ax, 0x0500 
    mov es, ax 
    mov bp, bsy1msg 

    mov ah, 0x13   ;write string 
    mov al, 0x01   ;update cursor after writing 
    mov bh, 0x00   ;page number 
    mov bl, 0x1F   ;atributes 
    mov cx, bsy1len   ;number of characters in string 

    int 0x10 

end: 
    jmp end 

bsy1msg db 13,10,"BSY1 via INT 0x10" 
bsylen equ $ - bsy1msg 
+0

ES를로드하려면 해당 상수 대신'mov ax, cs'를 시도하십시오. 나는 당신의 가정이 유효하다는 것을 전적으로 확신하지는 않습니다. – usr2564301

+0

with 'mov ax, cs'나는 같은 결과를 얻는다. – spitzbuaamy

+0

'org 0x5000'과 함께 뭔가 있을까? – spitzbuaamy

답변

1

org 지시어는 프로그램이 특정한 물리적 주소를로드 할 수있는 발생하지 않습니다, 그것은 프로그램이로드되어 있다고 가정하도록 어셈블러에 알려 멀리 코드 세그먼트에.

예를 들어, sect2의 값은 0이 아니며, 0x5000입니다.

es에서 0x500으로 설정하면 실제 주소 05000에서 시작되지만 프로그램이있는 위치가 아닙니다. bsy1msg 레이블은 코드 세그먼트와 관련이 있으므로 코드 세그먼트와 동일한 지점에서 추가 세그먼트를 시작하려고합니다 (올바르게 계산 된 경우 값은 0x501d입니다).

push cs 
pop es 
+0

내 프로그램은 0x5000에 있습니다. 전체 초보자로서이 질문을 내 질문에 추가하는 것을 잊어 버렸습니다. – spitzbuaamy

+1

@spitzbuaamy : 그러면 'es'는 여전히 'cs'와 동일해야합니다 (예 : 0). – Guffa

1

어드레스는 segment:offset로 표현되고, 물리 어드레스는 segment*16+offset 같이 계산된다. 따라서 0x0500:00:0x5000과 동일한 실제 주소를 나타냅니다. 프로그램이 실제 주소 0x5000에있는 경우 CS:IP0x0500:0 또는 0:0x5000이어야합니다. 문자열은 실제 주소 0x501d에 있습니다. org 0x5000을 지정하기 때문에 nasm은 bsy1msg의 오프셋을 0x501d로 가정합니다. 즉, 세그먼트는 0 (0*16+0x501d = 0x501d)이어야합니다. 또는 ES를 0x0500 (직접 또는 CS를 복사하여)로 설정 한 경우 올바른 실제 주소 (0x0500*16+0x001d = 0x501d)를 얻으려면 org 0x5000을 생략하거나 BP (mov bp,bsy1msg-sect2)의 오프셋을 뺍니다.