2016-09-18 40 views
-1

我在賠率明白爲什麼初始化使用.int的整數數組後不movl然而,隨着.byte做它的工作完美的作品「.INT」與「.BYTE」創建於GNU彙編器陣列

PS我使用的是AT & T語法只是如此,這是從一開始就

這裏明確的代碼:

.data 
    IntArray: 
     .int 1, 2 

    CharArray: 
     .byte 1,2 

.text 

    .globl _start 

    _start: 
      movl IntArray, %eax <--- fails 
      movb CharArray, %eax <-- works 

順便說一句,這是「正確」的方式向基地址複製到寄存器因爲它正在複製第一個字節而不是我想要的地址。

我已搜查幾十個在數十個環節,我只看到人們使用.byte初始化數組。那麼.int有什麼用?也許我沒有用它適當

有人能提供一些線索,請!!!!

+0

你用什麼彙編的基地址?因爲這看起來不像你使用的是GNU彙編器。 – fuz

+0

對不起,我刪除了一些被忽略的不可打印的字符。我強迫我的vim打印它們,因爲我有時會遇到一個令人討厭的問題。我從vim編輯器被直接複製(雖然去除了他們,但顯然有些就剩了:() 是的這是非常GNU彙編 – HighOnMeat

+0

我很困惑,因爲佈局是很奇怪的。通常標籤去的第一列和指令(例如'.data'或'text')與助記符(即第二列)進入相同的列。您的佈局令人困惑。 – fuz

回答

0

基於對這個問題的提示,這裏的評論是最後工作的代碼!

.data 
    IntArray: 
     .int 11, 22, 33, 44, 55 

    CharArray: 
     .byte 55, 2, 3, 4 

.bss 
    .comm BufferSpace, 1000 

.text 

    .globl _start 

    _start: 
      movl $IntArray, %eax 
      movl $2, %ebx 
      movl 0(%eax, %ebx, 4), %edx 
      movl $99, 0(%eax, %ebx, 4) 
      nop 

      #exit the program 
      movl $1, %eax 
      movl $0, %ebx 
      int $0x80 

正在作出一些愚蠢的錯誤,因爲指出了關於章的名稱和大小,以及不使用$得到陣列

+0

這甚至不回答這個問題。 'movb ,%eax'也會失敗,即使是'movb(%eax,%ebx,1),%eax' –

+0

除了彙編器分散的警告信息,它會用al替換eax,它會組裝並鏈接而不會出現故障 – HighOnMeat

+0

我的觀點是,這個答案並不能解釋'movb CharArray,%eax'到底是什麼問題,而且這個「答案」根本就不使用CharArray。我很高興你解決了你的問題,並且發佈你的工作版本作爲答案通常是件好事,但我不確定這會幫助其他人解決同樣的問題。 (也許會,如果他們也閱讀所有其他評論等,但SO答案應該自己站立)。 –

1
movb CharArray, %eax 

movb移動一個字節。 eax是一個雙字寄存器,您不能將一個字節移動到一個雙字寄存器mov。無論是使用movzblmovsbl做延伸的零或符號擴展移動或更改目的地註冊到像%al一個字節的寄存器。

這是我看到的是你的代碼錯誤的嘛。不知道你爲什麼認爲.int有問題。

+0

沒有人爲你明顯的人!儘管如此,它現在正在工作。謝謝 – HighOnMeat

+0

@HighOnMeat當問題解決後,不要忘記接受答案。否則,人們可能會認爲你仍然需要幫助並浪費時間。 – fuz