在英特尔 80386 32 位的汇编程序中引用字符串中的字符时无法输入任何值

Posted

技术标签:

【中文标题】在英特尔 80386 32 位的汇编程序中引用字符串中的字符时无法输入任何值【英文标题】:cant put any values when referencing a character in a string in assembler for Intel 80386 32-bit 【发布时间】:2017-05-22 15:04:51 【问题描述】:

基本上我想从文本中删除空格,但我遇到了段错误并且不知道为什么。 我使用 ddd 发现它总是在movb %dl, (%ecx) 处中断。这就是问题所在。

.text
.globl palindrom

palindrom:
pushl %ebp
movl %esp, %ebp
subl $8, %esp

movl 8(%ebp), %eax      #eax and ecx are used to refference individual
movl 8(%ebp), %ecx      #string characters
movl $0, -4(%ebp)       # -4(%ebp) is the counter

razmaci:
movb (%eax), %dl    #both eax and ecx are reffering to the same string
cmpb $0, %dl
je vmsl
cmpb $' ', %dl      #testing to see if the tharacter at eax is ' ' 
je ima_raz
incl %eax
incl %ecx
incl -4(%ebp)
jmp razmaci

ima_raz:
incl %eax         #incrementing eax to move the next string char to where 
movb (%eax), %dl  #the ' ' is
movb %dl, (%ecx)    <-------- THIS IS WHERE IT BREAKS
jmp razmaci     #to causes a seg fault

vmsl:
movl -4(%ebp), %edx
movl $0, %ecx

kraj:
movl %ebp, %esp
popl %ebp
ret

【问题讨论】:

我的程序集有点生锈,但我可以看到一个循环,但我看不到循环的任何退出。所有 jmps 返回 razmaci 我只是忘记了循环,但这不是问题。问题是,当我输入 'mov any, (any reg)' 即 'movb %dl, (%eax)' 时,它就会中断。 您能提供给我们一个完整的程序吗?我没有看到你的程序崩溃的地方。 idk 怎么办 病了就回答吧 你仍然有无限循环,只需在调试器中单步执行。如果它在第一次迭代期间确实崩溃了,那么您对 ​​eax+ecx 的初始化是错误的。如果它会一直工作到字符串的末尾,那么它会因为无限循环而崩溃。而且您需要以任何方式对其进行调试,因为您的算法是错误的,因此即使您修复了循环终止,它也不会按预期工作。 【参考方案1】:

这可能会差一分,但是...

razmaci:
dec -4(%ebp) # Decrement counter
jz kraj      # Stop at zero

movb (%eax), %dl    #both eax and ecx are reffering to the same string
cmpb $' ', %dl      #testing to see if the tharacter at eax is ' ' 
je ima_raz
incl %eax
incl %ecx
# incl -4(%ebp)
jmp razmaci

【讨论】:

【参考方案2】:

在我看来,您最初加载的字符串指针可能是错误的。也许应该是:

movl 12(%ebp), %eax      #eax and ecx are used to refference individual
movl 12(%ebp), %ecx      #string characters

【讨论】:

以上是关于在英特尔 80386 32 位的汇编程序中引用字符串中的字符时无法输入任何值的主要内容,如果未能解决你的问题,请参考以下文章

80386学习 80386CPU介绍

80386学习 80386CPU介绍

IA32 IA64 X64 的区别

32位汇编背景知识

AMD64和i386的区别

Android逆向基础之ARM汇编语言知识总结