• ベストアンサー

機械語に直すことについて。

疑問点なのですが、 ① 先ほどの例は、下位3ビットがレジスタになっている!というのは、$0xの事か、0xのxのことでしょうか?教えていただけないでしょうか?すみません。 ② 0xba と 0x04 0x00 0x00 0x00が、値だったという事。 なぜ、32ビットなのに0xbaが付くのでしょうか?教えていただけないでしょうか?1 32ビットのリトルの4はいくつになるかを考えればOKです。 これはどういう意味でしょうか?教えていただけないでしょうか? 教えていただけないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

>ではなぜ、アセンブリ言語に$0x0が書かれていないのでしょうか?教えていただけないでしょうか?すみません。 さっき、これ書いたのに。。 8ビットで、$0x4と$0x04は同じですよ。 16ビットで0x0004でも同じです。 当然32ビットで0x00000004でも同じです。 値としては同じ物です。 100円を、0000100円とは書かないように、先頭の0が省略 されてるだけです。 アセンブル前は、ビット幅はないので、 命令をアセンブルしてやっと、その数字が 8ビットだった、16ビットだった、32ビットだったことが わかって0埋めされるわけです。 もちろん、0x00000004と書いてもいいのですが。 前にも言った通り、アセンブラには、方言が多くあり、 imm32を0x00000004にしてるものもあれば、 0x4にするものもあります。 しかし、値としては同じ物なんです。 なぜなら、オペが32ビットだと指定したからです。

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

その他の回答 (3)

回答No.3

もう一つ補足が付いてたので、こちらにも書いておきます。 >$0x4に、$0x0は、三つ続かないのでしょうか?教えていただけないでしょうか?すみません。 ついてますよ。 リトルなので、 0x04 の32ビットの値は0x00000004ですから、 メモリは04 00 00 00ですよね? 命令の後に入っている04 00 00 00これがそれです。 したがって、 「$0x4に、$0x0は、三つ続かないのでしょうか?」 見ての通り続いてます。 見落としてるだけですよ。

zasx1097
質問者

補足

ではなぜ、アセンブリ言語に$0x0が書かれていないのでしょうか?教えていただけないでしょうか?すみません。

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

>なぜ、04 00 00 00が、アセンブリ言語では、 $0x4だけなのでしょうか? ? 8ビットで、$0x4と$0x04は同じですよ。 16ビットで0x0004でも同じです。 当然32ビットで0x00000004でも同じです。 値としては同じ物です。 100円を、0000100円とは書かないように、先頭の0が省略 されてるだけです。 で、Intelはリトルなので、 0x00000004はメモリ上に 04 00 00 00と格納される。 >retfという命令は、どこに載っていたのでしょうか?教えていただけないでしょうか?すみません。 https://www.it-swarm-ja.com/ja/assembly/ret%e3%80%81retn%e3%80%81retf%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95/967033921/ にでも https://web.itu.edu.tr/kesgin/mul06/intel/instr/ret_retf.html ここにも、 https://www.felixcloutier.com/x86/ret ここでも、 と、どこに乗ってるかというより、 リファレンスレベルの命令なので 全部にあると思っていいのですが。 オペがC3なら、NEARのRET オペがCBなら、FARのRETと 記載されています。 しかし、RETだと、アセンブラが命令を選べないので、 RET/RETFで区別しているという感じです。 だから!「一対一」だって固定概念を捨てないと、 面倒だよってのは、こういう事です。 今度こそ解決しましたね~この件。 なお、古い技術では、命令の中に命令を書くなんて 技もあったりしましたがね。 今、オペ1にパラメーター4バイトの合計5バイトあったわけですが、 mov eax,#値。の「先頭文字だけ」を書き出す。 call -4 ; #値の部分に別のマシン語を置いておき最後にRETを書いておく。 つまり、3バイトの長さを持つ何らかの命令と最後にRET なので、0xC3000000|3バイトの命令 と、命令の中に命令を書いて逆アセンブルができないようにする テクニックなども、はやりましたけどね。 (これは覚えなくてもいいです。今はこんなテク、化石レベルなので) ただ、「一対一」ってのが、「ちがうんじゃないか」って のが、なんとなくでも感じられたら、今はそれでいいと思いますよ。

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

① 先ほどの例は、下位3ビットがレジスタになっている!というのは、$0xの事か、0xのxのことでしょうか?教えていただけないでしょうか?すみません。 どっちでもないです。0xの「x」は16進数の事です。 ですので、0xBAを2進数にする。 1011 1010 下位3ビットは 010つまり2です。 なので、2番レジスターを扱うB8という命令だったという意味です。 ② 0xba と 0x04 0x00 0x00 0x00が、値だったという事。 なぜ、32ビットなのに0xbaが付くのでしょうか?教えていただけないでしょうか?1 32ビットのリトルの4はいくつになるかを考えればOKです。 これはどういう意味でしょうか?教えていただけないでしょうか? 教えていただけないでしょうか? ビッグエンディアンとリトルエンディアンを覚えましょう。 Intelはリトルです。 32ビットの4は0x04 0x00 0x00 0x00 です。しかしこれだけ(imm32=即値32ビット)を 書いても「命令がない」ので、先頭に0xbaが付いたという事。

