어셈블리에서 선언 된 문자열을 반복하고 BIOS 인터럽트를 사용하여 인쇄 할 수있는 함수를 정의해야합니다. 16 비트 리얼 모드입니다. 이것은 교과서에서 약간의 부트 로더를 작성하는 연습이지만, 이는 초안 일 뿐이며 일부 물건이 누락 된 것으로 보입니다.미리 정의 된 함수를 사용하지 않고 어셈블리에서 문자열 인쇄
이org 0x7c00
mov bx, HELLO_MSG
call print_string
mov bx, GOODBYE_MSG
call print_string
jmp $ ;hang so we can see the message
%include "print_string.asm"
HELLO_MSG:
db 'Hello, World!', 0
GOODBYE_MSG:
db 'Goodbye!', 0
times 510 - ($ - $$) db 0
dw 0xaa55
내 print_string.asm은 다음과 같습니다 : 다음 코드를 주어졌다
print_string:
pusha
mov ah, 0x0e
loop:
mov al, bl
cmp al, 0
je return
int 0x10
inc bx
jmp loop
return:
popa
ret
내가 뭘하는지 몇 가지 아이디어를 가지고 있지만,이 책은 어떻게 설명 할 수 없다 무언가를 반복 할 수 있습니다. C 언어로하는 방법을 알고 있지만, C 코드를 디버깅하는 것 이외의 다른 방법으로 어셈블리를 사용하는 것은 이번이 처음입니다. 에뮬레이터를 통해 부팅 할 때 두 줄의 횡설수설이 나오고 결국에는 실패로 끝나는 것을 볼 수 있습니다. 하하.
감사합니다. 다른 어드레싱 모드가 어떻게 작동하는지 아직도 혼란 스럽다. 'op register'는 값을 직접 사용하는 것으로 보이며 'op [register]'는 "이 레지스터의 번호를 주소로 사용하십시오"라고 말합니다. – Hugo
@Steven, 우연히도, 나는 OP에서 사용한 것과 같은 책을 사용하고 있습니다. 나는 또한 같은 일에 붙어 있고 이전에 구문을 시도했다. -'mov al, [bx]'. 그러나 NASM은 해당 라인에서 컴파일 오류 (잘못된 유효 주소)를 제공하고 있습니다. –