【问题标题】:The addressing mode can write like this?寻址方式可以这样写吗?
【发布时间】:2012-11-06 14:12:19
【问题描述】:

我要使用cmp指令,是否在汇编语言中设置如下语法? 示例:

cmp [temp + si],[temp + si+1]

【问题讨论】:

    标签: assembly addressing-mode


    【解决方案1】:

    不,你不能(完全)这样做。对于 Intel x86 上的几乎所有指令,其中一个操作数必须是寄存器。

    有一个例外:cmpsb[ds:si][es:di] 进行比较(或者,在 32 位模式下,[ds:esi][es:edi],或者在 64 位模式下,使用 rsirdi)。

    但是,如果您想使用si 来指向两个操作数,则需要加载其他一些寄存器,然后进行比较:

    mov al, [temp+si]
    cmp al, [temp+si+1]
    

    另一种可能性是从[si] 加载,并递增si

    lodsb          ;roughly equivalent to mov al, [si] / inc si
    cmp al, [si]
    

    由于这只能使用si,而不是temp+si,因此您需要在使用之前将它们相加。这有点短,但(至少理论上)在大多数当前处理器上更慢。要恢复速度,您还可以使用更原始的指令:

    mov al, [si+temp]
    inc si
    cmp al, [si+temp]
    

    或者,由于您在这两个指令中都使用了+temp,因此提前进行添加可能会有所收获:

    add si, temp
    mov al, [si]
    inc si
    cmp al, [si]
    

    但要记住一件事:由于您使用的是内存中的数据,因此这可能不会对速度产生任何实际影响 - 如果您对内存进行大量操作,那么内存的带宽通常(通常?)瓶颈,因此优化处理器本身的指令执行几乎没有什么区别。

    【讨论】:

    • 假设它是 x86,OP 没有指定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2018-08-03
    相关资源
    最近更新 更多