2008-12-31 28 views
1

我想创建3个asciz字符的子字符串(小字符串)出我的原始(thestring)。事情是不打印时运行,所以我不知道我到底在做什么。为什么不打印?我是否正确创建小型字符串?在Linux IA-32汇编程序(气体)上创建子字符串

.section .data 

thestring: .asciz "111010101" 

ministring: .asciz "" 

formatd: .asciz "%d" 
formats: .asciz "%s" 
formatc: .asciz "%c" 




.section .text 

.globl _start 

_start: 

xorl %ecx, %ecx 

ciclo:movb thestring(%ecx,1), %al 
movzbl %al, %eax 
movl %eax, ministring(%ecx,1) 
incl %ecx 
cmpl $3, %ecx 
jl ciclo 


movl thestring, %eax 
pushl %eax 
pushl $formats 
call printf 
addl $4, %esp 


movl $1, %eax 
movl $0, %ebx 
int $0x80 

回答

1

您没有预留足够的内存空间来包含你要创建其中空值终止ministring ......所以,当你写这个记忆,你覆盖formatd和格式的值(所以你最终将“%s”以外的东西传递给printf)。

而不是你的ministring内存位置的定义,请尝试使用以下:

ministring: .asciz " " 
代替本

而且,:

movl %eax, ministring(%ecx,1) 

我不明白你为什么AREN代替:

movb %al, ministring(%ecx,1) 

另外,如果你要打印的ministring,然后取而代之的是:

movl thestring, %eax 

这样做:

movl ministring, %eax 

代替,这也:

addl $4, %esp 

为什么不是这样:

addl $8, %esp 

我也建议你使用调试器:

  • 步骤通过代码
  • 观看包含在寄存器和存储器为您逐步完成
  • 知道该值任何分段错误的位置
+0

分段错误 – andandandand 2008-12-31 09:24:53