汇编编程 x86 Pentium Bug

Assembly Programming x86 Pentium Bug

我在用汇编语言 x86 Pentium 编写的程序中遇到了一个小问题。已经使用调试器在程序的 运行 中搜索了一些异常的东西。发生的事情是,当我尝试在调试器中 运行 它时,它运行良好,但在终端中出现分段错误(核心转储)。我知道我正在访问未定义的内存部分,但我的代码没有问题。

代码如下:

#.text #same as .section .text
.globl hell
hell:
push %ebp
movl %esp, %ebp
push %ebx #index
push %edi
push %esi
subl , %esp
movl 8(%ebp), %edx #str
movl 12(%ebp), %eax #hist
movl $-1, %esi
xor %ecx, %ecx #j
dec %ecx  

forclean:
inc %ecx
cmp , %ecx
je for1
movl [=10=], (%eax, %ecx, 4)
jmp forclean

for1:
inc %esi
movb (%edx,%esi,1), %al
cmpb [=10=], %al
je fim
cmpb [=10=]x41, %al
jl if2
cmpb [=10=]x5A, %al
jg if2
subb [=10=]x41, %al
movzbl %al, %ebx #mover para o index
incl (%eax, %ebx, 4)
jmp for1

if2:
movb (%edx,%esi,1), %al
cmpb [=10=]x61, %al
jl for1
cmpb [=10=]x7A, %al
jg for1
subb [=10=]x61, %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

你将hist的地址存储在eax中,然后你对al中的字符索引进行了所有计算。由于它是 eax 的一部分,因此您更改了地址,这就是出现分段错误的原因。 清除开头的 ebx 寄存器并使用 bl 代替计算。

此外,您函数的序言和结尾都是错误的。他们应该是:

push %ebp
movl %esp, %ebp
subl , %esp    #space for local variables
push %ebx
push %edi
push %esi

popl %esi
popl %edi
popl %ebx
movl %ebp, %esp
popl %ebp