首页 文章

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

提问于
浏览
0

我正在阅读“基于英特尔的计算机第五版汇编语言”一书 .
作者说像TITLE但他没有解释 .
它是关于指令长度的吗?

1 回答

  • 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
    

    所以,你有选择:

    • 使用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 .

相关问题