1 :デフォルトの名無しさん:02/10/22 21:04
漏れは今までにC、C++、Pascal、HSP、JS、VBなど
数々の言語を極めてきたがやはり一番手にしっくりくる言語は機械語だ。

だから、機械語のことなら何でも質問しろ!
ただプログラムのコードなんかは長くなるがな。

92 :かじゅ猫:03/03/04 00:20
アセンブラなら書けるけど
やっぱり機械語書けたほうが良いのかな?
良い参考書あったら教えてくださいな

93 :デフォルトの名無しさん:03/03/04 00:28
>>92
それは公式のドキュメントをみるしかないような。
書けるひつようはないと思うけど、binutilsやデバッガに
手を入れるには必須だよね。

99 :デフォルトの名無しさん:03/03/04 17:39
機械語でできる仕事って何がありますか?

100 :名無しさん@Emacs:03/03/04 17:48
>>99
機械語は多くの場合組むものじゃない。
それを生成するプログラムを組む、これが人間のやること。

118 :デフォルトの名無しさん:03/04/02 14:50
http://www.falcom.co.jp/ys/support/yse_easy.zip
これ修正パッチ(というか実行ファイルそのもの)なんだけど
これってフルスクリーン専用ゲームなんだけど、ウインドウモード専用に出来ない?

バイナリエディタで開いても俺にはさぱりわからない・・・


156 :1だよん:03/06/02 18:36
マトリックスに0と1だけでプログラミングできる奴いなかったけ?

164 :デフォルトの名無しさん:03/06/05 23:11
本気で質問です。

コマンドプロンプトを使うと、
C:¥>
と出ずに、
C:¥>Documents and Settings¥○○>
と出てしまいます。
どうすれば、
C:¥>
と出せるのでしょうか?

ここで、つまづいています…
使っているOSはウィンドウズXPです。

165 :デフォルトの名無しさん:03/06/06 01:32
>>164
C:\Documents and Settings\○○>
が長いのが気に入らないのかな?

PROMPT=$N:\$G
ってすれば
C:\>
って出るよ。

ユーザー環境変数に追加しておけば、
毎回指定しなくてもいい。
 システムのプロパティ→詳細設定→環境変数→ユーザー環境変数→新規→
 変数名:PROMPT 変数値:$N:\$G

なぜ機械語スレに書くのか分からんが。

173 :デフォルトの名無しさん:03/06/21 23:40
386の命令は可変長。命令の構造は以下の通り。この辺りは誰でも知ってるか。
前置バイト + オペコード + MODRM + アドレスディスプレースメント + 即値定数

386のこの命令の表現形式を頭に叩き込んでるところ。掛け算の九九並に体に馴染ませてから
NTLDRを読み始めたいと思います。

177 :名無し@沢村:03/06/22 06:38
>>173
違うよ。
オペコード(1または2バイト)+MODRM(1バイト)+SIB(1バイト)+アドレスディスプレースメント(1または2または4バイト)+即値定数(1または2または4バイト)
だよ。
またMODRMはmod(7-6ビット)、reg(5-3ビット)、R/M(2-0ビット)の各フィールドからなるんだよ。
例えば、MOV(reg1からreg2へ)命令の場合、
100100w 11reg1reg2なんだよ。
wというのは、16ビットか32ビットかを指定するもので、それによってレジスタが決まるんだよ。
命令によってはオペコードの中にwフィールドがないものもあり、その場合はregフィールドの値だけでレジスタが決まるんだよ。
まあ、他にもややこしいことはいろいろあるよ…



201 :デフォルトの名無しさん:03/08/06 18:10
int mc91(int n){
if (n>100) return n-10;
else return mc91(mc91(n+1));
}

上のCプログラムを出来ればアセンブリでおながいします m(_ _)m

207 : :03/12/15 01:05
浮動小数点のフォーマット(データ構造)と、四則演算のやり方を説明できる方いませんか?
あるいは、こういうこと解説してある本でも良いんですけど。

今はとりあえず我流で3バイトの整数部+1バイトの指数部(X*2^n)でやってるんですが、
なんか違うというか、もっと上手いやり方があるような気がして。

