在英特尔 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 位的汇编程序中引用字符串中的字符时无法输入任何值的主要内容,如果未能解决你的问题,请参考以下文章