gpt4 book ai didi

linux - 我可以将一个寄存器的值乘以一个立即数以将结果添加到另一个寄存器吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:20:35 25 4
gpt4 key购买 nike

使用 NASM、Ubuntu、32 位学习汇编。

我在 .data 中的数组:

ary db 1,2,2,4,5 ; Five elements of one byte each

还有一些数字:

tmp db 2   ; Holds the number 2

假设我想打印数组中索引为 4 的元素(所以它是 5)。

我知道我可以做到:

mov EAX,4
mov EBX,0
mov ECX,ary ; Put the array's address in ECX
add ECX,4 ; Move address four bytes to the right
add byte [ECX],'0' ; The value at this address to ASCII
mov EDX,1
int 0x80

但是,无论出于何种原因,我决定不写常量 4,而是通过将我的变量(即 2)乘以 2

这是更新后的代码:

mov EAX,[tmp]   ; Put the number 2 in EAX
mov ECX,ary ; Put the array's address in ECX
add ECX,EAX * 2 ; Move (2 * 2) = 4 bytes to the right
add byte [ECX],'0' ; Decimal to ASCII
mov EAX,4
mov EBX,0
mov EDX,1
int 0x80

这对 add ECX,EAX * 2 不起作用:

invalid operand type

但是为什么? ECX 的计算结果不是 2 吗?相当于

add ECX,2 * 2

奇怪的是,这些确实有效:

add ECX,EAX * 1   ; Moves by 2
add ECX,EAX * 0 ; Moves by 0

以上内容表明答案是否定的。与 10 相乘的原因是因为汇编器实际上不需要做任何乘法来首先知道答案。

这是否意味着要实现我想要的,我必须使用 mul 指令?

最佳答案

如果你使用 lea,你可以在一条指令中做乘法和加法:

lea ECX,[ECX+EAX*2]

关于linux - 我可以将一个寄存器的值乘以一个立即数以将结果添加到另一个寄存器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18808423/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com