在引导加载程序中JMPing到0x7C00不会导致无限循环

我正在创建一个引导程序,并希望通过跳转到地址0x7C00来创建一个不受关注的无限循环。

当引导加载程序加载到0000:7C00时,我希望当我调用JMP 0x7C00时,代码将转到程序的开头。除了它只调用一次代码而已。

这是我的代码:

  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标签,并在第17行上创建CALL startJMP start,但这似乎都不起作用。

wwwqq20010 回答:在引导加载程序中JMPing到0x7C00不会导致无限循环

您没有call printMsg,所以RET的{​​{1}}无处可去。另外,您的return:放在错误的位置,无法访问。

此外,Peter said不能保证jmp 0x7c00可能是CS:IP = 0000:7C00,具体取决于BIOS实现。尽管如此,使用该07C0:0000指令,NASM仍将ORG 0x7C00组装成一个相对跳转,就好像您将标签放在文件顶部一样。但实际上您应该首先这样做。

因此,固定版本可能如下所示:

jmp 0x7c00
本文链接:https://www.f2er.com/3160008.html

大家都在问