• 締切済み

asアセンブラに関しまして

movl $(__KERNEL_CS << 16),%eax movw %ax,%dx 上記のソースに関しまして、32bit レジスタ %eax に格納した値を次の行で、 16bit レジスタ%dx に代入していますが。 この時、%ax の指している16ビットの範囲は、%eax の下位16bit になるのでしょうか?

みんなの回答

回答No.2

gnu as ということで、gcc など使えると考えて回答します。(windows等は詳しくないです) この質問というよりも一般的な回答ですが。 コードは、カーネル内とかカーネルのブート中なのかもしれないですが 適当なOS上でテストプログラム作って,gdb使えば簡単だと思います。 具体的にはステップ実行して、レジスタの内容を見ます。 私もアセンブラはあまり詳しくないので、アセンブラで全部書くのは苦なので ---------- int main(void) { return 0; } ----------- みたいなのを、 gcc -S hoge.c とすれば、gcc が細かい部分を作ってくれるので この中に 質問の部分の コード埋めればいいと思います。 私のところではこんな風だったので ---------------- .file "hoge.c" .text .globl main .type main, @function main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp pushl %ecx movl $0, %eax popl %ecx popl %ebp leal -4(%ecx), %esp ret .size main, .-main .ident "GCC: (GNU) 4.1.1" .section .note.GNU-stack,"",@progbits ----------------------- こんな風にコードを入れればいいと思います。 ----------------------- .file "hoge.c" .text .globl main .type main, @function main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp pushl %ecx movl $(0x44 << 16),%eax movw %ax,%dx movl $0, %eax popl %ecx popl %ebp leal -4(%ecx), %esp ret .size main, .-main .ident "GCC: (GNU) 4.1.1" .section .note.GNU-stack,"",@progbits --------------------- とやればいいと思います。 で、 hoge.s ができるので gcc -g hoge.s して gdb でステップ実行して下さい。 gdb でレジスタ見たい場合は info r です。 どこにコード挿入すればいいかは、 いろいろ関数作って試していけば分かるかもしれません。

全文を見る
すると、全ての回答が全文表示されます。
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

