タドゥーのいろんな日常

このタイトルいつまで続ければいいのか

こういうの考えてる時が幸せ

//cgiの仕様上,asm文の””が消えてます

RedFox先輩 Cクイズ反応(4/29)
なななななーるほどなー
then節直接ジャンプは考えてたんだけど、gotoラベルも使えないしなぁ…と思った時点で諦めてた
asm文とか研究にモロ関わる部分に気づかなかった自分が憎い
問題文ではアーキを指定してなかったので、SHのシミュレータで実行とかでもありかも

asm文使ってやってみた
家のCygwingcc(3.4.4)でコンパイルするとこうなるので、
#define __ANSWER__ 0;asm("jmp L7")
でジャンプは成功
どうみてもコンパイラ依存です、本当にありがとうございました

asm("\nL99:\n\tjmp L99+???")
みたいに勝手にラベル書いて、そこに分岐幅足してジャンプしたらアーキ依存ぐらいには格上げできるんじゃね…?と思って
一命令長いくつなのかなーとobjdump通したら
どうみても可変です、本当に何考えてるんだ
意味わかんねぇ!いや効率的だけども!作るほうの身にもなれよ!
相対分岐も無いとか…なんなの…
今までRISCばっかり扱ってきたのが、どれだけ楽だったのか身に沁みた
>RedFox先輩
asm("\nL99:\n\tjmp L99")で無限ループは出来るんで、番地取得はCALL空発行しなくても出来そうです
でも分岐幅計算したくないです
あとL99をレジスタに入れてから分岐幅足しこむのを86アセンブリで書くのはもっと嫌です

何とかgccの最適化でif節消せないかな…?
→そういう処理するコンパイラ作ればOKじゃね!?
と思ったけど、それするとセマンティクス保持できてないのでCコンパイラの定義からはずれちゃうな…
………
「quiz.cをコンパイル・実行した時, 」
Cコンパイラでとは書いてないぞ!大勝利!
ということは、どんな入力を受け取ってもquiz.cからif引っこ抜いたものをgccに投げるプログラムを作れば…!

stdlib.hのrand()を書き換えたら出来るんじゃね
標準関数をイジるとANSI Cから外れる…かどうかは忘れたので青月に任せるとして
そもそもC言語って問題文のどこにも書いてないしな!
変換して実行できればいいんだ!

今日のポイント
・環境依存にする
・環境自体をいじる

教訓
問題文で制限しておくべき