【发布时间】:2017-02-13 23:40:13
【问题描述】:
我刚刚开始学习汇编,并且正在制作一个简单的引导加载程序作为我的操作系统类的一部分。我正在努力使我的代码更有效率,即我认为到目前为止我所做的并不是实现我想要的特别好的方法。也就是说,我一直在努力在网上找到任何记录跳转/分支/查找表的资源,我认为这将是最有效的方法。
为了解释我想要实现的目标,我正在调用一个函数,该函数在 dx 寄存器中返回一个值,从 0 到 4。目前我正在使用 cmp 指令一个接一个地进行比较如果值相同,则进行有条件的je 跳转。如果我用更高级别的语言编写此代码,我基本上会一个接一个地执行多个 if 语句,而不是使用更有效的 switch 语句。
这就是我现在正在做的事情:
cmp dx, 1
je .F_1
cmp dx, 2
je .F_2
cmp dx, 3
je .F_3
cmp dx, 4
je .F_4
cmp dx, 0
je .F_5
jmp RangeError_Handler
.F1:
mov si, msg1
jmp F_Exit
.F2:
mov si, msg2
jmp F_Exit
... ; .F3 and .F4 follow the pattern
.F5: ; special case
mov si, msg_error
call PrintLn
hlt
F_Exit:
call PrintLn
... ; and do something else
msg1: db 'Message 1', 0
msg2: ...
...
必须有更好的方法来做到这一点。我的导师暗示跳表是理想的,但没有时间给我任何进一步的解释,说明它在组装中的工作方式,所以如果有人能在上下文中提供某种示例,我将非常感激我的情况。
理论上,我应该有一个函数检查 dx 的值,然后跳转到一个特定的函数,而不是单独检查 5 次,我只是不知道如何在汇编中实现它。对字符串也使用查找表会更有效吗?即返回值 1 表示表中的字符串 1?
【问题讨论】:
-
您的编辑在问题和我的答案中都引入了错误,并且使逻辑如此简单,以至于其他有一种特殊情况的人可能会认为此问答不适用于他们的情况。我想我又把它变成了一个理智的问题。我考虑只是回滚它,因为它并不难看出你的代码在做什么。 (并且知道它正在检查 A20 的东西,这使得 MichaelPetch 能够对确保 CS 已设置进行有用的观察。)只要易于遵循,代码就不需要完全通用。
标签: assembly x86 nasm intel x86-16