なります。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • アセンブラの読み方

    お世話になります。 アセンブラを勉強しています。 下記について教えていただけないでしょうか。 よろしくお願いいたします。 1 .file 2 .data 3 var: .long 0x1234 4.text 5 .global main 6 main: 7 movb $1, %al // 値1をレジスタalに代入 8 push %eax // レジスタeaxの内容をスタックに格納 9 call IncReg // 関数呼び出し 10 pop %eax // スタックからレジスタeaxに引き出し 11 push var // 変数varの内容をスタックに格納 12 call IncReg // 関数呼び出し 13 pop %ecx // スタックからレジスタecxに引き出し 14 ret // リターン 15 IncReg: 16 movl %esp, %ebp // pushによって動いたスタックの先頭アドレスをレジスタ ebp に代入 17 movl 4(%ebp), %edx // mainから渡された eax(var) の値をレジスタ edx に代入 18 incw %edx // レジスタ edx の値を2増やす 19 movl %edx, 4(%ebp) // 2増やしたものを引数のあるスタックの場所に代入 20 ret // リターン (質問) 7 でレジスタ al に 1 を代入したのは何か意味があるのでしょうか。 17 の4(%ebp)はスタックポインタの1つ下、つまりmainから渡された引数でよろしいでしょうか。 18 の incw %edx はレジスタ edx の値を 2 増やすという意味でよろしいでしょうか。 13 でレジスタ ecx の値は 1236 になるので正しいでしょうか。

  • 情報の問題

    インターネットで調べたのですが下の問題が解けるようになりません。 解答を見ればなんとなく理解できる気がするので、どなたか解答お願いします。 (1)32ビット符号なし整数がDX_AXレジスタに与えられているとき、この値を2倍したものを、再びDX_AXレジスタに求める命令をかけ。ただし、オーバーフローは考えなくてよい。 (2)2つの32ビット整数a,bがDX_AX,CX_BXレジスタに与えられているとき、a-bの値を求め再びDX_AXレジスタに代入する命令を示しなさい。

  • アセンブラについてです。

    シフト命令の乗算、徐算の仕組みが理解できなくてこまってます。 乗算について例をあげます。 8ビット符号なし整数のAL、BLにそれぞれ数値x,yを代入したとします。また、ここでDXはxy(答え)だとします。 次にBLが正ならBLを1bitシフトします。つぎにCF(BLのLSBが入ったキャリーフラグ)が1or0で判断します。0ならそのまま、1ならDX←DX+AXとします。最後ににALを1bit左シフトします。あとはBLが正か負かの処理命令までLOOPします。 確かに実際に値を代入したり、2進数で一つずつ行っても結果は出るのですが、何故BLを右シフトや、ALを左シフト、CFが1or0で区別するのかがわからないです。理解しないままただ作業している状態なので、詳しく説明していただけたら嬉しいです。できることなら、徐算についても同様に説明しただけると嬉しいです。お願いします。

  • nasmにおけるレジスタの指定

    自分はlinuxでアセンブリ言語の学習をしている者です。 32bit 汎用レジスタ eax の下位16bit の 上位8bit と 下位8bit の指定はそれぞれ ・ah ・al だと思いますが。 上位16bit における 上位8bit と 下位8bit の指定方法、又 eaxレジスタの 下位16bit と 上位16bit の指定方法がわかりません。 稚拙な質問で大変恐縮ですが、ご教授の程お願い致します。

  • アドレス指定方式での、命令語が参照する番地

    16進数で”C13B0206”という32ビットの命令語があります。 <命令語の仕様> 0~7ビット:命令指示部 8~10ビット:レジスタ 11~15ビット:アドレス修飾部 16~31ビット:番地 <アドレス修飾と参照番地の関係> 00 0固定 直接アドレス (11,12の値が00、13~15の値が0固定のとき、直接アドレス。) 01 0固定 間接アドレス 10 インデックスレジスタ インデックスレジスタ+番地の値 11 インデックスレジスタ インデックスレジスタ+番地が示す内容の値 <主記憶、レジスタの状態> ●主記憶に格納されている値(16進数) 番地(16進数)が  202,203,204,205,206,208,209,20A...の順に、それぞれの格納値は、 203,204,205,206,208,209,20A,20B...。 ●インデックスレジスタに格納されている値(16進数) インデックスレジスタ番号(16進数)が1,2,3,4,5… の順に、それぞれの格納値は、 0,1,2,3,4…。 (1) アドレス修飾部のインデックスレジスタ番号。 命令語の”C13B0206”で、アドレス修飾部にあたるのが”3B”。00111011(2進数)。8~10ビットの001がレジスタになるから、3。 (2)命令の番地部の番地の値(16進数) 命令の番地部の番地の値。命令部では、”0206”。ちょうど16進数なので、206。 (3) 命令が最終的に参照する番地。 上の、<主記憶、レジスタの状態>より、11~15ビットが”1011”。 インデックス番号が11(2進数)なので、3(16進数)。インデックスレジスタ番号が3のとき、格納されているのは2。番地の値である206と3を合わせ、209。 最終的に参照される番地は209。 (1)(2)(3)、自分の解き方が正しいのかどうか自信がありません。どなたか補足、訂正などありましたら、よろしくお願いいたします。

  • アセンブリ言語の質問です

    「 100人分の試験点数がある。 一人分のデータは32bit 符号無し整数でそれが連続して格納されている.先頭のアドレスがEAXで与えられる時,全員の点数の合計をEAXに入れて戻るようなサブルーチンをアセンブリ言語で書きなさい。 • loop unrollingを使用して,ループ内容を4倍に展開して,条件分岐数を減らすこと • 他のレジスタの値は保存すること • 合計点はEAXレジスタに十分納まるものとする。 • 次のような命令を使ってよい。 ADD EAX, [EBX] 」 というような問題が出て自分で解答を作ってみたのですがこれでよいのでしょうか?詳しい方ご検討よろしくお願いいたします。 PUSH EBX(EBXをスタックにおいておく) PUSH ECX(ECXをスタックにおいておく) MOV ECX 25(ECXに25を代入。4回の操作を25回すれば100回になるからである。) label0:ADD EAX [EAX] ([EAX]をEAXに加算) ADD EAX [EAX+1]([EAX+1]をEAXに加算) ADD EAX [EAX+2]([EAX+2]をEAXに加算) ADD EAX [EAX+3]([EAX+3]をEAXに加算) MOV [EAX] [EAX+4]([EAX]を[EAX+4]に移動させる) EBX=EBX+1 (EBXはこのループを何回やったか、という数) CMP ECX EBX(25とEBXを比べる) JNZ:label0(比べてEBXが25になってないならば繰り返す。25になったら終了。) POP EBX(EBXをスタックから戻す) POP ECX(EBXをスタックから戻す)

  • PICでのAD変換について

    PIC16F873を使って、入力信号のAD変換をして、基準値との差により、PWM信号を生成しようとしています。 変換結果の上位8bitがADRESHレジスタに格納されるということなのですが、PWMの周波数を確保するため、できればこの8bitの値をを7bitに落としたいと考えています。 何か方法があれば教えてください。

  • CPUの回路について教えてほしいです!

    ・5ビットCPU:CPUが5ビットずつ読み出し専用メモリからデータを取り込む。 ・レジスタ:2ビットを記憶できるレジスタを1つ持っている。 ・アドレス空間:CPUは2ビットの異なるアドレスを参照できる。 ・メモリ:読み出し専用メモリと書き込み専用メモリを持っている。読み出し専用は5ビット、4ワード。書き込み専用は2ビット、1ワード ・機械語:5ビット中、上位3ビットがOPコード、下位2ビットがオペランドとなる。 ・命令:CPUの命令は以下の5種類。 ・加算命令:レジスタの値とオペランドの値を加算し、その値をレジスタにセット。 ・減算命令:レジスタの値からオペランドの値を減算し、その値をレジスタにセット。 ・ロード命令:オペランドの値をレジスタにセット。 ・ストア命令:書き込み専用メモリにレジスタの数値を書き込む。下位2ビットは無視される。 ・ジャンプ命令:オペランドの値が示す読み出し専用メモリのアドレスに書かれた命令を次に実行する命令とする。 このような仕様にに基づくUPUの回路図を教えてください。 また減算命令、ジャンプ命令、メモリへの書き込みをするような回路について文章でよいので説明していただけるとありがたいです。

  • 非常に限定された条件での8バイト加算

    アセンブリプログラム上で16ビット同士を加算したいと考えています。 ただ、非常に条件が限定されていて、 【簡単な構成について】 ・レジスタは8ビットAレジスタ一つのみ ・8ビット演算器(ALU)は一つのみ ・条件コードはZフラグのみ(ただし、書き換わるのは命令7.、8.でのみ) 【使える命令】 1.Aレジスタに即値をロード 2.Aレジスタに指定アドレスのデータをロード 3.Aレジスタから指定アドレスにストア 4.無条件分岐 5.Aレジスタand即値=0ならば分岐 6.Aレジスタor即値=0ならば分岐 7.Aレジスタと即値のandをとって書き戻し 8.Aレジスタと即値のorをとって書き戻し 9.Aレジスタと即値を加算して書き戻し a.Aレジスタと指定アドレスのEORをとって書き戻し b.Aレジスタと指定アドレスのデータを加算して書き戻し c.間接アドレスのデータをAレジスタにロード d.Aレジスタの内容を間接アドレスにストア e.Aレジスタから即値を減算して書き戻し f.Aレジスタから指定アドレスデータを減算して書き戻し 普通に考えるならば、下位8ビット同士の加算、上位8ビット同士と下位8ビットのキャリーを加算すれば出来ます。 しかしながら、この限定された条件に於いてはなんらかの自由に使えるフラグ、もう少し汎用的に使える分岐命令が無ければ無理だと個人的には考えています。 出来るか、出来ないか、だけでも結構ですので、ご教授お願いします。

  • 汎用レジスタのワーキングビットテスト

    アセンブラ初心者です。 汎用レジスタR0からR15をワーキングビットテストするアセンブラソースを書いているのですが実行すると暴走します。 汎用レジスタR0からR15をワーキングビットテストする場合、レジスタデータを一旦どこかに保存してから行うものなのでしょうか? また、R0がインデックスレジスタ(意味が良く分かってません)、R15がスタックポインタが格納されていますがこれらのレジスタも値を一旦どこかに退避しておけばテストを行ってもよいものなのでしょうか?

このQ&Aのポイント
  • 恋活サイトでの出会いについて
  • 心の準備ができていない人の悩み
  • ネットの出会いでの心の準備について
回答を見る