我正在为一个类开发一个简单的汇编程序,并且遇到奇怪的分段错误。将字节转换为千字节是一个非常简单的程序。但是,在进行转换的函数中,当我尝试将值1024移动到ebx
寄存器时,出现了分段错误。我在使用寄存器之前从未遇到过这种问题。有人知道是什么原因引起的吗?我想这很简单,我可以俯瞰。谢谢!
asm_main:
enter 0,0
pusha
mov eax, 0
mov ebx, 0
call read_int
push eax
call functionA
popa
mov
leave
ret
functionA:
mov eax, [esp + 4]
call print_int
call print_nl
mov ebx, 1024 ;segmentation fault occurs here
div ebx
call print_int
ret
更新:一个有趣的发现是,如果我删除与堆栈交互的行push eax
和mov eax, [esp + 4]
,则不再存在分段错误。但是,在执行eax
后,我在div ebx
获得了一个疯狂的结果。
答案 0 :(得分:4)
足够的评论!我向cHao道歉,坏div
将导致异常,而不是段错误。正如大狼所说,堆栈指针是foobar'ed ...通过将参数推送到functionA
而不是删除它。我在第一次阅读时错过了。
%include "asm_io.inc"
asm_main:
enter 0,0
pusha
mov eax, 0
mov ebx, 0
call read_int
push eax
call functionA
add esp, 4 ; or pop something to remove the parameter
popa
mov eax, 0 ; to return a value to "driver.c"
leave
ret
functionA:
mov eax, [esp + 4]
call print_int
call print_nl
mov ebx, 1024 ;segmentation fault occurs here (??? I doubt it)
xor edx, edx ; "div" is going to use this!
div ebx
call print_int
ret
那是未经测试的,但我“认为”这没关系。 read_int
等的代码可以在http://www.drpaulcarter.com/pcasm找到 - 它只使用scanf(和printf等)来消除OSen之间的差异。我认为没关系。