使用 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
但是,无论出于何种原因,我决定不写常数 number ,而是想通过将我的变量(即)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
以上表明我的答案是否定的。乘以1
or0
起作用的原因是因为汇编器实际上不需要做任何乘法来首先知道答案。
这是否意味着要实现我想要的,我必须使用mul
指令?