• ベストアンサー

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

疑問点なのですが、 ① 先ほどの例は、下位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