jmps如何在装配中工作? (OS开发)

时间:2016-11-29 16:21:13

标签: assembly x86 operating-system

我刚刚开始自学装配,以了解代码和操作系统是如何工作的。据我了解,jmp foo告诉处理器转到包含标签foo的行。但是,最基本的操作系统(如果真的可以称之为!)看起来像这样......

foo:                           ; label foo
    jmp foo                    ; Go to foo
    times 512-($-$$) db 0      ; Fill remaining bytes with 0's

据我了解此代码,处理器会看到第1行并记住它是foo。然后它继续到第2行,告诉它转到foo。并重复,从未到达第3行,告诉它填补空白区域。

为什么这不是无限循环?它编译时(我在这里使用正确的词吗?)在VirtualBox上运行得很好。

1 个答案:

答案 0 :(得分:3)

第一件事;这是汇编代码,因此这不是处理器直接执行的。汇编程序在这里发挥作用。它会扫描您的汇编代码并创建机器代码。这是Instructions的序列(数据也是如此)。

让我们来看你的代码

foo:                           ; label foo
jmp foo                        ; Go to foo
times 512-($-$$) db 0          ; Fill remaining bytes with 0's

汇编程序查看您的程序。并保存“foo”的地址,即0x00000000(零) 第一条指令是跳转地址0x00000000(标签没有大小),它告诉处理器跳转到foo,即跳转到0x00000000。因此汇编程序创建了一个二进制文件,它将“jmp”指令机器代码放入地址字段并将0x00000000放入。

接下来“次”这不是机器可执行代码,而是一个汇编程序关键字,它告诉汇编程序n次操作跟随的命令。所以用“0”字节填充休息空间,直到地址512。

所以输出二进制文件看起来像这样。

enter image description here

所以实际上这是一个无限循环