3

我正在为一个类编写一个简单的汇编程序,并且遇到了一个奇怪的分段错误。这是一个将字节转换为千字节的非常简单的程序。但是,在执行转换的函数中,当我尝试将值 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

4

1 回答 1

4

评论够多了!我向 cHao 道歉,不好的div会导致异常,而不是段错误。正如greatwolf所说,堆栈指针是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 之间的差异。我认为这很好。

于 2013-11-09T03:51:06.640 回答