2016-10-10 90 views
3

我正在嘗試編寫一個程序,它從文本文件中獲取二進制輸入並將其作爲參數發送給彙編函數。該彙編函數必須將這個二進制輸入打印到屏幕上。輸入通過地址從c代碼發送到彙編代碼。操作碼和操作數錯誤的組合無效

當我嘗試組裝我的asm文件時,在mov msg, [esp+8]行上出現「操作碼和操作數的無效組合」錯誤。我想將我的char arg從堆棧複製到我的靜態變量。爲什麼這不是一個有效的指令?

完整的代碼是:

segment .data 
     len equ 31 
segment .bss 
     msg resb 0 
segment .text 
global sequence_generator 

sequence_generator: 

     push ebp 
     mov ebp, esp 
     mov msg, [esp+8] 

     mov eax,4 
     mov ebx,1 
     mov ecx,msg 
     mov edx,len 
     int 80h 

     pop ebp 
     ret 
+1

'mov msg,[esp + 8]'你認爲這是在做什麼?這個'味精resb 0'?並且'edx'等於31是否意味着?那麼C代碼將總是發送31個以上的字符? – Ped7g

+0

順便說一句,如果它是真正的二進制數據,它將包含不可打印的字符,這在Linux中不起作用,所以可能你可能想對它們做一些處理以將不可打印的值更改爲「'。」或打印十六進制值而不是字節本身。 (所以從數據'''''(三倍空間)你將打印'「20 20 20」') – Ped7g

回答

4

我不知道你試圖在這一行做:

mov msg, [esp+8] 

但你不能從內存mov E要記憶。例如,請參閱this頁面。

如果你想從內存移動內存到內存,使用一個寄存器作爲臨時存儲。例如:

mov eax, [var1] 
mov [var2], eax