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