我正在尝试编写自己的“玩具”操作系统,目前大部分使用汇编语言(NASM) - 部分原因是我希望它能帮助我理解x86反汇编,另一方面是因为我发现它相当有趣!这是我第一次使用汇编语言编程 - 我学得比我预期的要快,但是像学习任何显著不同的语言一样,我发现我的代码结构相当混乱,因为我试图弄清楚应该使用什么模式和约定。目前特别困难的是:跟踪寄存器。目前所有内容都在16位模式下运行,因此我只有6个通用寄存器可供使用,其中甚至更少可用于访问内存。我经常会覆盖自己的寄存器,这意味着我经常需要交换寄存器以避免这种情况 - 因此,即使有很多注释,我也很难跟踪寄存器包含哪些值。这正常吗?有没有什么可以做的来简化跟踪的事情?例如,我已经开始注释我所有的函数,并列出了被破坏的寄存器列表:
保持栈的追踪
在一些情况下,当寄存器用完后我开始使用栈,但这只会使事情变得更糟——任何比简单的“push call pop”序列更复杂的东西都会让我完全失去追踪,使我难以甚至判断是否有正确数量的项目在栈上(特别是当涉及错误处理时——见下文),更不用说它们的顺序了。我知道一定有更好的使用栈的方法,但我就是想不出来。
处理错误
我一直在使用进位标志和零标志(取决于函数)来向调用者指示错误,例如:
这是指示错误的正常方式吗?
另外,我能用什么其他提示或技巧来更好地构造我的汇编代码吗?
最后,有没有好的资源/写得很好的汇编示例?我找到了The Art of Assembly Language Programming,但它似乎非常注重语言的细节,对代码应该如何结构化的强调较少。(此外,一些代码示例使用段,我认为我应该避免使用)。
我正在使用零段(平面内存模型)完成所有这些工作,以保持简单,并在开始使用C时使事情变得更容易。
; ================
; c_lba_chs
; Converts logical block addressing to Cylinder / Head / Selector
; ax (input, clobbered) - LBA
; ch (output) - Track number (cylinder)
; cl (output) - Sector number
; dh (output) - Head number
; ================
保持栈的追踪
在一些情况下,当寄存器用完后我开始使用栈,但这只会使事情变得更糟——任何比简单的“push call pop”序列更复杂的东西都会让我完全失去追踪,使我难以甚至判断是否有正确数量的项目在栈上(特别是当涉及错误处理时——见下文),更不用说它们的顺序了。我知道一定有更好的使用栈的方法,但我就是想不出来。
处理错误
我一直在使用进位标志和零标志(取决于函数)来向调用者指示错误,例如:
myfn:
; Do things
jz .error
; Do more things
ret
.error:
stc
ret
这是指示错误的正常方式吗?
另外,我能用什么其他提示或技巧来更好地构造我的汇编代码吗?
最后,有没有好的资源/写得很好的汇编示例?我找到了The Art of Assembly Language Programming,但它似乎非常注重语言的细节,对代码应该如何结构化的强调较少。(此外,一些代码示例使用段,我认为我应该避免使用)。
我正在使用零段(平面内存模型)完成所有这些工作,以保持简单,并在开始使用C时使事情变得更容易。