🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

1回答

910閲覧

pop命令で8ビットレジスタを指定できないものなのか?

kazuyakazuya

総合スコア193

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

CentOS

CentOSは、主にRed Hat Enterprise Linux(RHEL)をベースにした、フリーのソフトウェアオペレーティングシステムです。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2019/11/17 04:53

編集2019/11/17 05:43

environment

1OS・・・Linux 264ビット CPU 3GAS コンパイラ 464ビットプロセスとして実行

s

1.globl main 2main: 3jmp run3 4 5run2: 6movl $4,%eax 7movl $1,%ebx 8pop %rcx 9movl $6,%edx 10int $0x80 11movl $1,%eax 12movl $0,%ebx 13int $0x80 14 15run3: 16 call run2 17.asciz "hello"

ebx や rcxなどなど・・・

64・32ビット長レジスタを使用していますが

私はこれらをすべて8ビット長レジスタに変えたいです。

それができないので教えてください。

参考サイト

イメージ説明

x64CPUでも8ビットレジスタは使えるようです。

s

1.globl main 2main: 3jmp run3 4  5run2: 6xor %eax,%eax 7mov $4,%AL 8xor %ebx,%ebx 9mov $1,%bl 10pop %rcx 11xor %edx,%edx 12mov $6,%dl 13int $0x80 14mov $1,%AL 15mov $0,%bl 16int $0x80 17 18run3: 19 call run2 20.asciz "hello"

movlをmovにしたら正常にアセンブルでき実行ファイルを実行させると

しっかり、"hello"が表示されました。

ただ、・・・

上記のなかで

s

1pop %rcx

64ビットレジスタを使っています。表を見ると

cl 8ビットレジスタがあるようですが

使うことができません。

pop命令自体が64ビットでしか使えない?(どっかで聞いた)らしいので

rcxなどの64ビットレジスタしか使うことができないようです。

私はどうしても、clレジスタを使いたいです。

どうやったら、clレジスタに値(リターンアドレス)をpopさせることができるでしょうか?

できれば一つの命令だけですませたいです。

やってみたこと

popで直接8ビットレジスタを使えないならば・・・

s

11 popで、rdx64bitレジスタに値を一旦、避難させる。 22 mov命令で、clレジスタにさっき避難させたrdxレジスタの値を移す。

結果的にだめでした。(というより、64ビットレジスタの内容を8ビットレジスタに移せるものなのか?)

解決方法が分からないので教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2019/11/17 05:36

>私はどうしても、clレジスタを使いたいです。・・・理由を聞かせてもらえますか? ・・・使い方が分かれば、代替え案があるかも?
guest

回答1

0

ベストアンサー

pop,push命令はレジスタ単位(63ビット)でしか使えません。また、clは、rcxの下位8ビットです。
Linux で64bitアセンブリプログラミング

投稿2019/11/17 05:33

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kazuyakazuya

2019/11/17 05:37 編集

回答ありがとうございます。 ですので、リターンアドレスをclレジスタにどうやったらいれることができるのかという・・・ 質問です。(抜けてたので追記します。)
cateye

2019/11/17 05:39 編集

リターンアドレスそのものが(64ビット環境では)64ビットですが? ・・・当然、8ビットには収まりません。
kazuyakazuya

2019/11/17 05:39

あ・・・どういえばそうですね・・・ ん?64ビットなんですか 48ビットではなくて?
kazuyakazuya

2019/11/17 05:44

いや、48bit長でも64bit長でも 64bit長レジスタ以外のレジスタに格納するのは不可能か・・・
cateye

2019/11/17 05:48 編集

実際は48ビット(0x7fffffffffffまで)ですが、48ビットレジスタは存在しません。アドレスバスが「48ビットしか無い」ということです。
asm

2019/11/17 05:48

> pop,push命令はレジスタ単位(63ビット)でしか使えません なぜか、16bitは使えるという仕様になってますね。 スタックポインタのアラインメントが壊れるので実用上のメリットは皆無っぽいですけど
cateye

2019/11/17 06:02 編集

8086の互換のためかと・・・もう良いのに(;・∀・) #CP/Mの時代には、C(CL)がシステムコールのファンクション番号だった・・・
kazuyakazuya

2019/11/17 05:55

16bitレジスタに変更したところ、正常にアセンブルできました。 生成された実行ファイルを実行すると、やっぱりコアダンプが起きましたが・・・
kazuyakazuya

2019/11/17 06:09 編集

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10215969925 ここらへんでいただいたコマンドを使ってコードを16進数表現で表示させましたが 今回のところなのか NULLバイトが一つだけありました・・・。 (32ビットプロセスとして実行させるしかないのかぁ・・・) 結果、無理だとわかったので閉じさせていただきます。 ありがとうございました。
y_waiwai

2019/11/17 06:26

そこらへんを突き詰めようとするなら、Arduinoなどの8ビットCPUをいじってみれば。 基本的な理屈はみないっしょですよw こんな巨大な(増築繰り返して歪な)CPUから始めるってのはかえってわかりにくいでしょw
kazuyakazuya

2019/11/17 06:31

うーん、そうですね。。。 ただ、いまのやつを投げて8bitCPUで試すのはちょっと・・・(w) せめて、NULLバイトを除去するところだけでもやりたい!と思って考えていましたが 結局いい案を思いつかなかったので改めて 質問します。
y_waiwai

2019/11/17 06:39

CPUってのはなにか難しいことをしてると考えがちですが、単純なからくりで処理を回してるだけ、なんですね、ってそれがなかなかわかんないんですが。 #順調に泥沼にハマってるようでなによりw
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問