【发布时间】:2013-09-15 02:39:07
【问题描述】:
使用 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
以上内容告诉我答案是否定的。而乘以1 或0 的原因是因为汇编程序实际上不需要做任何乘法来知道答案。
这是否意味着要实现我想要的,我必须使用mul 指令?
【问题讨论】: