汇编编程x86奔腾Bug

时间:2015-04-29 13:47:40

标签: assembly x86

我在使用汇编语言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

1 个答案:

答案 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