我试图在汇编中做这个算术运算,但每次都得到错误的答案,不确定我应该如何做
这些问题来自教科书,我确实有答案,但我想知道如何得到答案。
The link contains the image which has question and my work as shown below
Address | value || register value
0x100 0xFF || %rax 0x100
0x108 0xAB || %rcx 0x1
0xll0 0x13 || %rdx 0x3
0x118 0xll ||
|| lines are just to separate the two sides
Questions are
Instruction Destination Value
addq %rcx, (%rax) :
subq %rdx,8(%rax) :
imulq $16, (%ra,x,%rd.x,8) :
incq 16 (%rax) :
decq %rcx :
subq %rdx, %rax :
Instruction Destination Value
addq %rcx, (%rax) : 0x100 ?
subq %rdx,8(%rax) : 0x108 ?
imulq $16, (%ra,x,%rd.x,8) : 0x118 ?
incq 16 (%rax) : ? ?
decq %rcx : %rcx 0x0
subq %rdx, %rax : %rax ?
2条答案
按热度按时间sulc1iza1#
你有汇编语言的基本知识吗?
第一个表似乎具有存储器地址/寄存器及其初始值。
如果我们看一下第一条指令,它似乎从
rcx
寄存器中获取值,并将其写入rax
寄存器所指向的内存地址。首先,你可能会问自己,
rax
的值是多少,现在这个值应该是一个内存地址,我应该把rcx
寄存器中的值写入这个地址。每当寄存器被
()
(即(%rax)
)引用时,这意味着寄存器的值应被视为内存地址,并且作用中的值是该内存地址中的值(也称为解引用)。yvgpqqbh2#
以下是对每种情况的解释:
%rax指向内存地址0x 100。因此,我们的目标(第二个操作数)为0x 100。%rcx处的值为0x 1,其十进制值为1。因此,我们希望该值为1 + 0x 100指向的值。此值为0xFF,即255,因此我们的和为256。这是十六进制0x 100,这就是我们的价值。
Sub S,D指令的格式是D〈- D - S。为了计算出目的地,我们看到这是基址+位移。所以它是0x 100 + 0x 8,给予0x 108。在地址0x 108,我们得到值0xAB,它是十进位171。171 -在%rdx(它是3)的值,得到168,它是0xA 8。
同样,目标是第二个操作数。我们通过找到%rax处的值,然后加上8乘以%rdx处的值来计算。也就是0x 100(即256)+ 8 * 0x 3(即3)。这样我们得到280,即十六进制的0x 118。因此,0x 118是我们的目标。
为了计算出该值,我们取0x 118中的值0x 11,将其十进制值17乘以立即数16,得到272。将其转换回十六进制,得到0x 110。
首先,我们计算出要递增的值的地址。16 + %rax处的值,等于16 + 0x 100处的值,所以16 + 256 = 272。这是0x 110-我们的十六进制地址。0x 100处的值是0x 13 + 1是0x 14。所以我们的值是0x 14。
目的地是%rcx,它的值是0x 1。减去1,我们得到0x 0,即我们的值。
目标是第二个操作数,因此它是%rax保存的地址-0x 100。计算该值的方法是:取0x 100(256)的值,减去%rdx(3)的值,得到253。这就是0xFD。