2

私はJavaでたくさんプログラミングし、Pythonの基本を知っていて、時々c ++で遊んでいます...そしてそれらはすべて高級プログラミング言語であり、それらは素晴らしいですが、これで物事がより深いレベルでどのように機能するかについて興味がありましたケースアセンブリ言語...x86プロセッサのアセンブリを学び始め、アセンブラとしてNASMを選択しました。レジスターとスタックがどのように機能するか、情報がどのように格納されるか、情報を変更する方法、読み取りだけでなく練習、デバッガーの使用などを学ぶのに時間を費やしました。

つまり、入力から何かを読み取ると、対応するASCII値としてメモリに保存され、問題ありません...パス全体のオフセットと長さを使用してコンソールに読み書きする方法の基本を理解しています。ただし、前述したように、数値を含む文字はASCII値として格納されます。0は0x30として格納され、1は0x31として格納されます。つまり、1桁がバイト全体として格納されることを意味し、これは不利な点と見なされます。 1バイトで255までの数値を表すことができるので、数学演算を実行して他のデータ用のスペースを残すために多くのメモリと時間を節約できます... c ++などの言語では、整数値は4バイトで表されます。つまり、これらの言語では次のことができます。 4294967295までの整数を格納します

要点を理解する...私が本当に知りたいのは、数値を表現し、nasmを使用して基本的な算術演算を実行するための最良のアプローチは何ですか。それらの数値をASCII値のままにして、バイトレベルで演算を実行する必要がありますか。バイトがより大きな値を保持できるように、これらの数値を変換しますか?または、より効率的に数字を読み取る方法はありますか?

PS:長い投稿で申し訳ありませんが、私はあなたたちがそれに基づいて私を助けることができるように私の懸念の全体的な背景を伝えたかっただけです...そして悪い英語のために...私はできるだけ明確にしようとしました(英語は私の母国語ではありませんが、私はできる限りそれを理解しようとしています...それは私がプログラミングしているときに英語を知るのに大いに役立ちます)

4

4 に答える 4

0

ASCIIから変換します。それはすべてをより簡単にします、ASCII数を掛けることを想像してください。また、ASCIIを使用して複数の数字がある場合は、非常に煩わしいものになる可能性があります。また、複数バイトの変数を宣言することもできます。

b=バイト

w =ワード(2バイト)

dw =ダブルワード(4バイト)

var1 w   0000h ;
var2 dw   0007h
var3 b 0000h

このようにして、コンソールから入力を取得できます。1桁だけ:

mov ah, 1  ;int 21h (interrupt 21h) in the next line is a function that can do many things
int 21h    ;depending on the value you put in register "ah". Using 1 it reads input the value is stored in "al"
add al, -48 ;ascii -> bin .. here you substract 48 to transform from ASCII
mov [var1],al

このように2つの数値を追加できます(負の数には何か余分なものが必要です)。

[var1] = [var1] + [var2]

mov al,[var2]
add al, [var1]
mov [var1],al

CPUには通常、乗算するための命令もあります

これをチェックしてください。8086プロセッサ用の命令セットです。これが、実行するように指示できるすべてのことです。 8086命令セット

于 2012-11-28T01:16:51.313 に答える
0

他の言語と同じように:文字列があり、それに対して数値演算を実行したい場合は、それを数値に変換します。プロセッサの一般的なレジスタに収まらない場合を除きます。

私は今、あなたがどの命令セットをターゲットにしているのかわかりませんが、例えば。x86-64には、数値を保持するための8ビット、16ビット、32ビット、および64ビットの汎用レジスタがあります。数値が64ビット(x86-64)に収まらない場合は、状況が少し複雑になる可能性があります。ターゲットとするアーキテクチャで利用可能な最大範囲の数値が必要な場合は、可能な限り最大のレジスタまたはメモリに数値を格納するのが最善の方法です。

高水準言語とは対照的に、アセンブリレベルでは、符号付き変数と符号なし変数の間に違いはなく、処理方法にのみ依存します。imulただし、符号付き乗算()、符号付き除算( )、idiv符号なし乗算(mul)、符号なし除算()など、符号付きおよび符号なしの演算がありますdiv

于 2012-11-28T01:17:06.570 に答える
0

まず、できません...繰り返しますが、アセンブリを高級言語と比較することはできません。データの保存方法と操作方法はまったく異なります。彼らはプログラマーの生活を楽にするためにそれを行います。charのASCIIコードをDWORDとして保存する場合は、先に進んでください。

組み立てでは、手をつなぐことは絶対にありません。CPUは、ファイル内のバイトであれ、キーボードに入力された文字であれ、データをどのように処理するかを認識していません。

あなたはAssemblyですべてを自分で行います。キーボードで押す文字はASCIIです。これは、入力したときに表示される文字です。他のことをしたい場合は、プログラマーが必要に応じて変換します。

ASCII数値から数値への変換は簡単です。

Numbers: 0  1  2  3  4  5  6  7  8  9
ASCII:   48 49 50 51 52 53 54 55 56 57

それらの違いがわかりますか?48は魔法の数です。

文字列をループし、各桁をテストして48〜57であるかどうかを確認します。それ以外の場合は、スキップします。ASCII文字が48から57の間の場合、文字から48を引くと、数値が得られます。48を追加して、その数値のASCII文字を取得します。

atodw / atoiなどを使用するように言わずに、自分で行うことでより多くを学ぶことができます。それは難しいことではありません。

于 2012-11-28T01:36:10.970 に答える
-2

ASCII文字は数字ではありません。

atoi関数を使用する必要があります。

于 2012-11-28T01:17:19.113 に答える