210 :デフォルトの名無しさん:03/12/15 02:11
>>207
フォーマットは、IEEEの規格があるのでCPUのマニュアルなんかに書いてあるはず。
足し算引き算は、指数部の桁を合わせて仮数部を計算。
掛算は、指数部を足し算して仮数部だけで掛算。
割算は、指数部を引き算して仮数部だけで割算。

誤差がどうのこうのってな事があるので、数値演算の本を読んだほうがいいと思う。


211 :デフォルトの名無しさん:03/12/15 09:29
>>207
ftp://download.intel.co.jp/jp/developer/jpdoc/24547003_j.pdf
第8章を参照。

213 :207:03/12/15 22:58
>>210,>>211
レスありがとうございます。

>>211
あ、私の説明が全く不十分だったのですが、8ビットの加減算しか出来ないCPUで
(今使っているのは8051って石の派生チップなんですが)Cのfloat相当の
浮動小数点の処理を効率よくやる方法はないものかな、と思っておりまして。

でもレスありがとうございます。

359 :何か教えてくれ:04/12/13 21:32:43
1F 8B 08 08 20 7B BD 41 02 0B 65 7A 72 6D 69 64
32 2E 64 6C 6C 00 F3 8D 9A C0 C0 CC C0 C0 C0 02
C4 FF FF 33 30 EC 60 80 00 07 06 C2 60 03 10 F3
C9 EF E2 63 D8 C2 79 56 71 07 A3 CF 59 C5 90 8C
CC 62 85 82 A2 FC F4 A2 C4 5C 85 E4 C4 BC BC FC
12 85 A4 54 85 A2 D2 3C 85 CC 3C 05 17 FF 60 85
DC FC 94 54 3D 5E 5E 2E 15 A8 19 EE D7 BF DF 66
DE 36 B3 03 86 FF 4F EB EE 60 02 D2 DF 56 76 81
E9 A0 CC E4 0C 90 38 CC CE 00 57 06 06 1F 46 66
06 F9 EA BD 8E 30 B1 07 0C 7C 8A DC 8C AC 3C 0C
4C 50 8F 80 80 00 14 2B 40 79 20 36 13 42 1A 46
83 3D 0A E5 30 C1 34 0A 20 D3 50 0A 68 4E 00 11
61 C2 60 C0 C0 C0 C3 40 7D A0 57 92 5A 51 02 A4
DD 60 0E 42 F6 2B 14 00 9D 98 A0 57 94 92 58 92
08 75 AB 02 54 1D 1B AA 3A A0 97 1D F4 8A 52 73
F2 93 A1 6E 35 80 AA E3 C0 50 E7 C4 30 0A 86 35
D8 C1 08 24 0E F1 30 84 85 07 EE 53 03 E6 92 EE
1A 15 91 9D A0 74 F0 79 29 58 2A 32 3E EE 10 07
83 F6 9D 8F 8D 0C 13 22 E7 9A 98 4B EB C5 07 EB
88 29 3A EE C9 3F 20 10 C1 DB A0 20 FF 3F D5 D2
EC CB 68 38 0E 65 00 2B 4B 8D 80 E5 05 28 CE 61
58 03 C8 D7 01 62 03 20 E6 00 96 39 76 E0 B2 34
B5 AA 28 37 33 C5 48 2F 25 27 87 C1 39 31 27 C7
AD 34 2F B9 24 33 3F 2F B8 24 B1 A8 64 34 30 87
1A 10 80 D4 01 3C 06 A3 41 31 12 01 00 BB 4E 94
BB 00 0A 00 00

393 :デフォルトの名無しさん:05/02/15 22:09:44
>>359
おっ、なかなか面白いプログラムだね。
まあ、実用性重視して、4行目の一つ目、C9
としたのは、まあ許せるけど、次の EF は、×。

正解は、EAだ。 そうしないと無限ループに
おちいる。 とにかく、楽しいコーディングだな。
この機械言語見てるだけで、半日はイケる。


476 :デフォルトの名無しさん:2005/03/28(月) 12:18:37
訂正:
403000に0x64と入ってたとして

478 :デフォルトの名無しさん:2005/03/28(月) 14:45:10
>>476言っていることが解りませんがこうですか?

0x64(10進数で100)
1,0,0の文字コードが0x31,0x30,0x30

あなたの言いたいことは
a=100
printf("%s",a);
(のような事)にあたる
アセンブラのコード希望