zasx1097
質問者

お礼

$0x4に、$0x0は、三つ続かないのでしょうか?教えていただけないでしょうか?すみません。

zasx1097
質問者

補足

なぜ、04 00 00 00が、アセンブリ言語では、 $0x4だけなのでしょうか?教えていただけないでしょうか?すみません。それと、retfという命令は、どこに載っていたのでしょうか?教えていただけないでしょうか?すみません。

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

関連するQ&A

  • 機械語に直すことについて。

    imm32を0x00000004にしてるものもあれば、 0x4にするものもあります。 しかし、値としては同じ物なんです。 なぜなら、オペが32ビットだと指定したからです。 以下のURL: https://sp.okwave.jp/qa/q9895187.html とは、4の前の0を省略する書き方もあるという事でしょうか?オペが32ビットだと指定したからです。とはどういう事でしょうか?教えていただけないでしょうか?すみません。

  • 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ビットのキャリーを加算すれば出来ます。 しかしながら、この限定された条件に於いてはなんらかの自由に使えるフラグ、もう少し汎用的に使える分岐命令が無ければ無理だと個人的には考えています。 出来るか、出来ないか、だけでも結構ですので、ご教授お願いします。

  • 排他的論理和の問題

    以下の問題の回答を読んでも意味がわかりません。どなたか、もっと詳しく説明お願いします。 【問】 任意の8ビットのデータXと、8ビットのデータ00001111をビット毎に排他的論理和をとった結果はどれか。ここで、各1ビットのデータAとデータBの排他的論理和をとったCの値は次のように表される。また、データの左方を上位、右方を下位と呼ぶ。 A B C ‐‐‐‐‐‐‐‐ 0 0 0 0 1 1 1 0 1 1 1 0 【選択肢】 ア、Xの上位4ビットすべての0、1が反転し、下位4ビットは全て1になる。 イ、Xの上位4ビットすべての0、1が反転し、下位4ビットはそのまま残る。 ウ、Xの上位4ビットはすべて0で、下位4ビットすべての0、1が反転する。 エ、Xの上位4ビットはそのままで、下位4ビットすべての0、1が反転する。 【解】 エ 【解説】 問題文中の表からもわかるように、データBのある1桁の値が0だった場合、データAの値はそのままです。一方で、データBのある1桁の値が1であると、データAの値は必ず反転します。データBのビット列は、00001111ですから、データAの上位4ビットはそのまま、下位4ビットは全て反転すると考えられます。 解説の「~データAの値は必ず反転します」までは理解できるのですが、なんでいきなりデータBのビット列が00001111なのか意味が分かりません。これは表から読み取るもの?それともこの問題でデータBがデータXということを示しているのでしょうか。 情報系素人なもので、助言よろしくお願い致します!

  • DTCのレジスタ情報設定方法についてご教示ください。

    DTCのレジスタ情報設定方法についてご教示ください。 はじめまして。 現在、SH7145マイコンを使って、DTC、SCIを使用したシリアル通信を 考えておりますが、以下の点で困っております。 転送情報を設定するために、 DTBRに転送情報の先頭アドレス上位16ビット、 DTCベクタアドレス(TXI_0 0x0000043A)に先頭アドレスの下位16ビット を設定しているのですが、0x0000043A番地にアドレスが設定されません。 HEWのデバッガを使用しており、0x0000043A番地を見るとFF FFのままです。 デバッガで0x0000043A番地に、直接下位16ビットの値を設定し、 0x0000043A番地を読みに行った場合には、設定した値を取得出来ました。 そこでプログラム中で正しくアドレスを設定する方法についてご教示ください。 また、DTCベクタアドレス(0x00000400番地から)はROMエリアになる事により、 HEWのビルドの設定等で対応することになるのでしょうか? 以上、よろしくお願いいたします。

  • PICの「SWAPF」の意味について

    PICを学びはじめたばかりの初学者です。混乱してしまい、バイト命令「SWAPF」の意味がわかりません。 質問1: 「SWAPF」という命令は「ファイルレジスタfの上位4ビットと下位4ビットを入替えた結果を(d)に入れる」と出ています。 http://homepage3.nifty.com/mitt/pic/pic42_1.html この「上位4ビットと下位4ビットを入替え」というのは例えば次のようにすることを言うのですか? ----------- (SWAPF前) 上位4ビット 下位4ビット △△△△   □□□□ (SWAPF後) 上位4ビット 下位4ビット □□□□   △△△△ ----------- 質問2: 質問1が正しいとしたら、次の記述の訳はどのようなことなのですか? こちらのページを拝見しますと、下記引用のようになっています。 http://www.picfun.com/arch09.html ----ここから引用-------------------- 【スワップ命令の使い方】 SWAP命令を有効に使う例は、下記のような場合です。 例1 割り込み時のレジスタの待避、復帰     SWAP命令がSTATUSに影響しないことを利用しています。 PUSH  MOVWF  W_TEMP    ;Wレジスタ待避     SWAPF  STATUS,W  ;STATUS取り出し     MOVWF  ST_TEMP   ;STATUS待避 ----ここまで引用-------------------- ↑この中の「;STATUS取り出し」のところですが、「SWAPF」を使って「上位4ビットと下位4ビットを入替え」てからでないとSTATUSのHとLを取り出すことが出来ないのでしょうか? 質問3: もし、 「SWAPF」を使って「上位4ビットと下位4ビットを入替え」てからでないとSTATUSのHとLを取り出すことが出来ない、 のだとしたら、それはPICの仕組み上のことなのでしょうか? 初学者の質問で馬鹿らしいかもしれません。ご解答が面倒で無い方がいらしたら、どうぞご教示よろしくお願いいたします。

  • PIC、TMR2とPWMについて。(再投稿)

    カテ違いなのか説明が悪いのか回答が付かなかったので 再投稿しました。 PWMでTMR2の10ビットの理屈がわかりません。 まず現状の理解ですが以下のとおりです。 ・分解能10ビットでPWMを使うにはPRxを255に設定する。  PRxに設定した値がTMR2のカウント最大値になる。  PRxを255に設定したのでTMR2も255までカウントされる。  (PRxに設定した値がPWMの周期として動作する最大値) ・パルスの幅はCCPRxL(上位8ビット)および、DCxB1,DCxB0(下位2ビット)の10ビットで設定する。 実際のPWMの動作は以下のとおり CCPRxL,DCxB1,DCxB0 の10ビット ↓コピー CCPRxH(10ビット) ↓比較 一致でPWMの出力が反転 TMR2(上位8ビット + 謎の下位2ビット) ↑比較 一致でTMR2 + 謎の下位2ビットがクリア PRx(8ビット) わからないぶぶんなんですが 1、TMR2の下位2ビットって具体的にどのレジスタなんでしょうか。 2、プリスケーラを設定しない場合(等倍)はPSという2ビットが付加されTMR2は10ビットカウンタとして 動作するとなっていましたが、0,1,2,...1023までカウントされるんでしょうか。 3、TxCKPS1,TxCKPS0 に値をセットしてプリスケーラを4,8,64等にした場合 TMR2の8ビットと下位2ビットはどういう関係になるんでしょうか。 単純に1024階調(0-1023) * 4tocs * プリスケール値 で0から1023までカウントされると考えていいんでしょうか。 4、PRxは8ビットしかないのにTMR2 + 2ビットの10ビットとどうやって比較されてるんでしょうか。 たとえばDCxB1,DCxB0(下位2ビット) のみ設定してCCPRxL(上位8ビット)を0にした場合、何と比較されるんでしょうか。 5、TMR2をスタートする前にカウンタをリセットしますが10ビット分リセットするにはTMR2のクリアと下位2ビットはどのレジスタをクリアすればいいんでしょうか。 PICは16F1936を使ってます。 MPLAB X + XC8で開発してます。 説明がわかりずらいかもしれませんが上記の部分がいまいち理解できません。 この辺の事に詳しい方、教えていただけると助かります。

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

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

  • 8ビット中の下位nビットを、全て0にするプログラム

    8ビット中の下位nビットを、全て0にするプログラムを教えてくださ... xを1セル中の0~7ビットとして、 nは下位何ビットを0にするか? という様にしたいのですが、 for(x=0;x<7-n;x++){ temp[X]=data[X] } for(x=7-n;x<7;x++){ temp[X]=0; } でよろしいでしょうか? 不足部や、間違っている点などありましたら、ご指摘いただきたいのですが。

  • ビット演算について

    いつもお世話になります。 ビット演算について教えて下さい。 unsigned char buf1[1]=0x5a unsigned char buf1[2]=0x04 unsigned char buf1[3]=0x38 5a0438(16)を3バイトの値を12ビットずつの整数で得るにはどうしたらいいのでしょうか? 2進数表記では、 5A | 04 | 38 01011010 | 00000100 | 00111000 12ビットずつとは、 010110100000 010000111000 と区分し、10進数の整数値で得たいです。どのようにすればよいでしょうか? また、0x5Aなどの16進数を2進数のビットで考えるときに、 01011010を下位4ビットを10進数整数を得るにはどうしたらよいのでしょうか? 上記2点、どうぞよろしくお願い致します。

エッジロケーターの用途とは?
このQ&Aのポイント
  • エッジロケーターは立形マシニングセンタのAPC仕様で使用される工具で、ワークの芯出し作業に役立ちます。
  • エッジロケーターがあると治具のあて板として使えるため、ワークの位置決めや精度向上に貢献します。
  • ただし、エッジロケーターがあってもワークの芯出し作業は必要です。
回答を見る