我正在阅读“基于英特尔的计算机第五版汇编语言”一书 .作者说像TITLE但他没有解释 .它是关于指令长度的吗?
从下面开始考虑这个问题,创建你需要的循环:
mov cx, iterations label: ; loop body dec cx ; this instruction takes 1 byte jnz label ; this instruction takes 2 for short and 4 for long
所以,你有选择:
使用dec short jmp,3个字节
使用dec long jmp,5个字节
一旦大多数循环(都是?)非常短 - 引入了特殊的快捷指令来减小尺寸(640kb足以满足所有要求):
loop 只占用2个字节,并作为dec short jmp
loop
所以,循环是特殊的"edge"情况,我认为现在不使用(更新:它可以被认为是弃用的(because it's slow on modern CPUs),并且它有意义,因为循环强制您使用CX作为循环变量,因此您不能创建双循环或使用另一个注册)
无论如何你的问题的第二部分 - 如果你的循环体更大,该怎么办:
尝试优化它,有很多不同的技术,比如用 xor ax,ax (2字节)替换 mov ax,0 (3字节)等等
xor ax,ax
mov ax,0
将您的代码重新分解为函数(这实际上可能会增加您的最终大小,但有时会减小体型)
使用dec long jmp
注意:这些指令长度适用于16位模式; 32位和64位模式使用rel32进行长跳转,而不是rel16 .
1 回答
从下面开始考虑这个问题,创建你需要的循环:
所以,你有选择:
使用dec short jmp,3个字节
使用dec long jmp,5个字节
一旦大多数循环(都是?)非常短 - 引入了特殊的快捷指令来减小尺寸(640kb足以满足所有要求):
loop
只占用2个字节,并作为dec short jmp所以,循环是特殊的"edge"情况,我认为现在不使用(更新:它可以被认为是弃用的(because it's slow on modern CPUs),并且它有意义,因为循环强制您使用CX作为循环变量,因此您不能创建双循环或使用另一个注册)
无论如何你的问题的第二部分 - 如果你的循环体更大,该怎么办:
尝试优化它,有很多不同的技术,比如用
xor ax,ax
(2字节)替换mov ax,0
(3字节)等等将您的代码重新分解为函数(这实际上可能会增加您的最终大小,但有时会减小体型)
使用dec long jmp
注意:这些指令长度适用于16位模式; 32位和64位模式使用rel32进行长跳转,而不是rel16 .