我正在尝试为我的集会课做作业,老师的例子有一行
movl (%eax),%ebx
我的代码使用完全相同的行,但每当gdb到达它时,我都会遇到seg错误。我不明白为什么。请帮我。这是整个代码,通过QEMU在32位Linux上运行。
.text
.byte 12, 0x12, 012
.word 34, 0x34, 034
L1:
.long 23, 0x23, 023
.global _start
_start:
# do not change, remove or add anything other than specifying the underscores
movl $0x1700121C,%eax #hex for 385880604
movl (%eax),%ebx #moving contents of eax into ebx, long to long
movw 0x17,%bx #attemtping to move via memory location (probably buggy)
movb $0x12,%bh
# at this point, %ebx should have the value of 385880604
checkHere:
movl $1,%eax
movl $0,%ebx
int $0x80
请帮忙。谢谢你的时间。
答案 0 :(得分:0)
" movl $ 0x1700121C,%eax #hex for 385880604"需要引用标签/内存地址。
答案 1 :(得分:0)
此分配的目标是以给定值({
"size": 0,
"aggs": {
"group_by_vendor": {
"terms": {
"field": "vendor"
},
"aggs": {
"max_run_number": {
"terms": {
"field": "run_number",
"order": {"_term": "desc"},
"size": 1
},
"aggs" : {
"top hits agg" : {
"top_hits" : {
"size" :3
}
}
}
}
}
}
}
}
)填充某个寄存器(0x1700121C
)。
当程序运行时,它可以放在内存中的任何位置,用于程序和它分配的内存(例如,用于变量)。
你告诉它要看一个绝对的地址,这不是你想要的。您实际上并不知道您的程序及其分配的RAM字节在何处结束。您想在此处使用相对地址。 (在引擎盖下,可执行文件标题中的一些信息可以帮助实现这一点,如果你很好奇的话)
但你怎么得到相对地址?您可以利用ebx
。您不知道其确切的数字地址,但您确实知道它从L1
开始的任何地方开始。您可以在.long 23
上进行数学运算以获取相对地址。由于在内存L1
指向的地方之前有一些字节,因此您需要减去。
L1
是2个字节,其中有3个字节,加上之前有3个字节,因此.word
- 9可以转到此数据的第一个字节。