Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 组装部门为什么将溢出写入商位置?_Assembly - Fatal编程技术网

Assembly 组装部门为什么将溢出写入商位置?

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

我开始学习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
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
。你的汇编代码不能正确处理你的分区上的负数。很抱歉我的回答太晚了,我在这里找到了视频,我把带有时间戳的链接放在了这里。那么,他教错了吗?我应该找另一个来源吗?