在循环中,dest地址不能超过-128~ + 127字节的当前地址,为什么?

时间:2014-04-26 03:22:41

标签: loops assembly x86 intel

我正在阅读基于Intel的计算机第五版汇编语言的书 作者说像TITLE,但他没有解释 是关于指令长度的吗?

1 个答案:

答案 0 :(得分:2)

以下一种方式思考这个问题,创建你需要的循环:

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

所以,你有选择:

  1. 使用dec + short jmp,3个字节
  2. 使用dec + long jmp,5个字节
  3. 一旦大多数循环(都是?)非常短 - 引入了特殊的快捷指令来减小尺寸(640kb就足够了):

    loop只占用2个字节并用作dec + short jmp

    所以,循环是特殊的" edge"我认为现在没有使用的情况(更新:它可以假定为已弃用(because it's slow on modern CPUs),并且它有意义,因为循环强制您使用CX作为循环变量,因此您不能创建双循环或使用另一个寄存器)

    无论如何你问题的第二部分 - 如果你的循环体更大,该怎么办:

    1. 尝试对其进行优化,有许多不同的技术,例如将mov ax,0(3个字节)替换为xor ax,ax(2个字节),依此类推
    2. 将您的代码重新分解为函数(这实际上可能会增加您的最终大小,但有时会减小正文大小)
    3. 使用dec + long jmp
    4. 注意:这些指令长度适用于16位模式; 32位和64位模式使用rel32进行长跳转,而不是rel16。