assembly 我对这个算术运算符感到困惑

qzlgjiam  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(207)

我试图在汇编中做这个算术运算,但每次都得到错误的答案,不确定我应该如何做
这些问题来自教科书,我确实有答案,但我想知道如何得到答案。
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           ?
sulc1iza

sulc1iza1#

你有汇编语言的基本知识吗?
第一个表似乎具有存储器地址/寄存器及其初始值。
如果我们看一下第一条指令,它似乎从rcx寄存器中获取值,并将其写入rax寄存器所指向的内存地址。
首先,你可能会问自己,rax的值是多少,现在这个值应该是一个内存地址,我应该把rcx寄存器中的值写入这个地址。
每当寄存器被()(即(%rax))引用时,这意味着寄存器的值应被视为内存地址,并且作用中的值是该内存地址中的值(也称为解引用)。

yvgpqqbh

yvgpqqbh2#

以下是对每种情况的解释:

addq %rcx, (%rax)

%rax指向内存地址0x 100。因此,我们的目标(第二个操作数)为0x 100。%rcx处的值为0x 1,其十进制值为1。因此,我们希望该值为1 + 0x 100指向的值。此值为0xFF,即255,因此我们的和为256。这是十六进制0x 100,这就是我们的价值。

subq %rdx, 8(%rax)

Sub S,D指令的格式是D〈- D - S。为了计算出目的地,我们看到这是基址+位移。所以它是0x 100 + 0x 8,给予0x 108。在地址0x 108,我们得到值0xAB,它是十进位171。171 -在%rdx(它是3)的值,得到168,它是0xA 8。

imulq $16, (%rax, %rdx, 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。

incq 16(%rax)

首先,我们计算出要递增的值的地址。16 + %rax处的值,等于16 + 0x 100处的值,所以16 + 256 = 272。这是0x 110-我们的十六进制地址。0x 100处的值是0x 13 + 1是0x 14。所以我们的值是0x 14。

decq %rcx

目的地是%rcx,它的值是0x 1。减去1,我们得到0x 0,即我们的值。

subq %rdx, %rax

目标是第二个操作数,因此它是%rax保存的地址-0x 100。计算该值的方法是:取0x 100(256)的值,减去%rdx(3)的值,得到253。这就是0xFD。

相关问题