2016-11-12 44 views
2

當我試圖使用NASM作出彙編代碼程序,但由於某些原因,它不斷給我一個錯誤。它表示在我聲明一個字符串後,它期待逗號,冒號,裝飾器或行尾,但我不明白它是如何成爲問題的。請指教。NASM:「逗號,冒號,裝飾或操作結束後的預計行結束」聲明字符串

section .text 
     global main 
main: 
     mov edi,str 
lab3: 
     cmp [edi],' ' 
     je lab1 

     cmp [edi],0x0 
     je lab2 

     mov eax,4 
     mov ebx,1 
     mov ecx,edi 
     mov edx,1 
     int 0x80 
     inc edi 
     jmp lab3 
lab1: 
     inc edi 
     mov eax,4 
     mov ebx,1 
     mov ecx,nwln 
     mov edx,1 
     int 0x80 
     jmp lab3 

lab2: 
     mov eax,1 
     int 0x80 

section .data 
str db 'this is a test',0x0  ;this is the line giving the error 
nwln db 0xa 
+0

nasm在標籤後面需要冒號,即'str:db'這是一個測試',0x0 – Jester

+0

@Jester:不,它不會,只有當它們也是有效的助記符時:P這就是爲什麼'-Worphan-標籤「選項存在。 OP的程序在將'str'改爲'str1'時進行彙編。 (除了'cmp mem,immediate'指令中丟失的操作數大小以外) –

+3

總是使用它更好,而不是頭痛。另外,如果明年英特爾推出一個與您的標籤名稱相沖突的新指令,會發生什麼...... – Jester

回答

6

STR(存儲任務寄存器)是指令助記符。您將它用作不帶冒號的標籤。 str: db ...會工作。

YASM這裏給出一個更有用的錯誤消息:string.asm:33: error: unexpected DB/DW/etc. after instruction


這是很好的做法,始終使用:標籤名稱後,無論你是標記代碼或數據。它對於讀者來說更加清晰,並且對將來的指令助記符或彙編指令有更多的面向未來的證明。

這也是一個好主意,構建與-Worphan-labels,所以你得到一個警告,如果你本身寫一行像cqde(不cqde:)。沒有這個選擇,它會在這條線上放上一個標籤。使用該選項,您會收到警告並注意到您輸入cdqe! (或任何其他無操作數的x86指令。)


BTW,不要忘記用一個立即和內存操作指令時使用cmp byte [edi],' '數大小改性劑,因爲它不會與組裝模糊的操作數大小。

此外,使用有意義的標籤名稱。像.space_found而不是lab1