运行 带有命名变量的 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
但是,如果我出于某种原因为 14
和 7
添加变量,程序需要大约一秒钟的时间才能达到 运行,这似乎有点奇怪(上面程序是即时的)--
.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
我有以下程序可以将两个数字相乘:
.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
但是,如果我出于某种原因为 14
和 7
添加变量,程序需要大约一秒钟的时间才能达到 运行,这似乎有点奇怪(上面程序是即时的)--
.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