2013-06-26 2 views
3

어셈블리를 배우고 있으며 물론 고전적인 0x10 BIOS 인터럽트를 실험하고 있습니다. 내가 보았던 자료는 문자열을 출력하기 위해 lodsb을 사용하여 보여 주므로, opcode를 이해하기 위해 나는 그것의 동작을 모방하려고합니다. 이것은 lodsb과 잘 작동하지만, 가지고있는 것과는 다릅니다. 내가 잘못 뭐하는 거지?bios 인터럽트를 통해 인쇄 할 문자열 얻기

 
start: 
    mov ah, 0Eh ;for bios interrupt 
    mov si, text_string ;set source index to begining of text_string 

.repeat: 
    ;I'm trying to emulate the behavior of lodsb to learn how it works: 
    mov al, [si] ;put character at si in al register 
    add si, 1 ;increment source index 

    cmp al, 0 ;if the character is a zero (end of the string) 
    je done ;end execution 

    int 10h ;bios interrupt to put character on screen 
    jmp .repeat 

    text_string db 'Hello, World!', 0 

done: 
    ret 

답변

5

그것은 아니에요 일반적으로 좋은 생각에 :

  1. 가 (정말, 또는 통화) 모든 레지스터는 인터럽트 호출에 걸쳐 유지되는 것을 가정; 또는
  2. 주어진 통화에 필요한 모든 레지스터를 설정하지 않았습니다.

첫 주에, 나는 즉시 int 10 전에 ah0eh에를 설정합니다.

Int 10h/0eh은 페이지 번호와 전경색을 각각 bhbl으로 설정해야합니다. 전화가 올바르게 설정되도록 int 10 직전에이 작업을 수행합니다. 당신이 당신의 코드 세그먼트에 문자열을 넣고있는 것처럼 보이는 때문에

push cs 
pop ds 

: 여담으로


, 당신은 ds 세그먼트 레지스터는 같은과, 올바른지 확인해야합니다. 그러나, lodsb 버전이 분명히 작동하기 때문에, 나는 당신이 그것을 커버했다고 가정합니다. (일반적으로 인정 하듯이 퇴색) 메모리에서

그리고는, 8086은 더 이상 그 많은 중요하지 않는 것이, 작은 공간을 절약 할 가능성이있는 inc si 명령을 가지고 있지만 모든 바이트가

:-) 계산 시간에 위조했다
0

처음 lodsb은 컴퓨터에 코드에서 문자를 가져오고 오프셋을 증가시키는 명령입니다. 오프셋은 쉽게 설정할 수있는 레지스터 인 [SI]에 의해 결정됩니다. 일단 SI가 설정되면 lodsb는 char을 가져 와서 그것을 ll로 lode합니다. 독서에이 시점에서 그리고 무엇을 해야할지 결정. 이런 또 다른 질문이 있습니다 here.

관련 문제