这是我在NASM中连接两个字符串的代码。我收到了分段错误核心转储错误。所以我开始评论找到错误的来源。正如您在代码中看到的,我使用%ifdef
和%endif
来创建注释块。当我排除了这条线" jmp l1"从评论中,它给出了分段错误。有人可以通过告诉我为什么jmp给出分段错误来帮助我吗?
extern scanf
extern printf
section .bss
str1: resb 20
str2: resb 10
section .data
msg1: db "Enter data:",0
msg2: db "%s",0
msg3: db "You entered %s",10,0
msg4: db "%s",0
test: db "Test",0
section .text
global main
main:
push msg1
call printf
add esp,4
push str1
push msg4
call scanf
add esp,8
push msg1
call printf
add esp,4
push str2
push msg4
call scanf
add esp,8
mov ecx,0
mov edx,0
l1:
mov al,byte[str1+ecx]
cmp al,13
je next
inc ecx
%ifdef
jmp l1
next:cmp byte[str2+edx],13
je finish
mov al,byte[str2+edx]
mov byte[str1+ecx],al
inc ecx
inc edx
jmp next
finish:
%endif
next:
push str1
push msg3
call printf
add esp,8
mov eax,1
mov ebx,0
int 80h
答案 0 :(得分:1)
最有可能的问题是字符串不包含回车符(ASCII值13)。
每次检查失败后(即cmp al, 13
),ECX
寄存器递增,jmp l1
指令创建循环。所以你要通过字符串查找值13,但如果字符串中不存在13则循环永远不会终止。在某些时候,您尝试访问您的进程无权访问的内存。因此,seg故障。
您最需要的是终止条件,如果到达字符串的末尾(可能是空字符(值0))将停止循环。类似的东西:
l1:
mov al,byte[str1+ecx]
cmp al,13
je next
; added next two lines to check for end of string
cmp al,0 ; if the value is 0, at end of string
je notFound
inc ecx
jmp l1
(对于挑剔的人:我意识到有更快的方式来检查al==0
。我选择了cmp
,因为它更清晰,更容易让初学者理解。)< / p>