运行 带有命名变量的 asm 程序延迟

Delay when running asm program with named variables

我有以下程序可以将两个数字相乘:

.globl main

main:
    # Store the two numbers temporarily in ebx, ecx
    mov ,     %ebx
    mov ,     %ecx
    # clear out eax and add ebx (7) to it ecx (14) times
    mov [=11=],     %eax
multiply_step:
    add %ebx,   %eax
    dec %ecx
    jnz multiply_step
    ret

但是,如果我出于某种原因为 147 添加变量,程序需要大约一秒钟的时间才能达到 运行,这似乎有点奇怪(上面程序是即时的)--

.globl main
.globl x,y
x:  .byte 7
y:  .byte 14

main:
    mov x,     %ebx
    mov y,     %ecx
    mov [=12=],     %eax
multiply_step:
    add %ebx,   %eax
    dec %ecx
    jnz multiply_step
    ret

为什么这个程序到 运行 需要更长的时间?我将两者都调用为:

$ gcc m2.s -o m2 && ./m2; echo $?
# 98

变量x是一个字节,但是你将4个字节移动到ebx中,所以ebx的值不是7。实际加载到ebx中的值是0x1d8b0e07。类似地,ecx 中的值类似于 0x011d8b0e,因此您可以了解为什么循环比 0x0e 时花费的时间长得多。

尽管有这个错误,结果的低字节是一样的。

要将这些字节值加载到 32 位寄存器中,请使用:

movzbl x, %ebx
movzbl y, %ecx

该指令从内存中读取一个字节,zero-extends将其转换为 32 位,并将结果放入目标寄存器。

或者像您在其他问题中使用的那样,在 64 位代码中,RIP-relative 寻址效率更高,并且适用于现代 PIE 可执行文件:

movzbl x(%rip), %ebx
movzbl y(%rip), %ecx