機械語なら俺に質問しろ!その2
■ このスレッドは過去ログ倉庫に格納されています
漏れは今までにC、C++、Pascal、HSP、JS、VBなど 数々の言語を極めてきたがやはり一番手にしっくりくる言語は機械語だ。 だから、機械語のことなら何でも質問しろ! ただプログラムのコードなんかは長くなるがな。 あ、ASMの話でもいいよ。
なんつーんだっけ? Sファイル? そいつを運用で奇数バイトから始まるものは受け付けないってできないの? そういう折衝する可能性も考えずに言われたままにほいほい実装するの? つーか、そもそもそ半端なワード(2バイト領域)はROMから読み出してから 書き戻せばいいんじゃないの? クリア済みが保障されているならクリア値で 埋めればいいんじゃないの? 土方は何も考えない分気楽でいいなぁ。 そう。モトローラのSフォーマットファイル。ふつうのリンカが出力したファイルですよ。 それを運用で焼いてあげませんって処理系に言われたらヤでしょ。 クリア値で埋めるのも、パソコンなら1MB用意してもいいでしょうが、 ROM16KB/RAM16KB ぐらいの空間で動くように実装するんです。 したがって流れの中で解決する必要があります。イレーズは全部いっぺん、 ライトはアドレス・データであちこちに書けますが、2度書きはできない (しない) のが 原則ですね。 ROMの性質上、xxFFのワードにxxyyを上書きするのは可能だろうと 思いますが、マニュアルで保証されてはいません。 半端なバイトを取っておくようなアルゴリズムを書いてみたのですが、いまいちすっきり しません。ROMから読み出すアルゴリズムのほうがスマートなのは確かなので、 xxFF→xxyy FFvv→xxyy の重ね焼きが可能か、メーカーに質問投げてみますね。 >>103 へうでのリンカスクリプトの使い方がやっと判って、スタックの割り付けも臨む 場所にできました。ビルド−ツールチェイン−最適化リンカタブの中の、セクション カテゴリーを開くと、アドレスとセクション名の対応が表になっていて、それを編集 するのですね。-start=B_1,R_1,B_2,R_2,B,R/06000,SI/07D00,PResetPRG/0FF7FC000, C_1,C_2,C,C$*,D_1,D_2,D,P,PIntPRG,W*,L/0FF7FC080,FIXEDVECT/0FFFFFFD0 自分でこういう制御文をコマンドラインに書くのに慣れていたので、どこにそういうの書く のだろう??と。 へう推奨のセクション割り付けパターンが、アライメント1,2,4の順なのですね。 これがまた違和感。従来はアライメント4,2,1でした。勿論自分でそういう指定に 直すことはできるのですが、この推奨パターンにはどんな意味があるのでしょう? あと、コード部配置順も、resetprgが先頭、以下定数、実行コード、割り込みコード、 ラベル、文字リテラル という推奨順なのですが、何で定数の間にコードを挟むのか 理解しずらいんですよ。 ×臨む ○望む ×理解しずらい △理解しづらい ○理解しにくい 校正どうもです。 のぞむなんてどこで書いたか忘れて探してしまった(w 打診のときは移植みたいな話だったのに、機器がみなネットワーク対応になってるから ネットワークプロトコル実装しなくちゃいけないっぽい・・・アプリ本体よりそっちのが余程 でかいじゃん。 >>135 で、ポーリングは使えないと書いたんですが、RXRDYのステータスをポーリング あうるのではなく、受信割り込みがあったことをポーリングすればその手法自体は書ける ことに気が付きました。 「入力が入り次第すぐそれを使う」 という点で一貫してるので、 単純なプログラムを書くには適した手法でした。わざわざその手法で書き直す必然性は ないので後戻りはしませんけど。 RXシリーズは、石の設計思想にコンパイラやOSの存在が組み込まれていますね。 SIとSU(割り込みスタックとユーザースタック)が別 とか、特権命令があって、PSWの スーパーバーザーモードとユーザーモードを区別するbitにより例外を発生させるとか。 でもMAX50MHzでWinみたいなマルチタスクを実現するわけでもないし、OS無しで 単純ループで書いてるだけだとこの設計思想のありがたみは感じないなあ・・・ 電源でなぜいつも苦労するのかは、どなたか判りますか? LAN通信機能は不要だそうです。serialのみ。 これならなんとかなるかな。 飛び込みで8085の仕事が来た・・・CPU以外にも 8251 8253 8255 どうやって石調達 してるんだろ? 結局ここで推敲してもらったstpcpy( )は使わなくなってしまいました。 >8251 8253 8255 どうやって石調達してるんだろ? 量産でなければ普通に手に入る。秋葉原の店頭でもまだ見掛けるし。 汎用チップの需要って案外ワンオフとかであったりするんで ロット納品とかでなければ普通に売ってるよ。 チップバラで買ってハンダ付け名人のおばちゃんが組み立てるのか〜・・・ 手作りはお互い様ですね。今朝HEXを送信しました。 256のROMまだあるのかな? その後4回手直ししてHEXを送付しました。全部パツイチで動きました。 ふつうのソフト会社なら30分の仕事にする所、暇なので16hもかけてしまって\3マソ(w 明日から本業のRXに戻れるかな uartに割り込み来ない・・・と思ったら、PMR,PDRより前に マルチファンクションピンコントローラのレジスタ設定が必要だったorz しかもこっちの章が後なのに設定は先とか・・・もうね、意地悪! まだ割り込み来ない・・・やったこと:hwsetupで、マルチファンクションピンコントローラの P20〜P33PFSでTXD/RXD端子に設定、PORT3.PMRとPORT2.PMRでTXD/RXD使用、 ICU.IPR[218]と[226]=優先度2、IER[27]と[28]=0Fと3C(SCI1,6のERI,RXI,TXI,TEI許可) リセット直後でINTBに可変ベクタテーブルの先頭設定、hwsetup( )から戻った所で set_psw( )でPSWのIbitをオン。SCI1と6のSMR,BRR設定してSCRに50h(REとRIE)書いた。 これでシリアルにデータ入れても割り込み来ない。uartのレジスタの辺りダンプすると みんな00になってる。BRRやSCRやRDRは非ゼロが見えるはずなのに・・・ 何かまだ設定忘れてる?? と、思ったら、モジュールストップレジスタというのがあって、ユニット毎に動作を開始 しなきゃいけないようになてましたね〜 >>167 さん、基本中の基本をご存じなら >>166 あたりで指摘してほしかったですね〜 結果はもうじき来ます。 基本中の基本って言われたら 基本を調べるよなふつう つーか、私だって全てのCPUのレジスタ構成を把握しているわけじゃないもん。 自分が使うCPUならレジスタ構成を把握するのが基本だろって話だよ。 自分が使うユニットの章しか読まないでコードしてもなんとか動いたんですよ、H8Sとか。 概要の章に、何章までは全部読んで理解しないと使えないよ的な前置きが欲しかったな。 1600ページもあるの、全部なんか読んでられないわ。 モジュールストップ解除したら動きました。やれやれ・・・ タイマ割り込みが来ないのもこれのせいでした。この石は省電力が売りなので、 使わないユニットにはクロックを送らないことで省電力を実現してるんでしょうね。 これでやっと本来のアプリのデバックに入れます。 評価セット借りてきて、自分のパソコンにつなぎました。 ドライバのインスコで神経すり減らしたけど、動いたら快適。 DATAflashの書き込みと読み出しがうまく行きました\(^o^)/ 同じ手法で内蔵fROMの書き込みもしてるので、この先Sレコードの書き込みも うまく行きそうです。デバック用にWDTリフレッシュ殺して動かしてますが、 うまく通信できてます。 で、忘れた頃にWDT入れたら、真っ青になるとw # 茶化してるだけねw FFFFFFFC番地に入っているアドレスに飛ばすc文はどう書けばいいですか? ( (void*)(0xFFFFFFFC) )( ); ってやると、FFFFFFFC番地に飛ぶ命令が出ちゃう。 >>177 ポインタサイズが32bitと仮定すると unsigned long pl; void (*func)(void); pl = *((unsigned long *)(0xFFFFFFFC)); func = (void *)pl; 普通にこうすりゃいいだろ ((void (*)(void))0xFFFFFFFC)(); 分かり辛いなら void (*func)(void) = (void (*)(void))0xFFFFFFFC; func(); (*((void(*)(void))(*(unsigned long *)0xFFFFFFFC)))(); こうかな…?手元に環境が無いのでちょっと自信ない >>180 斜め読みしてたすまん こうだな (*(void (**)(void))0xFFFFFFFC)() 機械語スレでCごとき高級言語とか # デスクトップでも__asm は試作で重宝してる asmすらこのスレにはふさわしくないんだよなあ emitしないと >>182 さんので通りました。 ありがとうございます。 MOV.L #0FFFFFFFCH,R4 MOV.L [R4],R5 JMP R5 このcはasmの行を挟み込む機能は無くて、asmのインライン関数を吐かせるんです。 判らなかったら、#pragma inline_asm func void func(void) { } の中に上の3行を挟んで書こうと思っていました。 「ポインタのポインタ」 で理解するより3行のasmのほうが私には理解し易いですね。 分かり辛いなら typedef void (*funcptr_t)(void); funcptr_t* p_func = (funcptr_t*)0xFFFFFFFC; (*p_func)(); とか >>185 ポインタのポインタが解りにくいというより C言語の関数ポインタの書式が分かりにくくしてる原因だと思う そうですね。asmでの理解ならすんなりいくのに。 ユーザーブート領域のプログラムをデバックしようと思って、その空間でLINKした コードをダウンロードして、リセットベクタをそこを指すようにして実行してみると、 対象領域がみんなFFになってる。未実装として読まれてるみたいです。 端子2つと特定番地の内容でブートモードになる、とマニュアルに書かれていたけど、 なるほどこういうことだったのか。リセットベクタを含む固定ベクタはアプリにだけLINK するものですね。起動時にそういう端子入力ができるようにハードを直してもらいます。 機械語オーライなら、もちろん、call convention は気にするよな? 組み込みのCの処理系がどうとなってるか詳しくないが、 typedef int (__cdecl* myfuncptr_t)(int, int); とかって書くようにしてるぞ。 __cdecl がデフォルトだったと思うので __stdcall しか書かないな SCIの受信とDMACを連携して動作させられるじゃないですか。あれってバイト数は DMACに設定するんだから、何バイト来るか判っている場合にしか使えませんよね? DMACは基本的に固定長のデータ転送に使うものだから 不定長のデータには使えない。 watms(int ms) 関数が素通りしてるっぽい・・・ RX210 void waitms(int ms) { hwsetup( ) で MSTP_CMT1 = 0; はやってる。 // 入力:ミリ秒単位の数値(50mSまで)。誤差の少ないwait関数。 CMT3.CMCOR = PCLK/128/1000*ms; // 1KHz(1mS)の分周値*mS CMT3.CMCR.WORD = 0x00C2; // Φ/128 セレクト,CMIE3許可 CMT.CMSTR1.BIT.STR3 = 1; // カウントUP start // do { } while( CMT3.CMCNT ); // 一致を待つ // ↑CPUマニュアル 25.2.4には、一致するとCMCNTは0になると書かれているが // 0である128clkの間、別の割込で他の箇所を実行しているかもしれない。 // そこで下記の割り込みを待つようにする。 do { } while( CMT3.CMCR.WORD & 0x40 ); // 割り込みを待つ } #pragma interrupt(Excep_CMTU1_CMT3(vect=VECT_CMT3_CMI3)) void Excep_CMTU1_CMT3(void) { // 1mSタイマ割込み処理 13.02.28 CMT3.CMCR.WORD = 0x0082; // Φ/32 セレクト,CMIE3禁止 CMT.CMSTR1.BIT.STR3 = 0; // カウントUP stop } これで1msのn倍waitできると思ったんだけど、すぐリターンしてくるみたいなの volatile? 機械語じゃなくね?w 保守してくれてるとおもって気にしてないが 素通りしてるとか言う前に吐かれたマシンコードを見るのが 先じゃないのかな。 ああ、「マシンコード」か。見慣れない字面だから空目してびっくりしたわ。 マシンコードは見たんですよ〜 すぐ気が付くようなミスは無かったと思う。 CMT3.CMCOR = PCLK/128/1000*ms; // 1KHz(1mS)の分周値*mS MOV.L #00088000H,R4 MUL #90H,R1 MOV.W R1,1CH[R4] CMT3.CMCR.WORD = 0x00C2; // Φ/128 セレクト,CMIE3許可 MOV.W #00C2H,18H[R4] CMT.CMSTR1.BIT.STR3 = 1; // カウントUP start MOVU.W 0H[R4],R5 BSET 01H,R5 MOV.W R5,10H[R4] do { } while( CMT3.CMCR.WORD & 0x40 ); // 割り込みを待つ L26: MOVU.W 18H[R4],R5 BTST #06H,R5 BNE L26 RTS void Excep_CMTU1_CMT3(void) { // 1mSタイマ割込み処理 PUSHM R4-R5 CMT3.CMCR.WORD = 0x0082; // Φ/32 セレクト,CMIE3禁止 MOV.L #00088000H,R4 MOV.W #0082H,18H[R4] CMT.CMSTR1.BIT.STR3 = 0; // カウントUP stop MOVU.W 10H[R4],R5 BCLR #01H,R5 MOV.W R5,10H[R4] POPM R4-R5 RTE do whileの脱出条件が間違っているようにしか見えない。 そもそもなぜdoなのか。通常のwhileではできない理由があるのか。 そこらへんが理解できないな。 あとコンパイラによってはdo { }が空文だと最適化でコードにしない ものがあったりするので(昔のMS-Cとかね)最適化オプションは 全てオフにしてから確認するといいかもね。 >>198 で、18h[R4]にC2hを入れてから、L26:の所でそこのbit6が1の間ループ。 >>199 の割り込み処理で 18h[R4]を 82h にしてます。 あ、書いてる途中でレスが・・・ while { } だと前判定、do { } whileだと後判定になるから。 今のケースの場合は一緒ですけどね。前判定だとBZ で脱出、その後ろに B 続行 ってなるのがイヤだから、ってのもあります。 見つけた〜!とおもう。hwsetup( )で MSTP_CMT1 = 0; // CMT unit1のクロックON とコメントに書いてあるけど、これがウソで MSTP_CMT2 に0を書くべきでした。 SCIで体験した事だと、ユニットにクロックを与えないとレジスタにイネーブルを 書けなかったから、コンペアマッチタイマもそうだとおもう。 今基板帰してるから、また借りたら確認しますね。 基板につける原クロックって水晶ですよね。CPU内蔵のクロック発振器ってどんな 原理なんでしょう? RC 発振器 でぐぐったらwikiが先頭に来たけど、余計解らない語句ばかり出てきた(w 何となくだけど、どの原理もLSI内部に納めるほど微小化できるのかな?とは思った。 基板は、ユーザーブート領域に焼く方法の所で引っかかってるみたいです。 >>204 CPU内蔵ならクリスタルじゃなくてPLLじゃないの。 たぶんクリスタルよりPLLのほうが正確だし。 あ、なんかPLLも基準周波数にクリスタルがいるらしい。 勘違いだったかも。 CPU内蔵のPLLは、基準周波数を分周または逓倍するために使いますね。 204の話は、CPUみたいなLSIの内部に焼き付けられる原クロック回路は、 クリスタルみたいなデカいものじゃなさそうに思えるけど、どんなものなのかなあ・・・ ユーザーブート領域のコードが動いたらしいです。私が確認に行けるのは木曜ですが x86-64の64ビットモードで動かない32ビットx86の命令ってどんなものがありますか? DAAとかなくなったんでなかったっけ? あとLAHFとか。 ユーザーブート領域のコードが動いたのは誤報でした。FF7FC000〜の空間には コードが焼けない/読めない状態のままです。困ったなあ・・・ RX210 規制の間に本番用の基板でデバックが進みました。 デバック用の基板ではユーザ空間しか焼けませんでした。 ユーザーブート領域に焼いても、そこで実行したコードでROMアクセス違反は 発生します。ROMを焼くコードだけRAMにコピーしてそこを呼ぶ手法を採りました。 欲しい機能の実装はだいたい確認。引き合い時2人月だったお金も、3.5人月 もらえました。36度の書斎でのデバックは2,3日で済みました。やれやれ・・・ 汗が基盤に垂れなかったのだろうか いや、液状のほうの汗なw 書斎が32度以上のときは、アイスノンを頭に巻いて 30分ごとにリビングに避難しながらやってました。メインは未明の頃。 8085ではメモリマップトI/O(ex:F000番地が8251のTXD/RXD)しか やったことがないのですが、8085にもIN/OUT命令はありますよね。 オペランドは8bitのアドレス。 このIN/OUT命令を使うときはハードをどのように組むのですか? もうちょっとくやしくお願い。名前からすると「メモリじゃないよ」という信号みたい ですね。 IN 04h と書くと、メモリではない04番地からリードですね。 そのとき8251を04番地に配線?すると上と同じ機能が得られるのですか? 私が出会ったのは217のようなシステムばかりでしたが、それは偶々? 8251側ではRD/WR信号とアドレスのLSBでI/Oレジスタを区別していましたが IN/OUTを使おうと思うとその辺はどうなるのでしょう? LDA/STAは3バイトだけど、IN/OUTは2バイトだからこっちのほうが小さいけど そういう理由ではハードは決めないのですか? >>219 あんたの知っているシステムでは、8251自体はアドレスバス上位4ビットがONで下位ビットOFFのときに チップセレクトされるようにつながっているのだろう。 8251のチップセレクトをするに当たって、メモリ空間を使いたくない場合は、IO/Mをデコードして OFF(M)のときにチップセレクトされるようにすればいい。 私の知っているシステムでは、メモリ空間を広く取るためなどの理由でそうしていた。 命令長が理由でどっちを選択するか検討するという話は余り聞かないな。 壊れた動画ファイルをバイナリエディタで開いて、そこから一コマでも画像ファイルにして抽出することってできますか? 拡張子は3gpで昔携帯で撮ったものです 少し調べてみてmdatって文字列は確認できたんですが、ヘッダ周辺はだいぶ壊れて上書きされているみたいです バイナリ全くわからないんだけど、規則的に色の情報が配置されてるって単純な構造でもないのかしら… >>220 なるほど。聞いてみてよかったです。ハードの設計者の意向でそのような 切り分けがなされるのでしょうね。私の知っているシステムではアドレス上位4bit でチップセレクトされる先を決めるICが入っていました。220のやりかたのほうが 使う石が少なくできるような気がするのですが、私の顧客の伝統なのか拡張性? のためなのか、私の付き合った現場ではメモリマップトI/Oばかりでした。 8085+8259のシステムで、IRRレジスタを読む必要があります。 コマンドレジスタのアドレス0側を読むとIRRまたはISRが読め、その選択は リードに先立つOCW3でコマンドレジスタのアドレス0側に書きます。 似たコマンドでOCW2というのもあり、これもアドレス0側に書くのですが、 OCW2とOCW3の違いは、書き込み内容のbit4,bit3が01か00かで区別される と理解してよいでしょうか? SAUTO: ; store 16-bit automatic variable ; VAR = HL XTHL MOV E,M INX H MOV D,M INX H XTHL SAUTOX: あれ?なんで2行改行になるんだろ? XCHG DAD SP MOV M,E INX H MOV M,D XCHG RET スタックにHLをストアするルーチンらしいのですが、前半が何をやってるのか よくわかりません。SAUTO2:: の入口は LXI D,4 してSAUTOXへジャンプする ので判り易いのですが・・・ 8080のASMです。 >>226 スタックトップに積まれたアドレスからEとDに2バイト読み込んだ後、スタックトップに積まれたアドレスを+2更新してる スタックトップというのはSPが指している場所ですよね。そこにあるのはアドレス ですか?+2更新されるのはSPではありませんか? SAUTOXに来た時、他の SAUTO02/04/06・・・からはDE=4/6/8・・・なのに>>225 から来たときはDEには (SP)の内容が入ってますよね。226でやってることはストアすべきアドレスをHL に計算して、入ってきたときのHLの内容をストアするのですが、225からくると DEにあるデータはオフセットではなく不定のメモリ内容な気がして、そこが不安 なんですよ。 その前後で、スタックをどう使ってるかだよ、意味論的に SAUTO HLに16bitの値を格納し CALL SAUTO DW オフセット値 の形式で呼び出すとスタック上に確保されたローカル変数の領域(SP+オフセット値)にHLの値を格納する SAUTOからの復帰はオフセット値を格納した次のアドレスから継続する SAUTOX DEにオフセット値 HLに16bitの値 を入れてCALLするとスタック上に確保されたローカル変数の領域(SP+オフセット値)にHLの値を格納する あ、いろいろレスが・・・ありがとです。そうか、CALLの後ろに DW オフセット この呼び出し形式が解らなかったんです。pushされたリターンアドレスを 使わないと DW オフセットを取り出せないから225みたいなコードになってる んですね。やっと解りました。 >>233 はい、わかります。 >>224 よいです。 8085のデータブック読むと、機械語の説明のところにクロック数とステート数という 欄があります。クロック数はΦクロック(またはその半分)が単位でしょう。 ステート数というのが、クロック数のだいたい1/3ぐらいの数値なのですが、 これが何のことか、ブック中では説明なしに使われています。 このステート数というのはどういうものなのでしょう? >>236 http://www.inf.pucrs.br/ ~calazans/undergrad/orgcomp_EC/mat_microproc/intel-8085_datasheet.pdf どうもです。私が読んだのは沖電気の日本語版で、そのソースがインテルのこれ なのでしょうね。全部読み下すほど英語力無いのですが、Table 3 Table 4 を 参照して各命令ごとに合計をとったものが日本語の資料に追記されたと 思えばいいでしょうか? M1,M2,M3がステート数に相当するものですね? >>768 生まれた頃は暖かい家庭だったんじゃね、今からは想像できないだろうけど 検索してもx86命令とx64命令しか見つからないんですけどリアルモードってx86命令でいいんですか? リアルモードはほぼ16bit推奨環境 プリフィックス付かどうかで動作変わる命令は操作対象が16bitであると解釈される 例) INC AX → 40、INC EAX → 66 40 付く分動作が遅くなる、つまり、リアルモードで32bit操作は期待するほど速度でない プロテクトモードは32bit環境 例)INC AX → 66 40、INC EAX → 40 操作対象が16bit幅な命令も使えるけどリアルモードより遅い x64もレガシーモードで動作させればリアルモードを使えるけど、使える命令はx86命令に限定される、ハズ なのでいいんですか?と聞かれたら概ねいいですと答えていいんじゃないですかね >>242 ありがとうございます。 起動時のCPUはリアルモードで動作するという事で、 OSのブートプログラム書くのにリアルモードでのオペコードが必要なのに、 リアルモード用のオペコード一覧が見当たらないなと悩んでました。 機械学習に関してもここでいいでしょうか? 現在、Cで深層学習のお勉強プログラムを書いています。 Caffeなどそのもののライブラリを使わずに実装したいと思っているのですが、 自動微分がどうしても必要になりますが、これを高速にすることが可能なライブラリはありませんか? Hyper-v環境でルートパーティションにおけるcpuid命令は、通常の10倍遅い VTなら、cpuidは無条件でVM Exitするって書いてあるぞ。 遅いのは仕方ないね THIS IS AN ACCUMULATOR. THIS IS A REGISTER. AHH ACCUMULATOR REGISTER ・・・ 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方 役に立つかもしれません グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』 P00BP ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.1 2024/04/28 Walang Kapalit ★ | Donguri System Team 5ちゃんねる