2008-12-31 23 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