我刚刚开始自学装配,以了解代码和操作系统是如何工作的。据我了解,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上运行得很好。
答案 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。
所以输出二进制文件看起来像这样。
所以实际上这是一个无限循环!