[英]JMPing to 0x7C00 in bootloader does not cause infinite loop
我正在創建一個引導加載程序,並想通過跳轉到地址 0x7C00 來創建一個無限循環。
由於引導加載程序加載到 0000:7C00,我希望當我調用JMP 0x7C00
時,代碼將 go 到程序的開頭。 除了它調用代碼一次,就是這樣。
這是我的代碼:
1 BITS 16
2 ORG 0x7C00
3
4 MOV AX, 0
5 MOV DS, AX
6 MOV SI, 0x7C00
7
8 LEA BX, [msg]
9
10 printMsg:
11 MOV AL, [BX]
12 INC BX
13 CMP AL, 0
14 JZ return
15 CALL printc
16 JMP printMsg
17 JMP 0x7C00
18
19 printc:
20 MOV AH, 0Eh
21 int 10h
22 RET
23
24 return:
25 RET
26
27
28 msg: db "Hello",0
29
30 times 510-($-$$) db 0x90
31 dw 0xAA55
我還嘗試在第 3 行創建start
label 並在第 17 行創建CALL start
或JMP start
。但這似乎都不起作用。
您不call printMsg
,因此返回時的RET
return:
將無處可至 go。 此外,您的jmp 0x7c00
位於錯誤的位置,無法訪問。
此外,正如彼得所說,您不能保證擁有CS:IP = 0000:7C00
它可能是07C0:0000
,具體取決於 BIOS 實現。 盡管如此,使用ORG 0x7C00
指令,NASM 會將jmp 0x7c00
組裝成一個相對跳轉,就像您將 label 放在文件頂部一樣。 但實際上,您首先應該這樣做。
因此,固定版本可能如下所示:
BITS 16
ORG 0x7C00
start:
XOR AX, AX
MOV DS, AX
; you could also put the start label here
; no need to reload DS
LEA BX, [msg]
CALL printMsg
JMP start
printMsg:
MOV AL, [BX]
INC BX
TEST AL, AL
JZ return
CALL printc
JMP printMsg
return:
RET
printc:
MOV AH, 0Eh
int 10h
RET
msg: db "Hello",0
times 510-($-$$) db 0x90
dw 0xAA55
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.