2017-05-19 15 views
-1

文字列の内容を逆転させるためにこの文字列操作コードがインターネット上に見つかりました。誰も文字列の長さがどのように決定されるかを説明することはできますか、ドルは文字列プログラムのどのような種類の中でも何を表していますか?インテル8086文字列反転

model small 
.stack 100h 
.data 
String1 db 'assembly language program', $ 
Length dw $-String1-1 
.code 
Main proc 
MOV AX, @data 
MOV DS, AX 
MOV SI, offset String1 
MOV CX, Length 
ADD SI, CX 
Back: MOV DL, [SI] 
MOV AH, 02H 
INT 21H 
DEC SI 
LOOP Back 
MOV AH, 4CH 
INT 21H 
End 
+1

可能な重複[? "ラベル$" のような文字列の長さを計算するときにドル記号($)はx86のアセンブリにどういう意味]:

次のコードは、問題を解決します.com/questions/10361231 /計算中の文字列の長さで計算されたドル記号の平均値) –

+0

もっと良い質問は、 "' $ 'の目的は' db 'アセンブリ言語プログラム'、$ '?"それは私が困惑している... C sriingsはnullで終了し、パスカルは開始時の長さを保持します。末尾に長さ(?)のバイトを追加するのは誰ですか? – Arkadiy

+0

アセンブリ言語の構文はアセンブラ(ターゲットではない)によって定義されているので、これは8086の質問ではありませんが、アセンブラ(masm、nasm、gasのようなプログラム)を持っています。どのようなソフトウェアを使用していますか? –

答えて

1
String1 db 'assembly language program', $ 
Length dw $-String1-1 

あなたは、このプログラムでは別の意味でそれぞれを2 $ -signsを得ました。

  • 最初の$は、DOS文字列出力関数09hで必要とされる文字列ターミネータ記号です。通常、これは...program','$'と書かれなければならないか、単に文字列...program$'の残りの部分に含まれなければなりません。
  • 2番目の$は、現在のアドレスを表す特別なアセンブラシンボルです。アセンブラがどの行にあっても$には現在のアドレスがあります。

2番目のケースに注目しましょう。

行のString1 db 'assembly...'では、ユーザ定義シンボルは、文字列がメモリ内で開始されるアドレスを表します。は、メモリ内で開始されるアドレスを表します。アセンブラがその後にLength dw ...行を処理すると、$にはこの行のアドレスがあり、その結果、前の行の末尾のアドレスも(両方とも同じです)。
文字列の開始位置(String1)と終了位置($)を知っているので、単純に減算すれば、長さはLength dw $-String1で十分です。
$文字を終了する文字列をカウントに含めないようにするため、1を減算します。 Length dw $-String1-1


あなたがインターネット上で見つけたものに注意してください!このプログラムは間違っています。それは誤って終端の$文字を含むが、文字列の最初の文字を使用することを忘れてしまう。 // stackoverflowの: - (HTTPの

MOV SI, offset String1 
    MOV CX, Length 
    ADD SI, CX 
Back: 
    DEC SI 
    MOV DL, [SI] 
    MOV AH, 02h 
    INT 21h 
    LOOP Back 
関連する問題