488 :デフォルトの名無しさん:2005/06/05(日) 03:58:07
ELF形式、COFF形式などと言うらしい、バイナリフォーマットの仕様を説明した
HPご存知でしょうか。
スクリプト言語でNASMクローンをつくれたら面白いかな、と思ったが、
どんなファイルを出力するのかでまずはまってしまて。。。

499 :デフォルトの名無しさん:2005/06/10(金) 04:15:06
今PEヘッダを勉強しているのですが、インポートデータの、ルックアップテーブルっていらなくないですか?


502 :499:2005/06/11(土) 05:28:31
すみません、馬鹿なのでよくわからないですが・・・
私にはアドレステーブルと全く同じデータのように思えるんですが、設計者は何らかの意図があってこういう形にしたわけなんでしょう?
設計意図を簡単でかまいませんので示唆して下さい。

505 :502:2005/06/12(日) 19:41:12
すみませんやっぱり馬鹿だった。USER32.DLLのインポートテーブルを見たらわかりました。

512 :505:2005/06/18(土) 11:41:59
わかったと思ったんだけどわからなくなりました・・・

OSのPEローダーは

1. (インポートする外部ルーチンの情報に関しては)ルックアップテーブルのみを参照してインポートを行う。アドレステーブルにどんなデータが入っていようと一切無視する。
2. ただし、ルックアップテーブルへのポインタが0だった場合には、アドレステーブルに入っているデータをルックアップテーブルの代わりに使う。

というようなアルゴリズムみたいですね・・・

2.の場合があるわけだから、やはりルックアップテーブルは必要がないのでは?

# それにしてもUSER32.DLLは不審だ・・・最初アドレステーブルにインポート済みらしいデータが入っているを見て、OSがインポートアドレスを厳密にチェックしているのか?と思ったんだけど、別に何もしていないみたい。(Win98の場合)

514 :デフォルトの名無しさん:2005/06/18(土) 20:54:07
よくは知らんが、再配置のアドレス解決は相当高くつくらしい。
OS自体全く違うがKDEはビルドのときにpreloadしておくと
起動時間が半分になるという話もある。

KERNEL32.DLLとかUSER32.DLLなどシステム固有のDLLは
どんなアプリでも同じアドレスにマップされる。(できる。)
しかしユーザ作成のDLLの場合、どんなアプリが何時ロード
するか分からんので、アドレス固定にすることは出来ない。

因みにVStudioはインストール時にアドレス解決するらしい。

>>512
という話と関係ある?

515 :デフォルトの名無しさん:2005/06/19(日) 00:08:32
499の言う「いらない」の意味がよくわからないんだが、
最終的にアドレステーブルだけあればいい=ルックアップテーブルを上書きすればいい、
つまり同じ用途で二箇所もいらないっていう意味で言ってるなら、そう言えないこともないかもな。
ローダーとモジュールの都合だけ考えれば。

ただ、両方テーブルがあると、デバッガとかでプロセス内部をのぞき見する場合には便利なことが多い。

たとえば、アドレス解決住みのアドレステーブルを見て何の関数なのか(可読名称)知りたいとき、
ルックアップテーブルが残ってれば名前テーブルがすぐ引ける。
ルックアップテーブルが残ってなければ、DLLのエクスポートテーブルを検索する必要がある。

また、API乗っ取り等のためにアドレステーブルを書き換えてしまった場合、
ルックアップテーブルが残ってれば、本来あるべきアドレスを再検索することができる。
ルックアップテーブルが残ってなければ、二度と本来のアドレスは分からない。
(まあ、本来のアドレスがわかったとして、それを素直に書き戻していいかは、
多重乗っ取りの可能性を考えると難しい面もないではないが、ここでは関係ない)

以上がPEの設計者が意図したものなのかどうかは知らないが、
そういう利用法はあるし、実際利用されてることを鑑みれば、
まるっきり無駄ってわけでもないとは言えると思う。


518 :512:2005/06/19(日) 22:44:11
>>515
>同じ用途で二箇所もいらない

そうそう!そういう意味です。

>両方テーブルがあると、デバッガとかでプロセス内部をのぞき見する場合には便利なことが多い。

そうなんですよ!だからこそ不審なんですよ。まるでクラッカーのために用意されているかのような2重テーブル。

