我在使用汇编语言x86 Pentium编写的程序中遇到了一些问题。已经使用调试器在程序运行中搜索一些异常的东西。发生的事情是,当我尝试在调试器中运行它时,它会顺利但在终端时出现Segmentation fault(core dumped)。我知道我正在访问未定义的内存的某些部分,但我发现我的代码没有问题。
这是代码:
#.text #same as .section .text
.globl hell
hell:
push %ebp
movl %esp, %ebp
push %ebx #index
push %edi
push %esi
subl $8, %esp
movl 8(%ebp), %edx #str
movl 12(%ebp), %eax #hist
movl $-1, %esi
xor %ecx, %ecx #j
dec %ecx
forclean:
inc %ecx
cmp $26, %ecx
je for1
movl $0, (%eax, %ecx, 4)
jmp forclean
for1:
inc %esi
movb (%edx,%esi,1), %al
cmpb $0, %al
je fim
cmpb $0x41, %al
jl if2
cmpb $0x5A, %al
jg if2
subb $0x41, %al
movzbl %al, %ebx #mover para o index
incl (%eax, %ebx, 4)
jmp for1
if2:
movb (%edx,%esi,1), %al
cmpb $0x61, %al
jl for1
cmpb $0x7A, %al
jg for1
subb $0x61, %al
movzbl %al, %ebx #mover para o index
incl (%eax, %ebx, 4)
jmp for1
end:
movl %ebp, %esp
popl %esi
popl %edi
popl %ebx
popl %ebp
ret
答案 0 :(得分:2)
您将hist
的地址存储在eax
中,然后对al
内的字符索引进行所有计算。由于它是eax
的一部分,因此您需要更改地址以及导致细分错误的原因。
清除开头的ebx
注册表,然后使用bl
进行计算。
你的功能的序言和结语也是错误的。他们应该是:
push %ebp
movl %esp, %ebp
subl $8, %esp #space for local variables
push %ebx
push %edi
push %esi
和
popl %esi
popl %edi
popl %ebx
movl %ebp, %esp
popl %ebp