问候, 我正在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之后输出分段错误。我没有看到任何错误,但也许我误解了地址。
答案 0 :(得分:0)
在致电func
之前尝试此操作:
mov ebx, offset string
似乎你正在使用intel语法。在AT& T中,语法mov $string,%ebx
是正确的,因为常量总是立即的,但这不会发生在英特尔的
答案 1 :(得分:0)
这变得非常陈旧......但问题是“str_input”没有输入以零结尾的字符串!