OSの設計者が意図的にクラックしやすくするわけはないと思うので、何の意図があるのか、と思ったわけですが・・・

>>514
>KERNEL32.DLLとかUSER32.DLLなどシステム固有のDLLは どんなアプリでも同じアドレスにマップされる。

システムDLLでもOSのバージョンが違えば違うので、少なくとも普通のEXEとかユーザーDLLではビルド時解決は全くできないと思いますが・・・
USER32.DLLはたぶん特定のKERNEL32.DLL上でしか動かさないのでKERNEL32ターゲットのアドレステーブルが解決されていると思うんですが・・・
これって結局ロード時に上書きされちゃうんですよね・・・?
XPとかのUSER32.DLLはそうなってないですか・・・?

524 :デフォルトの名無しさん:2005/06/20(月) 04:45:51
>>518
>システムDLLでもOSのバージョンが違えば違うので、少なくとも普通のEXEとかユーザーDLLではビルド時解決は全くできないと思いますが・・・

書き方悪かったのかな。そういってるつもり。
だからVStudoはOSが特定できるインストール時なんでしょ。


528 :518:2005/06/25(土) 07:10:56
>>524
後で気がついたんだけど、514さんの書きこみは、'インポート'ではなく、'フィックスアップ'ですね。
「高価」というのは、DOS EXEからPEになって、絶対アドレスはすべてフィックスアップの対象になったわけで、場合によってはえらい数のリロケートが必要になる、ということでしょう。
フィックスアップは、通常ビルド時に仮想解決しますね・・・特にEXEは殆どの場合'望ましいベース'にロードできるので、リロケートが必要なく、素早いロード(安価)が可能となっているようです。

530 :528:2005/07/09(土) 05:31:17
やっとわかりました!
どうも、すみません。514さんので正しいみたいです。

http://www.windowsitlibrary.com/Content/356/11/4.html

この文書の
'BINDING IMPORTS FOR A PE FILE'
という項目に詳しく載っていました。

インポートデータの'アドレステーブル'が解決済みのファイルを'BOUND'、そのようなファイルを作ることを'BIND'と言うそうです。
'BOUND'のファイルはインポートデータの'タイムスタンプ'が0以外に設定されることで区別されます。
ローダーは、このタイムスタンプが、インポート対象モジュールのと同じかどうかチェックし、同じならアドレステーブルをそのまま使う、という仕組みみたいです。

そして、USER32.DLLはバウンドでした。

550 :デフォルトの名無しさん:2006/01/24(火) 16:01:10
4文字以下の文字列を入力して反転出力させなさい。
という問題できるかたいらっしゃいませんか?

558 :550:2006/01/24(火) 19:37:22
新たな問題です。
キーボードから文字列を入力し、その文字列に含まれる数字の数を、
コンソールへ表示するプログラムを作成せよ。
ただし、入力される最大文字列は、20文字とし 入力される文字は、
ASCIIコード表(プリント11ページ)に
載っている文字に限定する。
とのことです。だれか助けてください。。。。。。。

569 :デフォルトの名無しさん:2006/01/24(火) 21:08:19
マルチというか陥れたのは俺な訳だが。

570 :550:2006/01/24(火) 21:21:23
ありがとうございます。すいませんがLEAコマンドのいみが
よくわからなくてロードアドレスでなにをしてるんでしょうか?
また7行目とかでGR1、1、GR1とでてきますがレジスタとレジスタの
間の1は何のいみがあるんですか?他にもオペランド中に文字が3つならんだり
あんまりわかりません。。。すいませんがよければおしえてもらえませんか?

571 :デフォルトの名無しさん:2006/01/24(火) 21:24:05
>>569
責任とって詩ね

626 :デフォルトの名無しさん:2006/06/06(火) 23:43:43
最近組み込みのコードどうやって作ってるんだか知らんけど、
某エレベータの誤動作が問題になっているよな。
あれって、原因として
(1)センサー系統
(2)ROM内のコード
みたいなことが考えられると思うけど、俺は(2)が原因だと思う
あのクラスのコードサイズ(バイト数)、大体どれぐらい?
開発経費、ってか組み込み屋の労働単価ってどれくらいかな?
わかる?興味本位だが(笑


http://hibari.2ch.net/test/read.cgi/tech/1035288252/l50人気ブログランキングへ