2017-08-11 37 views
1

我寫這個簡單的代碼來嘗試打印之前修改字符串:大會:如何打印之前編輯字符串它

.data 

    stringaOut:   .ascii "000000\n" 
    stringaOut_len:  .long - stringaOut 

    .text    
     .global main 

    main: 

     leal stringaOut, %esi 
     movl $49, 0(%esi) 
     movl $49, 1(%esi) 
     movl $49, 2(%esi) 
     movl $49, 3(%esi) 
     movl $49, 4(%esi) 
     movl $49, 5(%esi) 
     movl $49, 6(%esi) 

     movl $4, %eax 
     movl $1, %ebx 
     leal stringaOut, %ecx 
     movl stringaOut_len, %edx 
     int $0x80 

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

我覺得應該與1改變零字符串中,但爲什麼不打印什麼?

+0

它在這裏打印。 – Jester

回答

2

movl移動一個整數(32位)的l。你想要的是movb它移動一個單一的b yte(8位)。否則,每個分配都會不必要地覆蓋接下來的3個字符。

+0

雖然這是真的,但它並不真正相關(除了覆蓋最後一行)。它應該,並且仍然打印@ 1111111' – Jester

+0

@Jester我看不出有什麼問題。這可能是OP的機器只在打印換行符時纔打印,或者與需要4字節對齊的文字有關。 – cdo256

+0

Ahha,你說得對,這是一個問題,因爲它不僅覆蓋了行的末尾,而且還直接在字符串之後覆蓋存儲在內存中的長度。 – Jester