NASM分段故障问题

时间:2011-03-27 17:24:25

标签: assembly nasm

问候, 我正在linux下编写NASM,我有以下问题:我必须编写一个简单的程序,用户必须输入字符串,将其传递给返回其大小的函数:

代码是:

%include "macros.inc"
        section .data
prompt1     db "Enter string: ",0
prompt1len  equ $-prompt1
prompt2     db "The size of string is: ",0
prompt2len  equ $-prompt2

        section .bss
string      resb 20
        section .text
            global _start
_start:     str_output prompt1len,prompt1
            str_input string 
            mov ebx,string
            call func
            str_output prompt2len,prompt2
            output eax
            exit 0

func:
            xor eax,eax
et        **cmp byte [ebx],0h**
            je end
            inc eax
            inc ebx
            jmp et
end         dec eax
            ret

这是宏文件:

%macro exit 1
        mov eax,1
        mov ebx,%1
        int 80h
%endmacro

%macro int_input 1
        mov eax,3
        mov ebx,0
        mov ecx,%1
        mov edx,1
        int 80h
        and eax,0Fh
        mov %1,eax
%endmacro

%macro str_input 1
        mov eax,3
        mov ebx,1
        mov ecx,%1
        mov edx,20
        int 80h
%    endmacro

%macro output 1
        mov eax,%1
        or eax,30h
        mov %1,eax
        mov eax,4
        mov ebx,1
        mov ecx,%1
        mov edx,1
        int 80h
%endmacro

%macro str_output 2+
        mov eax,4
        mov ebx,1
        mov ecx,%2
        mov edx,%1
        int 80h
%endmacro

我调试了程序,问题出在指令cmp byte [ebx],0h,因为当我启动程序时,它会在str_input之后输出分段错误。我没有看到任何错误,但也许我误解了地址。

2 个答案:

答案 0 :(得分:0)

在致电func之前尝试此操作:

mov ebx, offset string

似乎你正在使用intel语法。在AT& T中,语法mov $string,%ebx是正确的,因为常量总是立即的,但这不会发生在英特尔的

答案 1 :(得分:0)

这变得非常陈旧......但问题是“str_input”没有输入以零结尾的字符串!