在程序集中使用“mov”时出现分段错误

时间:2013-11-08 23:30:51

标签: assembly x86 segmentation-fault nasm

我正在为一个类开发一个简单的汇编程序,并且遇到奇怪的分段错误。将字节转换为千字节是一个非常简单的程序。但是,在进行转换的函数中,当我尝试将值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 eaxmov eax, [esp + 4],则不再存在分段错误。但是,在执行eax后,我在div ebx获得了一个疯狂的结果。

1 个答案:

答案 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之间的差异。我认为没关系。