2

DB 20, 22理由がわからないまま、しばらくの間、文字列を定義してきました。

最初のバイトはバッファ サイズで、2 番目のバイトは文字列に使用されるバイト数を保持することを読みましたが、両方の値が必須かどうかはわかりません。たとえば、文字列を定義してレジスタをポイントしたい場合、+2 を使用してこれらの 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 が文字数であることをどのように認識しますか? 私はおそらくナンセンスを言っていますが、これらの問題に関する明確化に感謝します

4

2 に答える 2

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 文字までの文字列には 1 バイトが適しています。それよりも長い文字列を処理する必要がある場合は、文字列の長さを 2 バイトに標準化することをお勧めします。

どちらを選択しても、出力関数はそれを処理する方法を知る必要があります。

ところで、長さのプレフィックス付きの文字列が必要な場合は、長さを手動でコーディングしないでください。アセンブラにそれを理解させます。

myString db myStringEnd - $
         db 'hello, world'
myStringEnd equ $
于 2013-06-25T20:45:21.650 に答える