2013-06-25 28 views
2

我已經定義字符串使用DB 20, 22一段時間,不知道爲什麼:爲什麼需要字符串DB 20,22 dup('?')中的'20,22'?

我讀的第一個字節的緩衝區大小和第二適用於字符串中使用的字節數,但我不知道是否兩個值都是強制性的。例如,當我定義一個字符串並想將一個寄存器指向它時,我必須使用+2來跳過這兩個字符。

string DB 20, 22 dup('?') 
lea si, string+2 
lea si, [string] ; I think this is another alternative 

這讓我想知道如果我沒有他們定義字符串,我可以做lea si, string。這是可能的還是都是強制性的?另外,當我想跳過一行並將光標移動到開始處時,我做了DB 13, 10編譯器如何知道13不是緩衝區大小和10個字符數?我可能會說廢話,但任何澄清這些問題將被感謝

+0

'x dup(y)'是一種寫入''x'值'y'的副本。這對我來說似乎是一個以長度爲前綴的字符串20'?'字符,如果我們認爲長度有點偏離。 – cHao

+0

取決於你對這些字符串做什麼,因爲有幾種方法在內存中表示字符串。 –

+0

我刪除了dup(),因爲它不是我所關心的。我想知道的一件事是如果有一種方法來定義字符串,所以我可以簡單地通過'lea si,string'來指向它 – lisovaccaro

回答

2

如果你只是想要一個字符串,那麼就定義它:

myString db 'hello, world' 

然後爲你顯示出你可以解決這個問題:

lea si, myString 

但是,您可能需要知道過了多久了字符串是,或者你必須添加一個結束符,以便輸出函數知道停止。如果你想0結尾的字符串,例如:

myString db 'hello, world', 0 ; don't forget that terminator 

或者,您也可以把長字符串,這可能是你的20, 22是以前:

myString db 12, 'hello, world' 

一個字節是良好的字符串最多255個字符。如果您需要處理比這更長的字符串,則可能需要在字符串長度的兩個字節上進行標準化。

無論您選擇哪一種,輸出函數都需要知道如何處理它。順便說一下,如果你想要長度前綴的字符串,你不應該手動編碼長度。讓彙編程序爲你解決:

myString db myStringEnd - $ 
     db 'hello, world' 
myStringEnd equ $ 
+0

我真的不想在前面加長,我甚至不知道自己在做這件事。如果我這樣做:'字符串數據庫10 dup('?')'我不是給我加上任何長度的前綴?只是說我希望前10個字符是'?'。我不關心終止符,因爲我沒有直接打印字符串 – lisovaccaro

0

我認爲「數據庫20,22 dup(?)」實際上會把下面的字節放在內存中:0x14 0x00 0x00 0x00 .....( 0x00的22倍)。這種看起來像一個pascal風格的字符串,其中第一個字節包含字符串長度。

沒有必要定義這樣的字符串。

db 13,10只是表示字節「0x0d」和「0x0a」。

相關問題