ax
是一个注册表,shl
表示我们向n
值转移到左侧...
z
是一个内存地址,在开头它包含值4
。
mov ax, [z]
shl ax, 3
add ax, [z]
shl ax, 1
mov [q], ax
我想知道如何从此代码中读取函数?
因此,在第一行,我们将z
中的内容放入注册ax
,好吧。
然后我们将此值(4)
向左移动3
,因此基本上执行此操作:2^3 * z
我们add
[z]
,现在我们2^3 * z + z = 9z
现在我们将9z
和shift
带到1
左侧,所以我们有9z * 2^1 = 18z
最后我们将注册ax
并将其放入内存地址q
,因此我们有:
q(z) = 18z
任务说z包含值4
,所以在这种情况下输出将是
q(4) = 18*4= 72
我是否正确地做了一切,从解释到解决方案?请告诉我,因为我需要在考试中完成类似的任务。
答案 0 :(得分:1)
所以在第一行我们将z中的内容放入注册ax,好吧。
不,您将值(地址)z
的内存内容放入ax
。
所以ax
= 4,而非ax
= z
。汇编z
相当于符号或地址,即。一些存储单元标签,如12340。
(“不” - 您可能正确理解它,我只是想强调在x86 intel语法中如何使用[]
。
在C = z
中分配变量z
的值,并获取您必须执行的地址&z
。在汇编中,z
本身就是地址,[z]
是内容。 (至少在NASM语法中,MASM / TASM允许mov ax,z
语法获取内容,并且你必须编写mov ax,offset z
来获取地址,但我建议不要使用这种混合用法,其中自动获取变量,但访问内存槽寄存器需要括号[rx]
,IMO令人困惑)
休息没问题。