【问题标题】:Register being overwritten in x86 Assembly寄存器在 x86 程序集中被覆盖
【发布时间】:2014-03-24 05:38:08
【问题描述】:

不知道为什么...但是在第 113 行我创建了数字 400000000 然后将其移动到 edi 但它没有移动?我乘以一个变量 .int 是这个问题吗?

113                 mull %ecx                #Create number
(gdb) info registers
eax            0x17d78400   400000000
ecx            0x5f5e100    100000000
edx            0x0  0
ebx            0x0  0
esp            0xbffff3a4   0xbffff3a4
ebp            0x0  0x0
esi            0xa  10
edi            0x19cd8f78   432902008
eip            0x8048107    0x8048107 <_output+48>
eflags         0x206    [ PF IF ]
cs             0x73 115
ss             0x7b 123
ds             0x7b 123
es             0x7b 123
fs             0x0  0
gs             0x0  0
(gdb) s
115                 mov %eax, %edi           #move low
(gdb) s
116                 mov %edx, %esi            #move high
(gdb) info registers
eax            0xbf040000   -1090256896
ecx            0x5f5e100    100000000
edx            0x8e1bc9 9313225
ebx            0x0  0
esp            0xbffff3a4   0xbffff3a4
ebp            0x0  0x0
esi            0xa  10
edi            0xbf040000   -1090256896
eip            0x804810b    0x804810b <_output+52>
eflags         0xa87    [ CF PF SF IF OF ]
cs             0x73 115
ss             0x7b 123
ds             0x7b 123
es             0x7b 123
fs             0x0  0
gs             0x0  0

【问题讨论】:

  • 请尝试格式化。在行首添加 4 个空格即可。
  • 我机器上的帖子还是实际代码?
  • 帖子,但@AdamMaras 已经编辑了帖子并为您设置了格式。

标签: assembly x86-64 cpu-registers


【解决方案1】:

mull 之后,EAX 乘以 ECX 的乘积在 EDX:EAX 中,在您的情况下

因素:

eax            0x17d78400   400000000
ecx            0x5f5e100    100000000

产品:

eax            0xbf040000   -1090256896
edx            0x8e1bc9 9313225

所以64位产品是

0x8e1bc9bf040000

十进制是

40,000,000,000,000,000

所以产品是正确的,在正确的地方。

您将 EAX 移至 EDI,这只是产品的低 32 位。您没有执行的下一条指令是将 EDX 移动到 ESI(乘积的高 32 位)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 2020-09-16
    • 2011-02-12
    • 1970-01-01
    • 2012-11-05
    相关资源
    最近更新 更多