2011-03-27 96 views
1

問候, 我正在linux下編寫NASM,我遇到了以下問題:我必須編寫一個簡單的程序,用戶必須輸入字符串,並將其傳遞給函數返回它的大小: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字節[EB x],0h,因爲當我啓動程序時,會在str_input之後打印出分段錯誤。我沒有看到任何錯誤,但也許我誤以爲地址。調用func前將

+0

你在用ebx做什麼? [ebx]意味着訪問內存中的數據,其地址在ebx ?,我沒有看到你在ebx中加載地址..如果我錯了,請糾正我的錯誤 – Zimbabao 2011-03-27 17:36:00

+0

你是如何編譯的?什麼命令行? – BlackBear 2011-03-27 17:37:42

+0

@津巴布奧:是的,他在調用func之前加載ebx – BlackBear 2011-03-27 17:38:15

回答

0

試試這個:

mov ebx, offset string 

好像你正在使用Intel語法。在AT & T語法mov $string,%ebx將是正確的,因爲常量總是立即的,但這不會發生在英特爾的

+0

在AT&T語法中它將是mov $ string,%ebx – ughoavgfhw 2011-03-27 18:36:45

+0

@ughoavgfhw:肯定 – BlackBear 2011-03-27 18:40:33

0

這是變得相當陳舊...但你的問題是,「str_input」不輸入zero-終止字符串!