Assembly 组装部门为什么将溢出写入商位置?
我开始学习x86汇编,并尝试编写一个类似Assembly 组装部门为什么将溢出写入商位置?,assembly,Assembly,我开始学习x86汇编,并尝试编写一个类似 int a,b,c,d,e // doing some stuff, variables will all be 32 bit a = ((b+c)-(d+e)) / 10 因此,在汇编中编写一个等效程序时,我从视频教程中得到了一些帮助,这 .comm a, 4 .comm b, 4 .comm c, 4 .comm d, 4 .comm e, 4 //add b + c movl b, %ebx addl c, %ebx // add d + e
int a,b,c,d,e
// doing some stuff, variables will all be 32 bit
a = ((b+c)-(d+e)) / 10
因此,在汇编中编写一个等效程序时,我从视频教程中得到了一些帮助,这
.comm a, 4
.comm b, 4
.comm c, 4
.comm d, 4
.comm e, 4
//add b + c
movl b, %ebx
addl c, %ebx
// add d + e
movl d, %edx
addl e, %edx
// substract (d+e) from (b+c)
subl %edx, %ebx
// clear edx, and put result into eax for division
movl $0, %edx
movl %ebx, %eax
divl $10
// put the result to var a in memory
movl %eax, a
// also put the overflow into var a in mem?
// isnt the overflow overwriting my result in memory?
movl %edx, a
在最后两行中,结果被写回内存。为什么结果不是简单地替换为溢出,它也被写入同一个位置。来自%eax的结果为4个字节,将写入mem位置a。之后,溢出,也就是4个字节被写入到与我的结果相同的内存位置。我对组装比较陌生,所以我认为我遗漏了一些重要的东西。请编辑我的问题标题,我真的找不到更好的标题。你有你使用的视频链接吗?是
movl%edx,a
正在覆盖上一条指令movl%eax,a
中存储在a
中的值,因此这是一个问题。还应指出divl$10
不是div指令的有效用法。它接受寄存器或内存操作数,但不接受像$10这样的立即数。请参见EDX
不包含溢出,它包含余数(“模”)。例如,44/10=4,余数为4。一对其他观测值<代码>子库%edx,%ebx
是存储在%ebx中的%ebx-%edx结果。你的代码实际上是(d+e)-(b+c)。你把它倒过来了。因为您使用的是div
这是无符号除法,但在C代码中,您似乎使用的是有符号的int
。你的汇编代码不能正确处理你的分区上的负数。很抱歉我的回答太晚了,我在这里找到了视频,我把带有时间戳的链接放在了这里。那么他教错了吗?我应该找另一个来源吗?你有你用过的视频的链接吗?是movl%edx,a
正在覆盖上一条指令movl%eax,a
中存储在a
中的值,因此这是一个问题。还应指出divl$10
不是div指令的有效用法。它接受寄存器或内存操作数,但不接受像$10这样的立即数。请参见EDX
不包含溢出,它包含余数(“模”)。例如,44/10=4,余数为4。一对其他观测值<代码>子库%edx,%ebx
是存储在%ebx中的%ebx-%edx结果。你的代码实际上是(d+e)-(b+c)。你把它倒过来了。因为您使用的是div
这是无符号除法,但在C代码中,您似乎使用的是有符号的int
。你的汇编代码不能正确处理你的分区上的负数。很抱歉我的回答太晚了,我在这里找到了视频,我把带有时间戳的链接放在了这里。那么,他教错了吗?我应该找另一个来源吗?