1 :
デフォルトの名無しさん :
2011/08/28(日) 12:36:52.66 初心者OK!質問大歓迎!のアセンブラのスレッドです。 基本情報の勉強中の人、PICやH8を勉強中の学生などなど…
このスレッドは天才チンパンジー「アイちゃん」が 言語訓練のために立てたものです。 アイと研究員とのやり取りに利用するスレッドなので、 関係者以外は書きこまないで下さい。 京都大学霊長類研究所
アセンブラ最高や! C言語なんか最初からいらんかったんや!
マシン語最高や! アセンブラなんて最初からいらんかったんや!
アセンブラを勉強するのにいい、unix系の本がありますか?
初心者用なら質問用テンプレが居るな、特にアセとなると 石、アセンブラが何か分からんと答えられんケースあるし 【CPU】 アセンブラではCPU(通称「石」)によって回答が全く違ってくることも多いので必須です。 まったく分からなくても「Windowsが動くCPUです」など、分かるだけのことを書いてください。 【アセンブラ】 これも分かれば。コマンド名とかでもいいです。 あとは何をテンプレにすべき?
書籍なんかがあればいいと思うけど
質問します 『独習アセンブラ』という本を買って来て、文字を出力するプログラム(p.5)をつくってみたのですが、うまく動きません nasm -f bin dispchar.asm -o dispchar.com こう入力してから dispchar.com を動作させると、つぎのように表示されました このバージョンの \dispchar.com は、実行中の Windows のバージョンと互換性がありません。コンピューターのシステム情報を確認して、 プログラムの x86 (32 ビット) のバージョンと x64 (64 ビット) のバージョンのどちらが必要か確認してから、ソフトウェアの発行元に問い合わせてください。 windows 7 64 bit でとりあえず動作させたいのですが、どうすればよいのでしょうか? 【CPU】 intel core i5-2400 【アセンブラ】 NASM version 2.09.10 compiled on Jul 15 2011
11 :
10 :2011/08/31(水) 12:05:03.29
dispchar.asm のソースを一応載せておきます >cat dispchar.asm ; dispchar.asm mov ah, 02 mov dl, 31h int 21h mov ah, 4Ch mov al, 0 int 21h
>>10 それに乗ってるのは16bitのコードだから、win7 64bitでは動かないよ
アセンブラも多分16bitだから動かないんじゃないかな?
>>12 えっ、そうなのですか
残念です
では64bitの環境で学習できるよいサイトはあるでしょうか?
NASMはWin32版もある
ピックやれピック
>>13 32bitアセンブラコードは。。。
ほとんどwin32API呼び出しで、アセンブラの意味はないしねぇ。。。
>>15 の言う通り、PICマイコンでアセンブラした方が遊べると思うけど、こっちのアセンブラが64bitOSで動くかも不安が在るな。。。
ためして見た人居る?
実ハードで動かすことにこだわらず、エミュ使うのも手だと思うが。
xpモードで開発&実行
アセンブラで、C言語のcase文のように書きたいのですけどどう書けばいいですか? また、イフ文のようにも書きたいんですけどどう書けばいいですか?
あ、開発環境はMPASM PIC16F84Aです
基本的には無理。 定番としてはテーブルジャンプだけど、その石でできるかどうかは知らない。
call adressを機械語にすると E8 77 77 77 77 みたいになるけど この77777777実際のアドレスと違うんだよね どういう規則でこのアドレスは算出されてるの?
call命令っつっても対応するオペコードは複数あるんだよ。 E8の場合はIPからの相対アドレスへのnear call。
相対ジャンプの場合は、石によるけど、ジャンプ命令のアドレスからのオフセットか、 その次の命令のアドレスからのオフセット(8086はどっちだっけ)。
25 :
22 :2011/10/02(日) 05:56:17.04
8086はWindowsのことだよね? 逆算してみたら、次のコードの開始位置からの相対位置ですね
BSR ラベル:16 で書くのと JSRではどっちのがメモリ食うのか分からないです。 長いならJSRですかね?
27 :
デフォルトの名無しさん :2011/12/14(水) 04:55:52.34
石の種類によるけど、BSRは3〜4バイト、JSRは4〜6バイト。 BSR ラベル:8 と書ける石もあって、この命令は2バイト。 でも、一般的にBSRのほうがJSRよりもマシンサイクルが多い(=遅い)。 その差まで気にかけるほどシビアな条件にはならないようにハード選定時点で 考えられるはず。 ってもう見てないよな(w
暇なんでやってみた win32だとCでやるのと変わらんわ・・・ ;ml hello.asm /link /subsystem:console .386 .model flat, stdcall GetStdHandle proto :DWORD WriteConsoleA proto :DWORD,:DWORD,:DWORD,:PTR,:DWORD ExitProcess proto :DWORD includelib kernel32.lib .data STD_OUTPUT_HANDLE EQU -11 hello DB 'hello, world',0Dh,0Ah,0 .data? OUTLEN DWORD ? .code mainCRTStartup proc local STDOUT :DWORD invoke GetStdHandle,STD_OUTPUT_HANDLE mov STDOUT,eax invoke WriteConsoleA,STDOUT,offset hello,14,offset OUTLEN,0 invoke ExitProcess,OUTLEN ret mainCRTStartup endp end
64bitOS上の32bitアプリで関数コールにpushad popadだけ書いてretしたらエラー落ちするのは何が問題なんでしょう?
30 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/03/31(土) 17:38:06.65
>>29 .386
.model flat
.code
_start:
call testsub
ret
testsub:
pushad
popad
ret
end _start
ml test.asm /link /subsystem:console
Vista 64bit で動かしたけど、なんも問題ないっぽいけど。
たのしそうだなー
>>30 それ64bitOS上の64bitコードじゃね?
33 :
営利利用に関するLR審議中@詳細は自治スレへ :2012/04/01(日) 21:31:03.44
バカ発見
キチガイ発見
アフォは自己紹介をする。
アセンブリをCのソースに変換するフリーのデコンパイラって存在しますか?
存在しますよ。
検索キーワードを教えちくり
英語で検索すればおk
なるほど ありがとう!やってみる
フローチャート書いてるんですが スタック操作命令のPOP,PUSHってどうやって書けばいいですか? PUSHの場合これ出会ってますか? SP←0+(GR1)
フローチャートはコーディングじゃないから、箱(処理)の中に「GR1をスタックに保存」「GR1をスタックから復帰」とか、自分で分かりやすい風に書きゃいーよ。
44 :
42 :2012/05/02(水) 19:34:10.73
68kの性能のいいディスアセンブラないですか? 例えばデータの直後に命令があったらそれを識別できるくらいのがありがたいのですが
サブルーチンからメインルーチンヘジャンプ命令ってプログラム的には問題なんでしょうか? たとえば EXE START LOOP IN BUF,LEN CALL DISP RET DISP LD GR1,LEN LAD GR2,1 CPL GR1,GR2 JZE LOOP RET BUF DS 256 LEN DC 1 END これの場合風呂チャートはどう書けばいいでしょうか?
何これ、CASL?
48 :
46 :2012/05/13(日) 12:11:07.96
>>46 まず第一に、そのコード自体がまずい。
コール、リターンというのがどういう動作なのか理解してる?
コールは次の命令のあるアドレスをスタックに積み、ジャンプする。
逆にリターンはスタックから1つ取り出して、そのアドレスにジャンプする。
そのコードだとLOOPへジャンプする度にスタックを食いつぶしていくことになる。
本来ならループされた数だけ戻り先の処理が行なわれてしまい、戻った際の処理もおかしくなるところ。
(そのコードの場合は戻り先がたまたまRET…つまり、何もせずにリターンするために一応動くことには動くのだが)
50 :
デフォルトの名無しさん :2012/05/19(土) 14:27:41.30
inline void __fastcall sincos( const float& angle, float& sin, float& cos) { _asm { fld angle fsincos mov edx, [cos] mov ecx, [sin] fstp dword ptr [edx] fstp dword ptr [ecx] } } これ正しい値を返さないんだけど、何か間違ってますか?(VC++2010EESP1)
>>50 自分でトレースすりゃすぐに分かりそうなもんだが、何故人に訊く?
fldの所でdword ptrは付けないの? そのままだとtbyte ptrがデフォルトになっちゃうと思うんだけど
53 :
50 :2012/05/19(土) 14:52:50.88
angle 0.78539819
↓こうなる。何だよDENって。。
cos 1.0000000
sin 1.997e-039#DEN
↓正しくはこう
cos 0.70710677
sin 0.70710677
>>51 さっぱりわからんとです。ハード的なコアな問題じゃないかと思って聞いた。
>>52 fld dword ptr [angle]
こうしたが同じだった。
>>53 悪い間違った
勝手にfldのサイズをインラインアセンブラが類推してdword ptrにしてくれた
正しくは
_asm {
fld dword ptr angle
fsincos
lea edx, cos
lea ecx, sin
fstp dword ptr [edx]
fstp dword ptr [ecx]
}
だね
movではアドレスではなく中身を取ってきてしまう
また間違った 今起きたばかりで脳がボケている &だから参照なんでアドレスが入っているんだね だから最初のfldもアドレスを先にロードしてそこからさらに読み取ればうまくいった _asm { mov eax, angle fld [eax] fsincos mov edx, cos mov ecx, sin fstp dword ptr [edx] fstp dword ptr [ecx] }
>>53 >さっぱりわからんとです。ハード的なコアな問題じゃないかと思って聞いた。
ステップ実行すりゃ、一番最初の fld angle で失敗してることくらい一目瞭然だろ。
ひょっとしてデバッガの使い方分からんのか?
58 :
50 :2012/05/19(土) 21:08:19.23
>>55 そのコードで直りました!ありがとう!
>>57 うちのVCたんはレジスタ表示出来ないの
お茶目な奴なんだよ
>>58 >うちのVCたんはレジスタ表示出来ないの
ツール(T)→設定(S)→上級者用の設定
にチェック入れてる?
x86の浮動小数点演算って変な格好をしてるよなあ 8087というコプロセッサを使うために作られたアーキテクチャとは言えそのまま引きずってるし SSE2を使うと精度は64bitに落ちるが一応倍精度演算出来るもんな x64も最初はFPUをコンテキストスイッチで保存しない計画だったんでしょ 全部SSE2に切り替えようとした でもどっから圧力が掛かったのか社内の意見で反発されたのか、64bitOSはFPUを保存する事にした
あ、ちなみにSSE2には超越関数はもちろんないが、プログラムで組んでもFPUと互角か FPUより速い場合が今のCPUでは普通
>>62 意味が分からないなら無理に読まなくてもいいよ
>>63 > 8087というコプロセッサを使うために作られたアーキテクチャとは言えそのまま引きずってるし
「〜とは言え〜し」の使い方が異常。
> SSE2を使うと精度は64bitに落ちるが一応倍精度演算出来るもんな
IEEE754でいうところのDouble precisionなのに何が「一応」なのか意味分からん。
難癖付けるのだけはうまいな Intelは互換性を重視したために今のような汚いアーキテクチャになった これは意図的に選んだ道だ いくらでも綺麗に設計しなおすチャンスはあったが敢えてそうしなかった MSのVCのlong doubleが64bitであるようにFPUを切り捨てる計画は かなり前からあったようだがIntelに押し切られるような格好でOSの設計 だけは譲られなかったのだろう それからFPUの内部演算は全て80bitだ だから64bitで計算するのと結果が異なる場合がある
>>65 >Intelは互換性を重視したために今のような汚いアーキテクチャになった
8086の頃から汚かったゾ?
>これは意図的に選んだ道だ
「今のような汚いアーキテクチャになった」のは「結果」であって、「選んだ道」ではないが。
>>65 >いくらでも綺麗に設計しなおすチャンスはあったが敢えてそうしなかった
432とか、80860とか、Itaniumとか、ハイエンド製品についてアーキテクチャを見直すチャレンジは何回かやってるよ。
どこに言っても言葉尻だけ捉えて重箱の隅をつつくようなアホがいるから対応策は一つ 66 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん 67 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
69 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
71 :
デフォルトの名無しさん :2012/05/26(土) 23:12:40.96
スレ違だったらすみません H8マイコンで、ボタンが押されるたびにLCDに表示されてるいる数を減らすのを作りたくて、ER4に MOV.W #D'5みたいに入れてそれをボタンが押されるたびに、一個づつ減らすように書いたのですが、そのER4の内容をLCDに表示させるのはどうすればいいんでしょうか?
>71 日立…じゃなくて今はルネサスか…に問い合わせればきっと トレーニングキットなり講習なりの案内はもらえるとは思えますよ。 数十万〜数百万個とか使うのでなければ有償だとは思うけど。
>>71 「LCDに表示させる」ってとこはLCDのデータブックを理解できると仮定して・・・
・ワークregにER0を使う。(ことにする)
HEX: DC '0123456789ABCDEF'
ER4をER0に移す
ER0を0000000FでAND
MOV.B (HEX,ER0),R1L で、16進の1桁をASCIIに変換できる
R1LをLCD表示用の変数にセット
ER4を右に4bitシフト
これを8回くり返せばER4の内容を表示用の文字列に変換できる。
75 :
73 :2012/05/30(水) 01:22:20.91
お役に立てて嬉しい
76 :
73 :2012/05/30(水) 01:39:47.03
あ、途中で書き込んじゃった・・・レジスタや変数の内容を表示したいのはよくあること だから、dmp(変数)(長さは4とか16とか固定)、dmp(変数,長さ) とかの使い回し できる関数にしておくといいよ。レジスタはその変数に代入してからdmp( )を呼ぶ。 cで製品を開発するときこういうのを組み込んでおいてずいぶん役に立った。 表示先はLCDの他に、uartのコマンド/報告で組み込むのをよくやった。 H8だったら最低2CHぐらいはuartが搭載されてるでしょ。 dmp <ff010><ret> と入力したら、そのCHに FF010 30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46 <CR><LF> と表示させる。上のはFF010番地に DC '0123456789ABCDEF' がある所を ダンプした例ね。
77 :
73 :2012/05/30(水) 02:16:37.21
ここがASMスレなのを忘れて書いてしまった。 コンパイラによって違うけど、ルネのだと dmp(変数) MOV.L #変数,ER0 JSR dmp dmp(変数,長さ) MOV.L #変数,ER0 MOV.W #長さ,R1 (16bitで充分、8bitでも可) JSR dmp となります。
返信遅くなりすみません 有益な情報ありがとうございます 是非この先使ってみたいと思います!
すみません,アセンブラ単体でヒープ領域のメモリ確保ってできますか? アーキテクチャはlinux 2.6 on EM64T(およびPIC30F4012です.) (おそらく後者は不可能という結論は出ていますが,ついでなので質問です.) 前者は,call malloc等でC関数を呼べば実装できているんですが, Cランタイム非依存のlinux環境下では,int 0x80のシステムコールのみで ヒープ領域の確保,解放を行う必要性があると思っています. (システムコールなく,CPU命令で直接ヒープ領域にメモリ確保できれば十分です) わかる方いらっしゃるでしょうか
>>79 >すみません,アセンブラ単体でヒープ領域のメモリ確保ってできますか?
できますよ。
>アーキテクチャはlinux 2.6 on EM64T(およびPIC30F4012です.)
どちらも当たり前にできますよ。
81 :
80 :2012/06/12(火) 09:12:21.36
>>80 それぞれのインストラクションコードってわかりますか?
ggり方の問題なんでしょうけど,探しても見つかりません……
>>80 騙してやるなよ可愛そうだろ.
それとも本気で無知乙か?w
>>79 PICのアーキテクチャ見てみろ.heap……ってか,
レジスタ以外にメモリあるか? 別途メモリとか実装すればそれっぽいことはできるかもな.
そもそもシングルタスクなのにメモリ空間を分ける意味がわからないが.
AMD64はわからんが,linuxならシステムコールのリファレンスとか,
libcの逆アセンブルを見ればいいんじゃないか?あとはggれ
ページのフラグ変更すればいいんじゃね?
>>82 >PICのアーキテクチャ見てみろ.heap……ってか,
>レジスタ以外にメモリあるか? 別途メモリとか実装すればそれっぽいことはできるかもな.
「PIC heap malloc」とかでぐぐってみ?
>そもそもシングルタスクなのにメモリ空間を分ける意味がわからないが.
ハーバードアーキテクチャとタスクがどうこうは関係ない話だが? 本気で無知乙だな。
初心者スレで、初心者を愚弄する奴は来るな!
初心者スレってバカが知ったかでアドバイスするスレだったのか?
>>86 「初心者を愚弄」って、
>>82 の
>それとも本気で無知乙か?w
みたいなこと?
32ビットのフラットメモリモデルの場合なのですが、アドレスを記述する際にセレクタを 指定しなかった場合、実行時に使われるセレクタはDSで合ってますか?
普通のアクセスは。 EIPによる命令フェッチはCSなのと、PUSHやPOPでのESPによるアクセスはSSだけど、 他に例外はあったかな。
ebpはssだろうし ストリング命令でのdiはesだと思う。
フラットモデルは CS==DS==SS==ESというキチガイモデル LDTでプロセス毎のメモリ空間を確保 まあお陰で楽と言えば楽なんだが
94 :
デフォルトの名無しさん :2012/07/06(金) 01:32:49.84
秋に基本情報を受けようと思ってるのでCASL2の勉強をしようと思うのですが、お勧めの参考書かサイトないでしょうか? あとまったく知識ゼロの状態でCASL2を勉強して合格しようと思ったら どれぐらいの期間かかりますか?(CASL以外の時間は含まず)
>>94 何かひとつ実際のアセンブラが使えればCASLなんて屁でもないので
CASLの勉強なんて無駄なので止めなさい。
今使ってるPCのアセンブラでも勉強したほうがはるかに有意義だから。
>>94 人による、としか。
CASL2自体を覚えるのはそんなに掛からないよ。
早い人ならそもそも試験会場で問題冊子に書かれた仕様と問題文から覚えちゃう。
苦手な人でも、一年やって仕様自体が頭に入ってない人は稀だろう。
問題となるのはそこからの応用力だから、そればかりは本当にその人次第だねえ。
応用できちゃう人は覚えた瞬間からほぼ全問解けるだろうが
応用の苦手な人は問題集で色んなパターンを覚えるしかない。
97 :
94 :2012/07/06(金) 22:01:30.66
レスありがとうございます
>>95 そうなんですか…CASLが勉強時間も短くて、試験にも通りやすいと聞いたので
選択しようと思ってたのですが、今後役に立たない知識ならば別のを選択したほうがいいですかね…
>>96 試験本番で仕様を読んで合格する人ってすごいですね…
>>97 まあ、合格するまではやってみてもいいんじゃね
99 :
デフォルトの名無しさん :2012/07/09(月) 13:16:53.86
すみません最近勉強しだした、ど素人なんですが
MAIN START
OUT BUF,LEN
RET
BUF DC 'Hello, World!'
LEN DC 13
END
Hello,Worldって表示させるだけなんですが、
BUF DC 'Hello, World!'
LEN DC 13
この二つを
MAIN START と OUT BUF,LEN の間に記述したら駄目なんでしょうか?
流れ的にはラベルBUFにHello,World、LENに13と宣言してからOUTで出力させるような気がするのですが
C言語とはアルゴリズムが全然違うんでしょうか?
私が買った参考書にも特に説明もありませんでした。
出力の後に宣言があるので、なぜそうなるのかどなたか教えてください。お願いします
ちなみにこのプログラムは以下のサイトから抜粋しました
http://www.officedaytime.com/dcasl2/pguide/chapter1f.html
アセンブラの場合、データ(BUF DC 'Hello, World!' / LEN DC 13)も、メモリの その場所に置かれてしまうので、もしMAIN STARTの後に置いたら、 その文字コードを命令とみなして実行してしまうのでめちゃめちゃになる。
>>99 >BUF DC 'Hello, World!'
>LEN DC 13
>この二つを
>MAIN START と OUT BUF,LEN の間に記述したら駄目なんでしょうか?
セグメントの記述をキッチリしてればおk
102 :
99 :2012/07/09(月) 21:09:18.55
>>102 なるほど、とか言ってるけど実際分かってないんだろ?
104 :
デフォルトの名無しさん :2012/07/09(月) 21:17:22.99
105 :
デフォルトの名無しさん :2012/07/09(月) 21:29:09.19
>>103 私の勉強不足と理解力が無いだけなんで、理解できるよう努力します
流れでアセンブラをプログラムしようとするやつ
アセンブラ以外の言語はやらないのだろうか?
108 :
_ :2012/07/12(木) 22:43:47.48
_
片山さつき「大津の事件の原因は日教組政権下におけるハングル授業
大津のいじめ自殺について、本当にたくさんのメール、ツイートいただきました。
【中略】
担任の先生の、前任地、滋賀大学付属中学における、ハングルの授業・・?の記事なども入手しました。
英語習得段階もまだまだ中途であるはずの中学校で、なぜハングルを教育する必要があるのか?
子ども達に選択の余地はあったのか?
いかなる方針で、誰のオーソライゼーションによってそのような教育が行われていたのか?
それだけでも、かなり変わっているな、と感じられましたし、
【中略】
教育の自主性とか教育現場不可侵、、などを超えてしまっている現実を、
手をこまねいて見ていた多くの関係者、、。
3年前に「日教組政権?」が成立してしまったことで、
そこに、ますます歯止めがきかない空気が、浸透してしまった、そんな可能性はないのでしょうか?
ソース
http://blogos.com/article/42932/ ハングルの授業の資料
http://blog-imgs-53.fc2.com/h/o/t/hotlog/1341623759_img6946.jpg
>>110 そんなにおかしいこと言ってないだろ?
大蔵省が気に入らないのか?
112 :
110 :2012/07/13(金) 08:27:36.90
>>111 気にいらね、増税、おまえうれしいのか?
ν速中毒が国会議員になれるなんて胸が熱くなるな。
増税は反対だが、行き過ぎたチョン教育がおかしいってのは何も間違ってないだろ
国会議員が行き過ぎたバッシングで人気取りを狙ってるほうが、 1000倍狂ってる。
しかしあれだな、CASLな人はCASLと書いて欲しいな
バカウヨはν速に帰れ
ここ何のスレだよ・・・
121 :
デフォルトの名無しさん :2012/07/19(木) 00:31:33.84
話題を変えてしまってすみません。 戻り値が -1 である時に条件分岐したいのですが、 どうすればいいのでしょうか? Linux x86_64でsyscallでopenを呼び出し、 ファイルオープンが出来なかったらエラーに飛びたいのです。 開きたいファイルが存在しない状態で実行ファイルを 実行したけれど、エラー処理に飛びませんでした。 # error check cmp $-1,%rax je _err としても、 # error check cmp $0xFFFFFFFFFFFFFFFF,%rax je _err としてもうまく行きませんでした。
ENOENTは-1じゃねーぞ
123 :
デフォルトの名無しさん :2012/07/20(金) 23:06:25.48
ありがとうございます。 -2 が戻るんですね。 戻り値が負であればエラーと見做せばいいんですね。
125 :
uy :2012/07/23(月) 23:46:45.61
この板は何もないなぁと常々思う 流石にITに夢見る奴も絶滅してしまったせいだろうか プログラミングというものが、リアルで中学生位でも出来る奴が増えてきてるんだろうな VBとか、BASICじゃなくてC++、C#関係を そうやって一般人でも空気を吸うかのごとく扱えるようなジャンルになってくると プロってものはいらなくなってくる あとに残された金儲けの手段は 煩雑で、未整理で、情報の収拾が難しい分野の技術 けど、そういったものも、いずれ徐々に俺みたいな奴がその得た情報で金儲けするわけでもなく 無償で情報ばら撒き始めれば市場も崩れる 後に残されるのは、工場勤務などとなんら変わらない 個人能力に左右されないお仕事 機械で自動化できる部分を、あえて人間にやらせるお仕事 それが大多数のプログラマの仕事になるんだろうよ
126 :
uy :2012/07/23(月) 23:53:39.98
こうなってくるとゲームのような、ほとんどが再利用不可能なソースコードで構成されたプログラムを作ることと なんら変わらない、所詮は再利用するかしないかどころか、 不必要なシステム、不必要なプログラムを、人間の労働力が余っているから仕事を与えさせて動かしているだけであって それなら、ゲーム系に「無駄」を使ったほうがマシだよ コピペで済むものを、わざわざ再開発していく コピペで済まされたら、暇になっちゃうから 遠回りして、仕事してるフリをしろと 本当に悲惨な職業だと思う
127 :
uy :2012/07/24(火) 00:05:23.79
結局、目的のためにプログラミングをしてるってのは不健康なんだと思うよ 手段そのものでストレスを発散できるようになり、 目的度外視で手段を楽しいと思わなければ、その者は不幸だろう ありえないリソースをサイト上にアップしているにも関わらず、 あまりにもアクセス数の少ない技術系情報サイト そういうものも、手段を楽しんでいなければ構築できはしない 結局は気づくしかない 人間の素の演算能力が高くなれば、プログラミング言語がどれであろうと構わないって事 結局、世界全体の技術力を高めるには、人間の平均スペックを何世代にも渡って向上させていくしかないんよ 技術力のないバカに気づかせる事よりも、自分のことだけ考えて生きてた方がマシ
ながすぎる
うううう この試験のために参考書いくつか買ってるけど金がかかってしょうがない 専門学校やPCスクールに通うよりは遥かにましだけど、1万以上は軽く飛んだぜ
基本情報のスレに書いたつもりが間違えてしまった
俺馬鹿だからZ80のハンドアセンブルくらいが一番勉強になる 図書館で昔の書籍発掘しながら勉強してるよ
10進数ってどうやって表示してんの? 内部的には2進数で管理してるんでしょ?
どちらも整数であって、「2進数」とか「10進数」という数があるわけじゃないから。 2進とか10進というのは表記法の違い。 表示する時に、たとえば7セグメントデコーダに 8 を表示するなら、 全てのLEDを点灯させるとか。
それを言うなら、現実では1進数じゃないか。それをどうやって10進数で表している?
言いたいことはわかるが、位取り記数法としては1進なんてものはないので、 そう言うのは混乱させる元だと思う。
独習アセンブラって本をわざわざ買ってちょこっとかじったけど、他の言語と何ら変わらないイメージを持ってしまった アセンブラって直接CPUいじるイメージだったからなんか違うなー と思い、マイコンのアセンブラプログラム(ハンドアセンブラしてる時代)の本借りて勉強したら、構造が単純だからスイスイ頭に入ってわかりやすかったし、機械を操作してる感じもあって非常に勉強になった こういうことをしたくてアセンブラを勉強したかったのに、最近のアセンブラ教本は他の高級プログラム言語の本となんらかわりがいないのがなんかかなしいな 昔の本を読むってのも勉強になると思った
いまどきのOS上で動作するアプリを作る程度の使い方なら、アセンブラも他の言語も大して変わらんだろう。
うんそうなんだよね OS上で動作するんだったら普通の言語でいい オレはコンピュータが動作する仕組みが知りたいからアセンブラの勉強はじめたんだけど、独習とかの教本はピンとこなかった そういう意味で昔の本のほうがピンとくるんだ アセンブラでコンパイラ作る本とかあって、コンパイラがどういう構造でできてるかとか勉強になるから面白いんだ
CPUの性能が現在の1/10000くらいの時代、少しでも処理速度を早く したくて、自分のコードを書き換えながら実行するプログラムとか アセンブラで作ってたなあ、なつかしい(遠い目
>>139 自己書き換えプログラムか 今のでそれやったら命令キャッシュにうまく読み込まれなくて
ハングするんだったな
>>136 これわかるわー
今のrichなユーザインタフェースのOSや機能満載の開発環境の上だと,初心者を
プログラミングの世界に導くのが逆に難しくなってきていると思う."hello world"
なんて画面に表示できたところで何がおもしろいの?ってな感じなんだろうな.
それよりも単純に画面をタップしてモンスターをやっつけたりするほうが子供たちには
楽しいんだろうよ.今の子供たちはかわいそうだと思ってしまう俺も年なのか.
142 :
デフォルトの名無しさん :2012/08/06(月) 07:39:54.12
いきなり目に見えるものが作れるのは幸せじゃない ドラクエやってゲーム作りたいって思って じゃあ基礎のアセンブラやりましょうとかなったら 完成までの道のりが遠すぎて挫折する 今は仮想化が何重にもなっててCPUを意識したプログラムもわけがわからない。 Mac上にVirtualBoxでWindows入れてその中で動くQEMU用のコードを書いたときに 最終的に動くCPUやメモリ内容が想像しづらい いまサーバ側で動くCのプログラム書いてるけどそれも動かすのVPSだしなー テクニックとかは仮想でも生きるんだよね?
>>141 大先輩ですねー
俺らんときはかろうじてポケコンが有りましたよ
あんまいいじってなかったけどw
本当にコンピュータのことを勉強するんだったらCPUを直接操作して、こうやって画面に出力して、こうやって入力してって基本的なことから学んだほうがいいような気もします
自分は、なんでPCてこんな動きするんだろ?OSってなんで必要なんだ?って疑問から入って、調べていくうちにどんどんわからないことが増えていって、最終的にはアセンブラだなって思ってアセンブラの勉強したけど結局他の言語と同じじゃんとなってしまいました
どちらかというとアセンブラより、ハンドアセンブラをしたほうが、勉強になる気がします
そっからはいって経験を積み上げていくほうが面白いと僕は感じました
> 自己書き換えプログラムか 今のでそれやったら命令キャッシュにうまく読み込まれなくて > ハングするんだったな しないよ。ていうか、キャッシュはコヒーレンシを保たなきゃ困るんだから。 自己書き換えでトラブるのはキャッシュじゃなくて先読みバッファ。 Intelの場合Pentium以降はそのへんチェックしてて、書き換えた結果が即有効になる。
岩田聡氏はこういう文法を使って任天堂機を 作った訳ですね。
いや、ファミコン時代初期まで遡るなら、アセンブリ言語通り越してマシン語直打ち。
>>149 TK-80の頃でもクロスアセンブラとか珍しくなかったが。
どこかに珍しいとか書いてあったか? 症状から当たりを付けてダンプリストながめて直接手直しなんてのはザラだった。
>>144 ふつーはパイプラインにのってる書き換え前の命令がそのまま実行される
キャッシュもユニファイドでなければinvalidしない限り反映されん
x86は互換性命で無駄に努力しとるが
アセンブラだけでは高級言語との区別が分かりにくく ハンドアセンブルまでしてこそ 「プログラムもデータも同じようにメモリに乗る」 のが判るのは確かだな 前にCASL2教えてくれって言われて説明してたらそこが解ってもらえないから CASL2の仕様引っ張りだしたがニーモニックだけでオペコード載ってないでやんの それがあったならノイマン型コンピュータの解説にも便利だろうに… Win32のDEBUGコマンドはそれを分かりやすく示してくれてたのに 64で削られたのは残念だった
>>154 ほんとそうだよね
ハンドアセンブルしてからようやくアセンブラがどういうものかわかる
nasmとかmasmとか、勉強したとき、ラベルやら変数やらでわかりやすく記述できるのはいいんだけど、それがCPUのなかで順次どういう風に処理されてるかわかりづらかった
Z80で自分でラベルとかつけながらアセンブラでプログラム作って、実際にHEXに変換するって作業をするとCPUとメモリとのやりとりがわかる
この経験をしておけばCのポインタとかすっごい理解しやすいと思うんだが…
そしてポインタに + 1 すると、ポインタが指す先のデータのサイズ分増えることが 理解できなかったりするわけねw 情報処理技術者試験の出題範囲が提示されてる、実施要綱だかの資料に、 附録で参考資料扱いだけど、オペコード表は載ってる。
>そしてポインタに + 1 すると、ポインタが指す先のデータのサイズ分増えることが >理解できなかったりするわけねw データサイズに応じてアドレスポインタ++ できるアーキテクチャってそんな多くないし、 あんまアセンブラと関係ないな。
C言語のその動作って処理系定義だっけ?
void *以外は規格で決まってる
int型は16bitですか?32bitですか? ビッグエンディアンですか?リトルエンディアンですか? 処理系定義だべ?
ポインタに+1した時の動作の話をしてるんじゃないのか?
>>133-135 メモリ上では2進データだけど
画面表示するときとか十進数で表示するけど
LEDとかで1桁の数字とか表示するとかなら固定パターンの出力でいいかもだけど
十進数で数桁あるのを表現するときってどうやってんの?(十進数の桁ごとに分割する方法?)
メモリ上のたとえば4バイトの符号ありの整数とか少数とか
10進の表示:10で割った余りに 30h(=ASCIIのゼロ)を足して1文字表示、これを 商がゼロになるまでくり返す。32bitなら最大8回。 16進の表示:0000000FhでANDすると下4bit分の値(0〜F)ができる。その値をオフセット にして、"0123456789ABCDEF"の表引き(先頭からオフセットbyte先を読みとる)、 その値を1文字表示。元の値を4bit右にシフト。これを32bitなら最大8回くり返す。
なるほど ありがdクス
>>163 いろいろ突っ込みどころがありすぎて困るが、uintをBCD(10進数って何だよw)
に変換するのに普通はそんな間抜けな方法は取りませんw
168 :
166 :2012/08/11(土) 15:55:16.18
Cで書くと例えばこんな感じ void putN(int n) { if (n >= 10) { putN(n / 10); } putchar('0' + n % 10); }
>>168 商と剰余でするなら再帰せずに12バイトの配列用意した方がよくないか?
で、165が言ってるのはそもそも商と剰余を使わずにBCDで論理演算だけでやるんだ(キリッ
って事だろ
誰もBCDで扱いたいとは言ってないけども
>>169 >再帰せずに12バイトの配列用意した方がよくないか?
どういう点でよいと言ってるのか分からんがそう思うならお前がそういう例を示せばいいだけの話。
>>169 >商と剰余でするなら再帰せずに12バイトの配列用意した方がよくないか?
なぜ12バイト?
>>169 >で、165が言ってるのはそもそも商と剰余を使わずにBCDで論理演算だけでやるんだ(キリッ
>って事だろ
>>165 が言ってるのは 整数→BCD の変換だろう
つか数え間違いしてるわw どう見ても最大は10桁だなw
>>173 ttp://ideone.com/0fAwc ・0 与えたとき puts() が 2回呼ばれるとかロジックが汚すぎる。
・マイナスをサポートしてるのは偉いが、0x80000000 を与えると多分うまく表示されない。
他人に見せるサンプルとしてどうなのという気がする。
>>173 >165は変換してそれを使うといいたいんだろ?
>それがそもそも163とかからはお呼びじゃなさそうだったというのを書きたかったのだが
中間形式は1文字/バイトで持とうがBCDで持とうが自由じゃね?
10桁くらいならメリットも小さいが桁がもっと多い場合にはメモリ使用量が少ないとか、デバッガでメモリダンプしたときに見易いとか、無理矢理考えれば BCD にも利点がないわけではない。
10で割るって割り算ってどうやるんだっけか
割り算のアルゴリズムって小学校低学年で習うだろw 最単純な符号なし整数の場合、まず除数と被除数のMSBが揃うまで除数を左シフトして... 後は分かるよね?
今どきの小学校低学年の教科書はどうなっているんだ
ということは10進数を表示するのって結構複雑なアルゴリズムになるわけか
割り算命令が無いような古代の石だと確かに複雑だよ。8085でLSI-Cが無い頃に 仕方なく除算のコードを書いたことがある。7801にも移植できて、奇跡的にパツイチ。
10で除算なんて大して複雑でない。 16bitの値を10で割るだけならこんなもん。8085で書いても30行くらいじゃないか? unsigned div10(unsigned n, unsigned* mod) { unsigned ans = 0; unsigned cmp = 10 << 12; unsigned i; for (i = (1 << 12); i > 0; i >>= 1) { if (n >= cmp) { n -= cmp; ans |= i; } cmp >>= 1; } *mod = n; return ans; }
試しに組んでみたら40行超えた。 cseg div10: xra a sta ans sta ans+1 lxi d,10 shl 12 lxi b,1 shl 12 loop: mov a,l sub e mov a,h sbb d jcs skip mov h,a mov a,l sub e mov l,a lda ans ora c sta ans lda ans+1 ora b sta ans+1
続き: デバッグしてないから動かんかも。眠いし。 skip: ora a mov a,d rar mov d,a mov a,e rar mov e,a mov a,b rar mov b,a mov a,c rar mov c,a ora b jnz loop xchg lhld ans ret dseg ans: ds 2
>>180 というか、だから少なくとも除算がネイティブな機能として実装されてないようなCPUなら
10で割るなんて方法は取らない。
次のものはどんなCPUでも比較的実装が簡単 - BCD同士の加算 - BCDの2のべき乗倍 - byte(nibbleでもいいけど) ⇒ BCD変換 だから、 0xAABBCCDDのBCD変換値は0x00AABBCCのBCD変換値と0xDDのBCD変換値から求められる。 0x00AABBCCのBCD変換値は0x0000AABBのBCD変換値と0xCCのBCD変換値から求められる。 ... あとは分かるよね
>>185 ビデオゲームのスコア表示なんかだったら、数字一桁に1バイトやパックド10進数で数字2桁に
1バイトを複数バイト使って点数計算と表示してたりするけど、そういう特殊な話してんじゃないんだよね?
>>187 で、例えば16ビットの整数の値を割り算使わないで10進数で表示するのってどうやるの?
C の printf() なんかで当たり前に実装されてる機能だと思うけど。
>>187 >0xAABBCCDDのBCD変換値は0x00AABBCCのBCD変換値と0xDDのBCD変換値から求められる。
>0x00AABBCCのBCD変換値は0x0000AABBのBCD変換値と0xCCのBCD変換値から求められる。
>...
>
>あとは分かるよね
なんで16進数が出てくるんだかマジ分からん
>>187 C や擬似コードでもいいんで具体的にご説明願います
>>191 >uint⇒BCD
↑んとこ具体的にご説明下さい。
>>190 流石にそこまで初歩から説明させるのは勘弁してw
っていうか、少しはそれを恥ずかしいことだという意識を持とうよ
>>194 >流石にそこまで初歩から説明させるのは勘弁してw
>っていうか、少しはそれを恥ずかしいことだという意識を持とうよ
お前、具体的な方法も例示できないバカって思われてるの理解してる?
>>196 バカにバカと思われても何とも思わない。
馬鹿だろお前。
さらっとコード書いて説明すりゃ一発な筈なのにな、まあ、できないんじゃ仕方ないが。
10で割る方法は具体的なコードがいくつも挙がってるのに、「10で割るなんて方法は取らない」と 言ってる側からはひとつのコードも例示されない不思議
ヒント: 馬鹿
>>200 これはアセンブラで書かないと意味がないが、特定のCPUのアセンブラで書いても
それを知ってる人間以外には伝わらない。
というか、
>>187 の説明で理解できない奴がコード見て理解できるとは尚更思えんね。
っていうか、こんだけ絡んでくる馬鹿が多いってことは、 つまりこの程度の常識を知らない奴が多いってことか....
>>202 >これはアセンブラで書かないと意味がないが、特定のCPUのアセンブラで書いても
>それを知ってる人間以外には伝わらない。
お前の知ってるアセンブラでいいよ
>>187 >次のものはどんなCPUでも比較的実装が簡単
> - BCDの2のべき乗倍
実装は簡単かもしれんが整数みたいにシフトすりゃいいもんじゃないし、演算のコスト考えれば
割り算なんかしないと言ってるロジックには採用し辛いんじゃないか?
>>205 割り算みたいに1ビットずつシフトして比較して減算して....なんてやるわけじゃないから
コストはずっと低い。
例えば256倍はBCD加算を8回繰り返すだけ。
>>206 >例えば256倍はBCD加算を8回繰り返すだけ。
8ビットの割り算も、引けるかどうか8回繰り返すだけだよ。
>>187 >次のものはどんなCPUでも比較的実装が簡単
> - byte(nibbleでもいいけど) ⇒ BCD変換
それが 整数→十進数変換 だろうに何言ってんのコイツ?
馬鹿の頭脳は8ビット、まで読んだ。
いまだ具体的なコードのひとつも示せない奴がなんか言ってます(ププ
>>202 >これはアセンブラで書かないと意味がないが、特定のCPUのアセンブラで書いても
>それを知ってる人間以外には伝わらない。
「アセンブラで書かないと意味がない」ってのは理解に苦しむが、もし俺がそういう状況だったら知ってる人が多いであろう x86 か ARM で書くけどなあ?
それか、書けるアセンブラ(8080、Z80、6800、6809、6502、8086、386、x64、PIC、AVR、SH、mips、PowerPC、Alpha)の中から選んでもらってそれで書くわ。
それぐらいの対応お前できねーの?
あ、68K抜けてた。
ARMも抜けてた。ボロボロだな。
__m128 _mm_cvtepi32_decstr(__m128 a) a最下位のuint要素を10進表現の文字列へ変換して返す。(余った桁には0が入る。) こんな感じに1〜2クロックで変換できるSIMD演算器の命令、追加されないかな。 需要無いか。
128bitの値が素数が否か1クロックで判定する命令追加されないかなー
>>187 >次のものはどんなCPUでも比較的実装が簡単
>
> - BCD同士の加算
> - BCDの2のべき乗倍
> - byte(nibbleでもいいけど) ⇒ BCD変換
どんなCPUでもBCD演算をサポートしてるとか思ってる?
>>217 そう思うなら試しに君が書いたら?
まあアルゴリズムが理解できないから無理だよねw
自分の理解力不足を棚に上げてこれだからな。
アセンブラのそれなりに実用的なコードなんて暗号的な上に冗長で、
相当慣れてても読解に苦労するものなのにそのサンプルを書けとか馬鹿の戯言意外に聞こえん。
>>187 >次のものはどんなCPUでも比較的実装が簡単
>
> - BCD同士の加算
> - BCDの2のべき乗倍
> - byte(nibbleでもいいけど) ⇒ BCD変換
>
>だから、
>
>0xAABBCCDDのBCD変換値は0x00AABBCCのBCD変換値と0xDDのBCD変換値から求められる。
>0x00AABBCCのBCD変換値は0x0000AABBのBCD変換値と0xCCのBCD変換値から求められる。
>...
>
>あとは分かるよね
なんも説明してない典型
>>220 >アセンブラのそれなりに実用的なコードなんて暗号的な上に冗長で、
>相当慣れてても読解に苦労するものなのにそのサンプルを書けとか馬鹿の戯言意外に聞こえん。
ん?
>>183-184 とかこのスレにコード投稿してる人もいるのに何言ってんの?
>>220 >アセンブラのそれなりに実用的なコードなんて暗号的な上に冗長で、
>相当慣れてても読解に苦労するものなのにそのサンプルを書けとか馬鹿の戯言意外に聞こえん。
だから擬似コードでもいいって言われてんのにねー?
>>202 >これはアセンブラで書かないと意味がないが、
C言語とかにはないBCD加算とかの命令は中身ブラックボックスの関数とかで代替できますよ。
a = bcdadd(b, c);
「アセンブラで書かないと意味がない」ってどゆこと?
>>224 >>これはアセンブラで書かないと意味がないが、
「演算によるフラグへの影響を再現できない」とか言うのかな?
グローバル変数でCとかZとかのフラグ用意してaddやsubとかの演算は関数用意するとか、
C++で演算子のオーバーロードするとか、方法は幾らも考えられるよね。
>>225 こんなこと一々説明されないと理解できないことは恥だと思うべきだと俺は思うが、
今問題にしているのは実行効率だから。
なぜ10で割った商と剰余を利用するより
>>187 の方法の方が効率的かはCで書いても
コードに現れない。
っていうか、
>>187 が理解できればコード書けなんて馬鹿は言わないはずで、
だったらこういうの相手にしても時間の無駄だな。
説明がおかしいという考えに及ばないところが馬鹿丸出し
>>226 >こんなこと一々説明されないと理解できないことは恥だと思うべきだと俺は思うが、
>今問題にしているのは実行効率だから。
>
>なぜ10で割った商と剰余を利用するより
>>187 の方法の方が効率的かはCで書いても
>コードに現れない。
説明求められてんのはロジックなのに変な言い訳w
コード提示すりゃ済む話を長々と引っ張るネw
>>226 >今問題にしているのは実行効率だから。
>
>なぜ10で割った商と剰余を利用するより
>>187 の方法の方が効率的かはCで書いても
>コードに現れない。
どういう処理を機械語に落としたらどの程度の効率になるかなんてのは、自分で触ってる
プロセッサなら当たり前に想像付くようなモンじゃね?
お前、自分はそういう見積もりが出来ませんと言ってるワケ?
>>231 求められてるのはロジックだと言ってるよ。お前が実行効率を理由にコードを提示しない理屈は通らんよ。
まあ、コードの提示がない時点で出来ませんと言ってるも同然なんだが
>>203 >っていうか、こんだけ絡んでくる馬鹿が多いってことは、
>つまりこの程度の常識を知らない奴が多いってことか....
常識って言うなら、どっかの他人が書いるコードとかロジックの説明のページ、ゴマンとあんじゃね?
お前に具体的なコード書いたりすんのが無理ならそのURL書くだけでもいんじゃね?
訂正 ×どっかの他人が書いる ○どっかの他人が書いてる
>いろいろ突っ込みどころがありすぎて困るが、uintをBCD(10進数って何だよw) >に変換するのに普通はそんな間抜けな方法は取りませんw まあ、BCD(=二進化十進数)の言葉の意味も理解してない馬鹿みたいだし。
スレタイも読めない奴が上から目線で初心者を叩くスレがあると聞いてきたんですが、もしかしてここですか?
ここはアセンブラ初心者が上級者ぶって初心者を叩くスレだから
>>239 違いますね。ここは知識豊富な上級者様(=
>>203 )に、「この程度の常識を知らない奴」等が教えを請うスレです。
>>187 ひょっとしてお前こういうこと↓言いたいわけ?
typedef unsigned char bcd_t[5];
void put10(unsigned n)
{
bcd_t ans;
bcd_t t;
int i;
memset(ans, 0, sizeof(ans));
for (i = 0; i < 32; i += 8) {
byte2bcd(&t, n & 0xff);
bcdMultPowerOf2(&t, i);
bcdAdd(&ans, &t);
n >>= 8;
}
bcdPut(ans);
}
byte2bcd() の中身、割り算なしでどういう実装になるか教えてくれん? まさかテーブルじゃねぇよな?
>>238 たいして専門知識もない奴が大昔に訳したまんま所が多いJMを出典にすんなw
「整数値を、8進法 (o), 符号なし10進法 (u), 符号なし16進法で数字(列)に変換する」が正しい。
つーかこの程度のコードも明示できないんだとしたら終わってるだろ。
>>242 byte⇒BCDはuintの上位バイトから実行した方が効率がいい。
byte⇒BCDの部分は除算命令でもテーブル参照でも何でも構わない。
そこで除算を使うななんて言ってない。
おっ、コードの一つも提示できなかった奴がなんか言ってるw
>>246 >そこで除算を使うななんて言ってない。
「というか、だから少なくとも除算がネイティブな機能として実装されてないようなCPUなら
10で割るなんて方法は取らない。」
なーんか、こういう高速化方法もあるよぐらいで済ましときゃよかったのに「常識」とか言っちゃって引っ込みが付かなくなったカンジね
馬鹿の癖にプライドだけは高い奴の典型
>>187 >次のものはどんなCPUでも比較的実装が簡単
>
> - BCD同士の加算
> - BCDの2のべき乗倍
> - byte(nibbleでもいいけど) ⇒ BCD変換
「どんなCPUでも」って、BCD演算サポートしてないCPUにはしんどいんじゃないの?
結局、馬鹿が自分の思い込みを常識と勘違いしてただけでしたチャンチャン
PLC(いわゆるシーケンサ)のCPUならBCD演算今でもサポートしてるよ ニモニックで書けば一応アセンブラか? もっともPLCのCPUはSHとかのどこにでもあるCPUの上の仮想CPUだけどね
>>187 >次のものはどんなCPUでも比較的実装が簡単
> - BCDの2のべき乗倍
試しにZ80で2**24倍するコード書いてみたが処理重すぎだろ。
ld c,24
loop1:push hl
ld b,5
loop2:ld a,(hl)
add a,(hl)
daa
ld (hl),a
inc hl
djnz loop2
pop hl
dec c
jp nz,loop1
ret
これだけでざっと見て5000サイクル位掛かるじゃねーか。10で割ったほう速いだろ。
>>255 >PLC(いわゆるシーケンサ)のCPUならBCD演算今でもサポートしてるよ
だから何? 8080だって6502だってBCD演算今でもサポートしてるけど?
BCDで2倍を24回繰り返すのと、BCDで16777216倍すんのと、どっちが速いだろう?
ここまでスレが伸びるとか10進数表示って奥が深いんだな
Cでprintf("%d",v);だけのプログラム作って解析すりゃいいんじゃね
解析は犯罪です
6502って現役なの?リモコン用?
gccのコード見た方が早くね?
CASL2で10進数表示のコードを提示してください
このアルゴリズム的に何の意味もないコメントの付け方をみると無性に腹がたつ。 学習用とはいえ、いちいち命令をすべて日本語に読み下すなと。
>>269 どんだけ特殊な製品なんだw
こいうお遊び以外では需要なんてないだろ。
世の中に出回ってる製品のうち、使ってるマイコンの種類をエンドユーザーが分かるものなんて稀だろう。 俺らの知らんところで6502が使われてても不思議はない。
ないないw そもそも8bitなんて組み込み用途しか需要がないんだから組み込み「マイコン」以外の CPUに需要はない。
>>273 >そもそも8bitなんて組み込み用途しか需要がないんだから組み込み「マイコン」以外の
>CPUに需要はない。
新規開発に限ればまあだいたい合ってるが世の中それだけではない。
国内のパチンコやパチスロの当たりを決めてるところの制御はいまだにZ80の派生品で行ってるらしい。 外国から見れば、日本のパチンコやパチスロの事情なんてわけの分からん話だろうし、一般に情報も伝わらないだろう。 どこかの国に「日本のパチンコやパチンコ」に該当するものがあったとして、我々はそれを知りうることができるだろうか? 「組み込み「マイコン」以外のCPUに需要はない」と断言する奴は視野が狭いと思う。
訂正 ×「日本のパチンコやパチンコ」 ○「日本のパチンコやパチスロ」
>>275 パチンコ業界のことは知らんが、恐らく派製品ですらなくIPでしょ。
あれをZ80と呼んでよいかは微妙だね。
そもそも今時本当にZ80相当を使ってるかどうか疑わしい気もする。
都市伝説の類じゃないのか?
LE-Techも聞いたことない素人さんですか?
まあなんにしろ、仮に事実パチンコにZ80が使われ続けているとしても、 それは政治/行政上の理由という特殊事情で選択されているに過ぎず、技術的あるいは経済的理由で 選択されているわけではない。
>>279 そういう事情が日本以外には存在しないと考えるおバカさんですか?
>>275 はもはや持論を正当化するための屁理屈に過ぎんな
だから知らねえって言ってるだろ。 それに、求人があるからって現行製品かどうか分からんでしょ。 ある種の保守用人員かもしれない。 例えば古い台をゲーセン用に改造するためとか
知らない奴が何いってんだろ?
>>283 >それに、求人があるからって現行製品かどうか分からんでしょ。
>ある種の保守用人員かもしれない。
>例えば古い台をゲーセン用に改造するためとか
求人内容見て言ってる? 必死すぎw
初心者の質問スレじゃなくて プロが語り合うスレになっちまってるな
>>283 >だから知らねえって言ってるだろ。
知らないくせに断言とか良くできるなー。感心するわ。
どう見ても片っぽは素人
暑苦しいおっさんどもだなぁ
64bitだとアセンブラ使えないのか・・ どうしよう
>>290 インラインアセンブラか何かを勘違いしてる?
何ビットだろうと出来ないことはないだろう 最悪、ハンドアセンブルで!
C言語の入門書をやり終えたら パソコンが中で何やってるか知りたくなって、アセンブラに興味が湧いたんだけど スレの上のほうで64bit環境じゃうまく動かないって報告があったから… アセンブラで何か作りたいってわけではないのですが、いい参考書あったら教えて下さい 因みにラ・リ・ルって 「アセンブラでアセンブリをアセンブルする」 でいいんですよね?
本読んで終わりって人達ですか?
>>294 それと、はじめて読むアセンブラ―ソフトウェアツールの原点を探る
を買ってみます
>>295 触って動かしてみたいけど64bit環境しか無いので…
>>296 パソコンで64bit環境(x86系)なら、32bitなアプリも作れるでしょうに
何を読んで?そう思ったのかしらんけどね
アセンブラっていっても、どのCPU?でやりたいのかな?
>>293 CPUの中身を知りたいのならオレが今読んで学んでる、Z80マイクロプログラミング実習って本がわかりやすい
いきなりx86系とか学ぶと頭ついていかなかった頭の悪いオレからの助言
それは違うだろ Z80も一応調べてみたけど「あれ?乗算除算浮動小数点演算命令ないよ?何それ?」 って感じだった x86の方が明らかに組みやすい
書けても動かないとか?
>>299 >「あれ?乗算除算浮動小数点演算命令ないよ?何それ?」
>x86の方が明らかに組みやすい
そういうレベルで分かった気になってると、自前で乗除算組まなければいけなくなったときに泣きを見るゾw
>おれ、x86のアセンブラ知ってるんだ それって、かっこいいの?
楽したければ
浮動小数点は上位言語で使えるようになってるからね アセンブラよりは低レベルな考え方を身につける方がいいんじゃね 今は、CPUに依存した命令が読めればいい方
>>302 >それって、かっこいいの?
むしろ知らないとCのデバッグにも苦労すると思う。
性能出したいところでコンパイラの出力したコードを参照してソースの書き方変えるとか、当たり前のことだし。
>>305 レベルの高いことまでやろうとは思ってないんじゃないの?
IEEE754に準拠した浮動小数点演算命令パッケージは探せばあちこちに落ちてるけど 回転/シフト命令だけで結構楽に組めるんだな 超越関数に至ってはSSE2で書いた方がFPUよりも速いという
>>308 >を見て64bitだとうまくいかないのかと思いました
Windowsの64bit版だと16bitのコードが動かないのはその通り。
64bitか32bitのコードを動かすか、エミュレータ上で16bitのコードを動かせばよいだけ。
>>309 調べてみたら
win7のxpモードで16bitが動くようなので
それでやってみます!
mov CS:[w_sp],SP この第一オペランドの:の意味がわからんのです これはCSとw_sp両方にSPを入れるってことなの?
>>311 本かインテルのマニュアルかなんか見れ。
本見たりググったりしたんだけどわかんねーんだよ 記述自体が古いのかな… なんせPC9801のアセンブラだから…
>>313 超基本的なことだから、書いてないなら本が悪い。ぐぐってわからんのならお前の頭が悪いわ。
基本的なことなのか!! すまん…もうちょっと頑張ってぐぐってみる ありがとう
あ!わかった!!! CSってのはコードレジスタだから、そこを基準に[w_sp]分オフセットがかかってるってことなんだな!! わかったぞ! >>313さんありがとう ちゃんと考えなかったオレが悪い 考えるキッカケを作ってくれてありがとう
ごめん313じゃなくて314でした
@ inc dword ptr [count] というのはアトミックですか? ++cnt; をVC10でReleaseコンパイルしたら上記のようになったのですが、 デバッグコンパイルしたら下記のように分解されてしまいました。 A mov eax,dword ptr [count] add eax,1 mov dword ptr [count],eax Aは明らかにアトミックではないと思いますが、 コードの途中で、他のスレッドが同じコードを通ったときに カウントがおかしくなってしまうのは構いません。 2つ以上のスレッドが同時に@かAを通ったときに 動作が異なる可能性があるのかを知りたいです。 (動作が異なるならインラインアセンブラで書くか、 カウントがおかしくなるのが困るようになったときは クリティカルセクションでも使います)
InterlockedIncrement
一応、そのx86での実装は 普通はinc等ではなく、lock+xadd
321 :
318 :2012/09/27(木) 11:59:10.28
>>319 >>320 知りたいのは、マルチスレッドで同じコードを同時に通った場合に、
@とAで動作が異なる可能性があるかどうかなのです。
カウントがおかしくならないようにするための方法を
示していただいたということは、@もアトミックではないと
解釈して良いのでしょうか?
割り込みコントローラ回りのコーディングが、どうしたものかわかんないんだよなぁ
cmpxchg
H8なら@に相当するコードはアトミックだったよ。割込とタスク両方からカウントを 変更するときに割禁かまさなくて済むから意識的に使った。 だからx86でも@はアトミックだと類推する。
* add eax,1 * mov dword ptr [count],eax *印のところでスレッド切り替えが起きたらどうなると思う?
326 :
318 :2012/09/28(金) 12:23:50.67
回答ありがとうございます。
>>323 クリティカルセクションを実装するのに使える命令なのでしょうか?
排他が必用になったときに、試してみます。
>>324 @がアトミックだとなると、
デバッグ版のAとは違う動作になってしまいます。
あまりに挙動が変わってしまう場合は、
インラインアセンブラで@に書き換えてみます。
>>325 他のスレッドで、カウントが巻き戻ってしまうかも
しれないというのは分かります。
他に致命的な問題があるのなら、
インラインアセンブラで@に書き換えてみます。
PC/AT互換機での電源の制御ってどう行えばいいんだ?(シャットダウン等) BIOSファンクションがあるのか、はたまたデバイスとやり取りしてやるのか 出来るなら、どいつが扱ってるのか理解したいから、BIOSファンクションを使わなくてもいいなら、そちらの方法が知りたい
ACPIを通しているのは確実でしょ。 どうやってACPIを使うかは知らん。 探せば仕様書くらい出てくるかも。
>>327 APMファンクション呼べばよろし
ACPIでもできるけどAMLインタプリタ用意せにゃいかんので
面倒くさい
>>331 APMという単語で調べて、一応なんとかなった、ありがとう。
調べれば調べるほど、アセンブラでもかなり高級なプログラミングなんだなと思えて、嫌になってくるが。
in、out命令でなんとかならないかのう
>>332 Embedded Controler叩けばいいはずだが、標準仕様がないしそのへんの情報は
ほとんど公開されとらんので自力で調べんといかん
のでBIOSにお願いするのが一番簡単
APMって未実装のものも多いよな ACPI使わないとデバイス割り当て出来なかったりもするし、どこに向かっていくんだか…
そりゃAPMじゃ手に負えなくなってACPIができたんだから 16bitモードが消え去ってUEFIに移行すりゃなくなるだろう
computer 計算機(JIS用語らしい)、コンピュータ compiler コンパイラ、「コンパイルを行う翻訳プログラム」 linker リンカ、「…ロードモジュールを作成するために用いられる計算機プログラム」 assembler アセンブラ、「アセンブルを行う翻訳プログラム」 assemble アセンブルする、「アセンブラ言語で書かれたプログラムを目的プログラムに翻訳する」 assembler language program アセンブラ言語プログラム assembly language アセンブラ言語(JIS用語らしい)、アセンブリ言語、「機械命令に対応した記号形式を備えたプログラム言語」 source code ソースコード、原始コード コンピュータ用語辞典第3版(日外アソシエーツ)
337 :
デフォルトの名無しさん :2013/04/24(水) 11:21:55.75
よろしくお願いします。 はじめてプログラミングを勉強するにあたり、 CASL2とZ80だとどちらがお勧めでしょうか? CASL2は基本情報参考書の付録CD-ROMのエミュ、Z80は講談社ブルーバックス付録CD-ROMのエミュを持っていて、このどちらかで勉強を始めたいと考えているのですが… どなたかアドバイスをよろしくお願いします。
プログラミング自体が始めてならいきなりアセンブラというのはあまりお勧めできない。 それでもやるというならどちらでも好きにしなさい。
>>337 エミュレータを使っての学習はつまらんので続かないと思う。
実機を使うのが良いよ。
ということで、CASL2は落選。ゼッパチの使える基板が秋月辺りで帰れば面白い。
ごめん、買えれば ね。
Z80は既に実用的な用途はだいぶ減ってるし、CASL2はもとから実用的なものではないから、 要するに機種はなんでもいいからアセンブラを始めてみたいということだと思うが、それなら 今ならArduino辺りでいいと思う。LEDチカチカさせるだけでも楽しいよ。
343 :
337 :2013/04/24(水) 20:27:47.68
皆さんありがとうございます。 アドバイスをぐぐって調べてみます コンピュータを理解したくて、勉強をしたいと思ったんです。
このへんやっても今のPCの理解が深まることはないと思うけどな
>>344 お前みたいなやつがいるからどんどんレベルが下がってんだよ
>>344 >今のPCの理解が深まることはないと思うけどな
それがアセンブラ弄る唯一の目的と思ってるならお前バカ丸出しだよw
いまからASMやって身になるならどのへんかねぇ キャッシュと分岐予測あたりが必須になりそうな
>キャッシュ ない環境も普通にある。 >分岐予測 ない環境も普通にあるし、あってもプログラマとってはさほど負担になるものではない。
分岐予測が必須とか、15年前からタイムスリップしてきたMIPS信者ですか?とかw
そりゃないとこ探せばあるんだろうけども
「必須になりそう」って、キャッシュも分岐予測も解ってない奴が何言ってるんだろ?
Ollydbgで得られるアセンブラの記法ってインテル記法?AT&T記法?どっちですか?
ググレカス
>>352 みたらインテル表記でした
ネトゲ(とりあえずどんなネトゲでも、npro,ゲームガードつきとか)のチートツールを作ってみたいんですがどうすればいいんでしょうか?
Windows7です
串作成、ラッパー、デコードルーチン実装とかなに?
教えてください
串作成っていうの接続のときプロキシを使うってこと?
ラッパーは?デコードルーチン実装って?
よくわかりません アンパックとかはなんとなくわかりますが
どうやって学んでいけばいいのか教えてください
板違い
357 :
デフォルトの名無しさん :2013/05/21(火) 00:02:08.27
世界一速い整数多倍長計算ライブラリを作ってくれませんか?
そんなニーズないよな
なくはないと思う
昔そういうスレがあった気がする 完成したのか挫折したのか知らんけど
そりゃ何でも少しでも速いほうがいいのは確かだけど、 新しく作ったらバグが完全に無くなるまでしばらくかかるし。
並列処理対応、64bit対応じゃないと嫌。パスワードクラックしたいんです。
パスワードクラックなら最近はGPU(GPGPU)系じゃね?
365 :
デフォルトの名無しさん :2013/05/21(火) 20:46:51.41
366 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/05/21(火) 21:39:53.83
x86逆汗を作っています。 インテルの技術文書を読みました。 PE形式の情報がダンプできるようになりました。 何かアドバイスをお願いします。
アドバイスも何も仕様に従って変換するだけだろ 強いて言うならアドレスを生の数値だけじゃなく 何らかのラベルをつけるといいかもね
1パスディスアセンブラなんて簡単過ぎるから2パスアセンブラを作る つまりジャンプ先にラベルを付ける あとある程度コードとデータの分離を可能にし、コードは16進ダンプと 文字列を付ける、など
アドレッシングややこしや 関数の呼び出し規約が難しい
そんなんややこしい内に入らん
64bitの呼び出し規約はレジスタ渡ししつつスタックは開けておくとか スタックを16バイト境界に揃えるとか結構ややこしい
そんなんややこしい内に入らん
375 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/06/02(日) 21:38:39.39
こいつはどでかいswitchが出来そうだ。 ところでa16って何?
376 :
デフォルトの名無しさん :2013/06/03(月) 00:02:51.99
push %ebp mov %esp,%ebp sub $0x28,%esp これgdbで出た結果なんだけど、どういう風に動いてるのかよくわからなくて、図で説明してくださると助かりますorz
スタックフレームを作ってローカル変数領域を確保している
378 :
デフォルトの名無しさん :2013/06/03(月) 00:17:28.67
>>377 1行目で4バイト分確保するん? それで2、3行目はなにを?
379 :
デフォルトの名無しさん :2013/06/03(月) 00:21:37.15
もしアセンブラ詳しい人いて教えてくれる人いればスカイプに来てくれると嬉しいです。 スカID satito39
381 :
デフォルトの名無しさん :2013/06/03(月) 00:28:42.09
>>380 はじめの4バイトと3行目の0x28バイト分はその図でいうとどこに当たるのでしょうか?
382 :
デフォルトの名無しさん :2013/06/03(月) 01:26:18.00
push %ebp 新たなフレームポインタを書き込むためebpをスタックに退避 mov %esp,%ebp フレームポインタを更新 sub $0x28,%esp 28バイト分のローカル変数領域をスタックに確保
>>382 > sub $0x28,%esp 28バイト分のローカル変数領域をスタックに確保
40バイト
384 :
デフォルトの名無しさん :2013/06/03(月) 07:18:49.71
movl $0xaea4a4af,-0x13(%ebp) movl $0xb6b2a6ba,-0xf(%ebp) movw $0xc4,-0xb(%ebp) movb $0x0,-0x9(%ebp) 続きでこういうものがあればどう動くのですか?
push %ebp ;ebpの退避(以前の BP の値) mov %esp,%ebp ;ローカル変数参照時にBPを使ってる? sub $0x28,%esp ;ローカル変数領域の確保 何がやりたくて質問してんのやら
void foo(void) { uint32_t a,b; uint16_t c; uint8_t d; a = 0xaea4a4af; b = 0xb6b2a6ba; c = 0xc4; d = 0; : : :
アラインメント取れていないし文字列でないかい
389 :
デフォルトの名無しさん :2013/06/03(月) 16:54:22.97
こういうものがありどのように動くのかなとおもいまして、できれば動きを順番に解説していただきたいorz 0x0804840c <+0>: push %ebp 0x0804840d <+1>: mov %esp,%ebp 0x0804840f <+3>: sub $0x28,%esp 0x08048412 <+6>: movl $0xaea4a4af,-0x13(%ebp) 0x08048419 <+13>: movl $0xb6b2a6ba,-0xf(%ebp) 0x08048420 <+20>: movw $0xc4,-0xb(%ebp) 0x08048426 <+26>: movb $0x0,-0x9(%ebp) 0x0804842a <+30>: jmp 0x804844b <foo+63> 0x0804842c <+32>: movzbl -0x9(%ebp),%eax 0x08048430 <+36>: movzbl -0x9(%ebp),%edx 0x08048434 <+40>: movzbl -0x13(%ebp,%edx,1),%ecx 0x08048439 <+45>: mov $0xffffffcc,%edx 0x0804843e <+50>: sub -0x9(%ebp),%dl 0x08048441 <+53>: xor %ecx,%edx 0x08048443 <+55>: mov %dl,-0x13(%ebp,%eax,1) 0x08048447 <+59>: addb $0x1,-0x9(%ebp) 0x0804844b <+63>: cmpb $0x9,-0x9(%ebp) 0x0804844f <+67>: jbe 0x804842c <foo+32> 0x08048451 <+69>: lea -0x13(%ebp),%eax 0x08048454 <+72>: mov %eax,(%esp) 0x08048457 <+75>: call 0x80482f0 <puts@plt> 0x0804845c <+80>: leave 0x0804845d <+81>: ret
自分であたまを使おうという気はゼロ
0xccでxorした文字列(10文字)を戻して表示してるだけ
おまいらいじわるだな せめて金額交渉くらいしてやれよ
アセンブラのディレクティブなどの方言説明がばらばらって困るよな。 同じCPUなのに命令記述が違いそんなレジスタないみたいな。 データの流れが右から左へと左から右へと逆だったり。 酷いのは命令語のニーモニックが特殊な略なのにその説明がどこにもない。 インラインアセンブラとかも個性ありすぎるのにインライン部分の仕様は 解説が一切ないみたいな。
嫌だったら使うなよ そのためにC言語とかあるんだから アセンブラ無しでハンドアセンブルなんて事もしょっちゅうだぞ
統一仕様を策定してユーザーを増やそう という世界じゃないから
397 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/06/08(土) 18:53:19.31
ndisasmのバグ発見! F2 0F D6 ... が正しくMOVDQ2Qに変換されない。
ごめんなさい、バグじゃなかったみたい
>>397 たんにサポートしていないだけだろ。正式対応まで待て。
400 :
デフォルトの名無しさん :2013/06/22(土) 07:16:16.14
#include <stdio.h> void main(void) { unsigned buf[4]; _asm { cld mov esi, offset buf mov eax, 22222 mov ecx, 4 rep stosd }; for (int i=0; i<4; i++) printf("%d\n", buf[i]); } このコードを実行すると意図した結果(buf[0]〜buf[3]まで全部22222になる)にならずハングアップするのですが、 どうすればよろしいでしょうか?
>mov esi, offset buf これ lea esi, buf じゃないの?動かしてないけど
動かしてみた あと、esiじゃなくてediな int main(void) { unsigned buf[4]; _asm { cld lea edi, buf mov eax, 22222 mov ecx, 4 rep stosd }; for (int i = 0; i < 4; i++) printf("%d\n", buf[i]); } 22222 22222 22222 22222
eaxやecxをpushしなくていいの?
404 :
400 :2013/06/22(土) 10:47:50.40
>>403 環境依存だからなあ・・・気に掛かるならインラインアセンブラで使うレジスタは
全部退避すると安心かもね
でもpushすると例えば lea edi, buf は俺の所では lea edi, [esp] と展開されたので
狂ってくるような気もする
実際やってみないとどうなるか分からないけど
406 :
片山博文MZパンク ◆0lBZNi.Q7evd :2013/08/05(月) NY:AN:NY.AN
今、逆アセンブラ作ってる。巨大なswitch構文ができた。これをデータ表現にしようと考えている。 やるならx86以外のCPUについても、CPUの違いを吸収して統合させたい。 各CPUのアーキテクチャの表現はどのようにすればいいか?
1ワードで複数の命令含むアーキテクチャなんかもフツーにあるし汎用的な表現なんて無理
1ビットを一文字とした構文解析と考えればいいのでは?
余計なことを考えるのはまともに使えるものを一本仕上げてからにしろ
ただちに影響はありません
HxD っていうHEXEDIT使ってるけど、WIN8に変えたら エラー履くようになりました・・・ どうすればいい? Cannot creat file "C:¥Program Files¥HxD.ini".アクセスが拒否されました。
> どうすればいい? いまどき Program Files の下に ini ファイル作ってるソフトなんか捨てれ
普通どこに作るんだよ?
415 :
デフォルトの名無しさん :2013/09/06(金) 17:06:30.70
いまどきは C:\Program Files (x86)\
>>414 レジストリかね。
もしくはAppDataとか、マイドキュか。
ユーザーディレクトリの直下にドット付のフォルダを作ってそこに入れてるアプリもあるね。
Program Filesはunix系のOSで言ったら、/usr/bin とか/local/usr/binにあたるから
データを保存するのは、ちょっとないね。
Program Dataだろ。
ProgramDataは全ユーザー共通じゃん。
419 :
デフォルトの名無しさん :2013/09/06(金) 18:00:55.59
ていうか、exeファイルをProgramFiles直下に置いているような気がするのだが
それ以外どこに置くんだ?
Win8のセキュリティ設定を変えるだけだろ? それすらできないやつがアセンブラ? バイナリエディタ? 百年早えわ
>>421 そんなところにexeなんて置いたことありませんが
424 :
デフォルトの名無しさん :2013/09/07(土) 10:30:32.07
>>168 n % 10 が糞遅いだろ
これだから高級言語に被れたあほは
>n % 10 が糞遅いだろ 適切にコード化されてるなら、前段の /10 で %10 も計算できてるな。まあ、そんなコンパイラ存在しないとは思うが。
除算を使わない高速な方法を
>>425 さんが示してくれます
一度の計算で余りもレジスタに入るから、実質二度手間になるんだろ?
>>425 は gcc -O3 -S とかやったことが一回もないドあほ。
実際にやってみろ。自分がどれだけドあほか、わかるから。
gccが最も効率のいいコードを吐くとでも思ってるのかな? ドあほってレベルじゃないぞ
432 :
デフォルトの名無しさん :2013/09/10(火) 13:51:02.98
煽りを入れるのは見比べてからでも遅くはないのでは?
>gccが最も効率のいいコードを吐くとでも 早くも問題をすり替えて逃げ態勢に入りました
cygwin 上の gcc で試した。gcc のバージョンは 4.7.3 _putN: subl $28, %esp movl %ebx, 16(%esp) movl 32(%esp), %ebx movl %esi, 20(%esp) movl %edi, 24(%esp) cmpl $9, %ebx jg L7 L2: movl %ebx, %eax movl $1717986919, %edx movl 20(%esp), %esi imull %edx movl %ebx, %eax movl 24(%esp), %edi sarl $31, %eax sarl $2, %edx subl %eax, %edx leal (%edx,%edx,4), %eax addl %eax, %eax subl %eax, %ebx addl $48, %ebx movl %ebx, 32(%esp) movl 16(%esp), %ebx addl $28, %esp jmp _putchar
435 :
434 :2013/09/10(火) 14:12:54.83
.p2align 4,,7 L7: movl %ebx, %eax movl $1717986919, %ecx imull %ecx movl %ebx, %eax sarl $31, %eax movl %edx, %esi sarl $2, %esi subl %eax, %esi cmpl $9, %esi jg L8 L3: movl %esi, %eax movl $1717986919, %edx imull %edx movl %esi, %eax sarl $31, %eax sarl $2, %edx subl %eax, %edx leal (%edx,%edx,4), %eax addl %eax, %eax subl %eax, %esi addl $48, %esi movl %esi, (%esp) call _putchar jmp L2
436 :
434 :2013/09/10(火) 14:13:59.16
.p2align 4,,7 L8: movl %esi, %eax imull %ecx movl %esi, %eax sarl $31, %eax movl %edx, %edi sarl $2, %edi subl %eax, %edi cmpl $9, %edi jle L4 movl %edi, %eax imull %ecx movl %edi, %eax sarl $31, %eax sarl $2, %edx subl %eax, %edx movl %edx, (%esp) call _putN
437 :
434 :2013/09/10(火) 14:14:44.55
L4: movl %edi, %eax movl $1717986919, %edx imull %edx movl %edi, %eax sarl $31, %eax sarl $2, %edx subl %eax, %edx leal (%edx,%edx,4), %eax addl %eax, %eax subl %eax, %edi addl $48, %edi movl %edi, (%esp) call _putchar jmp L3
>>168 はこう↓書いた方がなんぼかマシ。
void putN(int n)
{
if (n >= 10) {
putN(n / 10);
n %= 10;
}
putchar('0' + n);
}
こう↓書いて gcc -O3 しても div() 呼び出してる部分が展開されなかったのは意外だった。
#include <stdlib.h>
void putN(int n)
{
if (n >= 10) {
div_t d = div(n, 10);
putN(d.quot);
n = d.rem;
}
putchar('0' + n);
}
div_t とか使ってるの見たことない 誰も使わないから対応しないんじゃなかろうか
440 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2013/10/01(火) 09:39:59.60
OFっていつもゼロなの? __asm__("movl $0xFFFFFFFF,%%eax\nadd $4,%%eax\nseto %0\n" :: "m"(b) : "%eax"); printf("%d\n", b); //0
ヒント: 符号付き整数
443 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2013/10/14(月) 14:01:30.87
x86で int a,b; ADD a,b; がオーバーフローする条件をC言語で表すとどうなりますか?
自己解決しました。 (a<-b) != (a+b<0)
a と b 共に 0x80000000(-2147483648) だとして、 (a<-b) != (a+b<0) = (0x80000000<-0x80000000) != (0x80000000+0x80000000<0) = (0x80000000<0x80000000) != (0<0) = (0) != (0) = 0 で全然オーバーフローの検出なんてできてないと思うんだが。
446 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2013/10/14(月) 16:44:55.65
>>445 見落としてました。
どうすればよいのでしょうか?
むずかしいよぉ〜
(a>=0 && b>=0 && a+b<0) || (a<0 && b<0 && a+b>=0) これより簡単にできないみたい。有り難う。
449 :
デフォルトの名無しさん :2013/10/21(月) 19:44:36.41
画面に反して本体がmkIIじゃないのが残念
451 :
片山博文MZコスモ ◆T6xkBnTXz7B0 :2013/10/22(火) 19:22:12.38
(i) x64のprologで認められている命令とは何か? (ii) x64のepilogで認められている命令とは何か?
(i) スタックに積む命令とスタック領域を確保する命令 (ii) スタックから積み下ろす命令とスタックポインタを補正する命令 でいいんだっけ?
初心者スレの割りにレベルが高くてこんなことを聞くのもためらわれまずが 64bitのCPUに32bitのOS入れて解析ってできますか? CPUも32bitのほうがいろいろ捗りますかね
分からない奴にOSの解析など不可能
ねぇここって初心者の質問に答えるスレじゃないの? あとOSの解析なんて言ってないんで^^; 偉そうにしてるとこ悪いけど日本語読んでね
何を解析したいのかも書かない奴がなんでか偉そうだね
川越で解析料理なるものを初めて頂く機会があったが、どうせ薄味でお上品な料理ばかりだろという先入観が打ち砕かれたよ 9000円分の満足感があったかと言われると、まあ貧乏人なので牛丼と比べてNoと言ってしまうのだけど 9000円分の仕事をきっちり味わえたな、という実感はありました
誤表記詐欺ですねわかります
○懐石料理 ×解析料理
そう言えばNHKで「会席料理」ってやってて、「あれ?懐石料理じゃないの?」と思ったら 読みは同じでも別の料理だった チラ裏
ふうむパーティーフードの訳かしらと英辞郎引いたら、a kaiseki mealだと…
462 :
デフォルトの名無しさん :2013/11/20(水) 17:38:55.81
NHKは勝手に造語造るの好き
>>462 本屋で見かけたけどどうでもいい内容の本だったわ
ようやるわと思ったら中国人ぽい名前が並んでるな いいのかインプレス
中国人だからどうだというんだ。 だったら差別したいの?
わろた 詳しい出品者情報 正式名称: パウロ屋 ストア代表者名: 電話番号: 080 住所: 世田谷区野毛 その他・備考: Amazonマーケットプレイスにおける商品の返品と返金条件に準拠します 最近の評価: 1(5が最高):「到着予定を過ぎても何日待っても商品の届く気配すらありません。 キャンセルした所応じてくれましたがクレカ払いにした為返金も遅れるし返金確認するまで不安で仕方ありません。 最低な出品者です。」minos..., 2013年11月11日 1(5が最高):「本じゃ有りません。紙束です。こんなものを本屋のサイトで「中古品・可」で出品していました。 トランプみたいに1枚1枚手にとってよむのですか。解体したゴミを売りつける悪質業者です。金返せ。」 スタティック初老人, 2013年11月10日 1(5が最高):「10日以上たっても商品が届かず,連絡しても返答さえありません。正直詐欺かと疑っています。」 かむい, 2013年11月7日
468 :
デフォルトの名無しさん :2013/12/15(日) 01:33:08.29
マイクロソフトのml.exe(VS2010付属)なのですが、 invokeなどがどんなコードを生成してるのか調べる方法はありますか? リストに出そうとしているのですが、.XALLなどでも表示されません。
>>468 デバッガで実行して逆アセンブル表示見れば?
アセンブラの解説サイトを読んでるんですけどレジスタの説明がいろいろ変わって混乱しています たとえばAXレジスタっていってるところもあればEAXレジスタっていってるところもああります。同じものと考えていいんでしょうか?
>>470 AXとEAXとALとAHとRAXの違いなんてぐぐればすぐわかるだろ
AXもEAXもレジスタというよりアキュムレータな
AXもEAXもレジスタ
AXだけが特別扱いになってるのは8086の名残りだけだから、 今となってはわざわざ特別扱いしてアキュームレータとか言う理由はないな。
bxもベースレジスタって名前なかったっけ んでcxがカウンタでdxがデータだっけ? axが特別っつーか、全部に役割持たせてたんだと思う、当初は
>>474 昔(Z80とか8086)はA系レジスタ向けの演算命令が他のB〜系レジスタよりも
多くてA系はアキュムレータだと説得力があった記憶があるけど、
今はどのレジスタも演算命令数は同じというか、差別されていないの?
IA-32やX64でも差別されてるよ
Cの関数の戻り値はEAX(キリっ
ABIに拠るし構造体をEAXで返すことはないと思う
アキュムレーターは索引レジスタに使えないというイメージがあったが、 32bitアドレッシングからは[eax+ecx+12]とか使えるしなぁ
建て増し構造というか奇形というかスッキリしなさがx86系の嫌いなとこだなあ。 MC68000なんか今触っても整然としてて美しいし。 x64で大幅に改善されたというか、やっと68000に追いつけたんだなぁ。
アドレスレジスタとデータレジスタが別なアーキテクチャは最初から糞
オフセットや相対ジャンプに16ビットの制限のある68000は糞
>>482 アキュームレータとベースレジスタが各一つしかないとか、個数の制限があればそうだね。
でも、十分な数が用意されてるから、実際には困るケースなんて皆無なんだ。
C言語との組み合わせを考えたら、データとアドレスがハードウェアレベルで区別されてるのは好ましいことだしね。
>>483 デコボコしたメモリモデルなんてものがあって8bit時代を引きずり続けたx86にはとてもかなわないよ。
>>484 データレジスタは8つでは足りないしアドレスレジスタは8つ(7つ)も要らん。要はバランスが悪い。
>>484 >C言語との組み合わせを考えたら、データとアドレスがハードウェアレベルで区別されてるのは好ましいことだしね。
具体的にメリットをご説明下さい。
>>484 >デコボコしたメモリモデルなんてものがあって8bit時代を引きずり続けたx86にはとてもかなわないよ。
8bit時代からのしがらみなんてなかった筈なのにセグメントでメモリ管理してた68kMacもそう変わらんよ。
>>484 >アキュームレータとベースレジスタが各一つしかないとか、個数の制限があればそうだね。
6800乙w
>MC68000なんか今触っても整然としてて美しいし。 当時としてはマシな部類だったが、今こんなこと言ってる奴はアフォ
RISC原理主義者がきた〜w
データ=アドレスのレジスタ1個でも気合でどうにかなるだろ
68000を否定するとRISC原理主義者って意味分からん。
どんなにアーキテクチャが優れていてもソフト資産がなければ糞 すぐ消える
組み込みならソフト資産なんて関係無いだろう
パソコン用なんかではその通りだが、特定用途向けとかなら事情が違う >ソフト資産がなければ糞
>>494 メーカー提供や他社製品のサンプルプログラムやライブラリ、RTOSとか、組み込み用途でも
あれば便利なソフト資産と呼べるものは存在するよ。
本来表に公開することのないような出来上がったソフトのことじゃなくて 開発するためのソフトの話か? そりゃある方が良いのは当たり前なことだが、そんなのわざわざ書くことじゃないだろ。
>そんなのわざわざ書くことじゃないだろ。 なぜ??
86系と68系の話の流れの
>>493 に対してだから、
ここでいうソフト資産とは、そのアーキテクチャ向けに
作られたソフトのことだろ。
開発のためのソフトじゃなく。
>>499 >ここでいうソフト資産とは、そのアーキテクチャ向けに
>作られたソフトのことだろ。
「メーカー提供や他社製品のサンプルプログラムやライブラリ、RTOSとか」ってのは
それから外れてないだろ。
>>497 > 開発するためのソフトの話か?
良く分かってないみたいだけどツールかなんかと勘違いしてね?
>>485 8個で足りないんだ?x86(IA-32)だと汎用レジスタは何個だったかな?
こたえ:0個
アキュームレータ、ベース、カウンタ、データ、スタックポインタ、スタックベース、ソースインデックス、デスティネーションインデックス、
8つの各用途に分かれていて「汎用」レジスタは存在しない。(命令によって割り当てられないレジスタが多く存在する)
x64は便利になったね。AMDはえらい。Intelは救いようのないアホ。
>>486 ポインタの理解が捗る。あれはアドレスレジスタそのものなんだ、ってね。
>>487 Macはクソそのものだよ。68000の特性を理解してないシステム構成だかんね。
>>488 8bit CPUと比較しなけりゃならないx86が恥ずかしいって、わかんないのかな。
>>502 >8bit CPUと比較しなけりゃならないx86が恥ずかしいって、わかんないのかな。
汎用レジスタがないのはMC68000もMC6800も同じじゃないの? x86? 汎用レジスタあるけど?
制限だらけのx86が恥ずかしげもなく汎用レジスタを名乗り(実際は命令によって割り当てられないor割り当てることを強要される事が多々ある) 制限がなく数も十分ありデータとアドレスの区別をしてなお整然とした68000のデータレジスタのありかたを罵倒する 滑稽だねえ おたくら今からAMDがもたらしてくれた汎用レジスタたっぷりなx86からIntelがいつまでも放置して汚らしかったx86に戻れんの?
>>504 MC6800は8bit CPUだから別にいいの。8bit CPUは可能な限りシンプルであるべきだから。
x86が汚らしいのは32bitアーキテクチャに不合理なもんを持込みすぎてるからであって
あれが8bitないしその建てましの16bitから出てこないのであれば全然なんも問題ないの
(なんか語り始めた・・・)
プログラマとしてはデータ/アドレスどちらでも使える汎用レジスタは嬉しいけど、 アドレス線に専念出来るアドレスレジスタとデータ(計算)に専念出来る データレジスタを分けるのは回路設計的には理にかなっているんじゃないの?
>>505 >AMDがもたらしてくれた汎用レジスタたっぷりなx86
AMD64でR8-R15使うときの命令コードってどんなんか知ってる?
48/ 33 C0 xor rax, rax 48/ 33 D2 xor rdx, rdx 4D/ 33 C0 xor r8, r8 4D/ 33 FF xor r15, r15 33 C0 xor eax, eax 33 D2 xor edx, edx 45/ 33 C0 xor r8d, r8d 45/ 33 FF xor r15d, r15d 66| 33 C0 xor ax, ax 66| 33 D2 xor dx, dx 66| 45/ 33 C0 xor r8w, r8w 66| 45/ 33 FF xor r15w, r15w 32 C0 xor al, al 32 D2 xor dl, dl 45/ 32 C0 xor r8b, r8b 45/ 32 FF xor r15b, r15b
はい、分かってないこと確定ですw
これは
>あれが8bitないしその建てましの16bitから出てこないのであれば全然なんも問題ないの ふむふむ
x64でVCではインラインアセンブラが廃止されたからまたこのスレ流行るかと思ったらそうでもないのな compiler intrinsicsがあるからデバドラでも作らない限りあまり用途はないのか?
SSE2のMOVSDとAVXのVMOVSDはニモニック以外なんか違いあるの?
AMDがx64作れるようになったのは文句言って来そうな MotorolaをIntelが潰してくれたからだろ
それもあるし、IA-64の失敗で迷走してた事もあるんじゃね 実際鯖はXeonで十分だしソフト資産も多いもんなあ
>>515 prefixがVEXになっただけで動作は一緒、YMM系の命令体系に合わせた。
F2/ 0F 10 05 00000020 R movsd xmm0, data_1
C5 FB 10 05 00000020 R vmovsd xmm0, data_1
SSEスレは敷居が高いんでこっちでいいかな ANDPSやORPSというのは何のためにあるのでしょう? 整数用のPANDやPORはわかるのですが 浮動小数点の論理演算というのがピンとこない
わからんけど論理回路組んでいったらそういう操作が余ったので命令にしたんじゃないの? それかfrexp()とかldexp()みたいな関数を作るためとか
SSE命令がが整数演算に対応したのはSSE2からだよ そのせいじゃないの?
比較命令とかでマスク作って2つのレジスタの任意要素を合成とか 符号ビットいじって絶対値や符号反転とか 整数、少数命令の混在はペナルティが入るから、頻度は少なくても無いと困る
なるほど、ありがとうございます。 確かに符号や比較命令のマスクに使えますね。 整数、浮動小数点の混在にペナルティが入るのは知りませんでした。
Core i (Nehalem) 以降のIntel CPUにある制約ね >ペナルティ 昔は命令長節約のために整数用にもandpsとかを使うなんてのも往々にして行われていたけれど 今のIntel CPUでは逆に遅くなるという寸法
VS2010のでコンパイルしてます。 セグメントレジスターを使うとINVOKEが変なコードをはくのですが仕様ですか? ; ml /c xxx.asm ; dumpbin /disasm xxx.obj .686 .model flat, stdcall foo proto x:word, y:dword, z:byte .code foo proc uses ebx esi edi, x:word, y:dword, z:byte ret foo endp start: invoke foo, fs, gs, al ret end
こりゃひどいな、バグかな 0000000D: 50 push eax 0000000E: 66 6A 00 push 0 00000011: 0F A8 push gs 00000013: 83 EC 02 sub esp,2 00000016: 0F A0 push fs 00000018: E8 E3 FF FF FF call _foo@12
はじめて読む486を買ってきたけど、 テストプログラムの環境ってWin3.1を想定してるのか? それともDOS? 実行環境が作れない時点で挫折しそう。。。
DOS VMware か何かを使って、FreeDOS が動く....かなぁ。
DOS
>>529 >>530 情報ありがとう。
DOSはVMWareでなんとかなりそうだけど、
appendixを読むと
borland c++3.1 & turbo assembler 3.2 か
vc++1.0 & masm6.0
で動作するみたいだけど、そんなの手にはいらんぞ。。。
タダで配ってる Visual C++ Express版に ml.exe 入ってるしなんとかなるべ
ならねーよ
アセンブラはLinkさえ手に入れば最近のml.exeでもいけるよ〜 DOS用にアセンブルする場合は ml /omf を忘れずに CはOpenWatcomで間に合うな
16bitのコンパイラならTurbo CやLSIC86試食版があるな。 LSIC86試食版はMASMとは書式が違うがアセンブラも入ってるし使い方次第では便利に使えるだろう。
A86だったかR86ね。 あれは、たとえばORG擬似命令が無くて、RS擬似命令で、(目的アドレス - 現在アドレス) の サイズのメモリを確保してやることでアドレスを調整するとか、あれこれ、知ってる人に 聞かないとわかんないテクが要るのが大変。 ValLinkとArrowAsmってのが2000年頃の定番だったが、今どうなってることやら。 NASMもNASMでMASMと違うからねぇ。
539 :
デフォルトの名無しさん :2014/02/24(月) 19:05:52.56
おすすめ書籍とかサイトなど御座いますか?
ないですね。
541 :
,,・´∀`・,,)っ-○○○ :2014/02/26(水) 00:38:53.88
先にCOMET-II/CASL-IIを勉強したらいいんじゃない? これは情報処理技術者のテキスト読んでるだけでたいていクリアできる 資格もとれて一石二鳥。 x86ならこれ1冊で。あとは個々の命令の仕様はIntelのサイトからPDF落とす。 ・はじめて読むPentium マシン語入門編
PCを機械語で使うのが目的なのか、他の何か特定のデバイスなのか、 対象はなんでもいいのか、で答えが違うな。
新約旧約どっちがいい?
545 :
デフォルトの名無しさん :2014/02/27(木) 06:10:52.32
コーランが良いアルニダ
NXビットとかってアセンブラでいじれるの?
アセンブラでいじれなきゃ他の言語でも無理ダナ
wrmsrで変更できるね リング0の特権命令だけど
549 :
デフォルトの名無しさん :2014/05/16(金) 01:20:05.03 ID:YZ6eU1pI
xor eax,eaxはeaxをゼロにする、といったx86アセンブリ技術のことが沢山 書かれたサイトを教えて下さい。
同値xorがゼロクリアになるのはテクではなくブール演算の初歩知識ではなかろうか 煽りでなく、むしろその手の基礎から始めてググり続けると良いのでは
551 :
デフォルトの名無しさん :2014/05/16(金) 02:06:29.00 ID:6rXJBimE
初心者に問題。 AL に入っている数値を [DI] に16進数2ケタで出力せよ。 ※ [DI+00] に上位桁、[DI+01] に下位桁
学校の宿題他人に訊くなよ…。
>>551 mov [DI], al
and [DI], 0x0F
shr al, 4
and al, 0x0F
mov [DI+01], al
>>551 久しぶりに触ったけど debug.exe って 64bit Windows だと用意されてないんだな
-a 0100
mov ax, cs
mov es, ax
mov di, 0080
mov al, 5a
inc di
mov [di], al
mov cl, 4
shr al, cl
dec di
mov [di], al
mov al, 0f
and [di], al
inc di
and [di], al
556 :
デフォルトの名無しさん :2014/05/20(火) 19:52:17.51 ID:EAxy/lYF
そこで Virtual PC ですよ。
アセンブラの学習するのにおすすめの参考書あります? cがちょっとできるレベルなんだけど
基本情報のアセンブラの対策本でも読めばいいんじゃね
CASL付きポケコンの説明書とかw ただポケコンがオワコンを通り越して生産終了w
「漢字コード」さんはポケコンの時代で時間が止まってる上にそういう自覚がない人でしょ。 だから話が通じない上に一人で逆上してる。 だから放置されてるのに...
デムパさん?
>>564 返答ありがとうごじます。危うく詰みそうになりました
データ転送命令なのですが MOV AL,BYTE PTR DS:[ECX+EDI] この意味がよくわかりません BYTE PTRがバイト宣言?なのはわかりますが、後ろ側のDS:[ECX+EDI]ってのがいまいちぱっとわかりません
この状況でds修飾は不要 。c言語風に書くとこんな感じ al = *(byte *)(ecx+edi);
DSは必要
ストリングス転送命令ではなさそうだけど?
570 :
566 :2014/06/05(木) 22:18:58.64 ID:/tv+CkMy
ECXにEDIを足したものをALにコピーって意味でいいんでしょうか? 後ろのDS:[]ってどういう意味があるんでしょうか?
機械語として見るとセグメントオーバーライドプレフィックスが付いている(ように見える)、 ということだろうけど、普通のメモリアクセスのセグメントはDSなので冗長(必要ない)。 ECX+EDI の結果をアドレスとして、そのアドレスに(バイト単位で)メモリアクセスしてALに コピー、という意味だけど、そもそも正しい場所を解析しようとしているのか怪しいな。
x64のRIP相対アドレッシングの場合はどうなんのかな
mov ax,[rip+4] 初心者の範疇ではないな
オペランドを1つしか取らないアセンブリってどの種類に分けられる? 初歩的かもしれないけどぐぐるときに困ってるから教えてほしい。
>>575 >オペランドを1つしか取らないアセンブリってどの種類に分けられる?
プロセッサに拠る
16ビットマイクロプロセッサです
1アドレス方式とか1オペランド方式、という分類はあるけど、それのこと?
>アセンブリ という用語をどういう意味で使ってるかによるかな。 個々のアセンブリ命令自体には特に分類はない。 そういう命令を主に使うCPUのアーキテクチャといえば、 1オペランド方式とかアキュムレータマシンとかそんな感じか?
PLCも仲間入り?
>>572 MASM64はラベルとかはrip相対になってるな
NASMはDEFAULT REL使ってる
Windowsの64bit EXEに再配置の仕組みは残ってるの? rip相対と混在できるかってことだけど
585 :
,,・´∀`・,,)っ-○○○ :2014/06/08(日) 12:25:05.93 ID:qgapksJl
mov命令だけだったっけ?disp64使えたのって SIBなしのdisp32が相対、SIBありが絶対
>>585 64bitのメモリオフセットはmovでもraxだけだね(0xA1, 0xA3)
即値なら他のレジスタも使えるけど
いまML64で遊んでるけど、混在できてるかんじですね。 LEA RAX, LABELxx MOV RAX, OFFSET LABELxx LEA使うとrup相対で下だと絶対になってるような。 64bitだとLEA使ったほうが良いの?
588 :
,,・´∀`・,,)っ-○○○ :2014/06/08(日) 17:38:33.43 ID:qgapksJl
別にRIP相対アドレスなら速くて絶対アドレスは遅いなんてことはない。 Haswellではmovは1サイクルあたり2命令のスループット。 leaは1命令。 Atomとかがターゲットなら割と命令長は気にしたほうがいいけど (命令フェッチが8byte/clkしかないから)
リロケーションのコストを気にしなきゃいかんのは よほどでかいDLLを2つ以上作るときくらい
590 :
デフォルトの名無しさん :2014/07/20(日) 04:01:19.48 ID:jA7npZ7N
英文字を入力して大文字なとき小文字に変換するアセンブラコードを教えて下さいm(_ _)m
なんでこのスレはAssembly言語をAssemblerって言うの?
>>590 C言語で
char c = 'H';
if ('A' <= c) {
if (c <= 'Z') {
c += ('a' - 'A');
}
}
をコンパイルして出てくるアセンブリコードを参考にしてみるとか
>>592 Assembler languageでググるとAssembly languageが大量に出てくるけど、
このスレはIBMかぶれなの?
てか組立言語(Assembly lavigne)を
組立機(Assembler)って言うの気持ち悪くね。
IPAとかもアセンブラ言語って呼んでた気がするからもう気にしないことにしてる
>>590 ; AL <-- 文字コード
(1) 大文字→小文字 、他の文字はそのまま。
cmp al,'A'
jb @f
cmp al,'Z'
ja @f
or al,('A' xor 'a') ; 他の文字が不定でいいならこの行だけでOK。
@@:
(2) 小文字→大文字 、他の文字はそのまま。
cmp al,'a'
jb @f
cmp al,'z'
ja @f
and al,not('A' xor 'a') ; 他の文字が不定でいいならこの行だけでOK。
@@:
598 :
590 :2014/07/24(木) 01:43:01.19 ID:hv8nubjy
宿題は自分でやろう # つか、大学でCASLII? 底辺だな…。
>>599 いやCASLを題材としてCPUの内部までやるところもあるよ、教科書もあったけれどもどっかにいってしまった‥もう一度手元に呼び戻したいものだ
> いやCASLを題材としてCPUの内部までやるところもあるよ、 CASL題材に内部までやったところで底辺には変わらん せめてOS動く程度のアーキテクチャでFPGAで実装くらいやってのもんだろw
そうか、最近なら FPGA っていうのはありだね
>大学の単位掛かってる 赤点取った後の、お情け課題提出に見える。
どちらにしても、石もアセンブラも後出しってのはなぁ… CASLなら初めからCASLと書いて欲しいかな
605 :
,,・´∀`・,,)っ-○○○ :2014/07/25(金) 08:54:19.70 ID:8TTeu6gK
入力するのがアルファベットって決まってるなら c |= 0x20; だけでいいけどな
丁度良い練習問題は Base64
下のプログラムをvs2013でリリースビルドした結果なんですが、剰余算の式の過程が訳分からないです リバーシングに興味あってアセンブラいじりだしたんですがわかる人いますか? ; 6 : (i % 3 == 0) ? ((i % 5 == 0) ? printf("%3d hoge\n",i) : printf("%3d hige\n",i)) : printf("%3d hoge\n",i); mov eax, -1431655765 ; aaaaaaabH mov ecx, esi mul esi push esi shr edx, 1 lea eax, DWORD PTR [edx+edx*2] sub ecx, eax jne SHORT $LN8@main mov eax, -858993459 ; cccccccdH mov ecx, esi mul esi shr edx, 2 lea eax, DWORD PTR [edx+edx*4] sub ecx, eax je SHORT $LN8@main push OFFSET ??_C@_09FLCGICCH@?$CF3d?5hige?6?$AA@ jmp SHORT $LN14@main
>>607 esi に i の値が入ってるとして、
mov eax, -1431655765 ; aaaaaaabH
mul esi
shr edx, 1
lea eax, DWORD PTR [edx+edx*2]
sub esi, eax
jne SHORT $LN8@main
で何やってるか考えてみれ。
普通に3や5で割るより早いのかのぉ?
『ハッカーのたのしみ』の10章かな
611 :
,,・´∀`・,,)っ-○○○ :2014/08/07(木) 20:45:20.65 ID:mDZmRo1A
MMX/SSE/AVXの整数演算では除算命令がないから逆数との積はしょっちゅう使うよ
ちなみに10進数で9の倍数の求め方ってどうやるか知ってる? 全部の桁の数字を、最後の1桁になるまで足して9になればそれが9の倍数。 9にならなければそれが剰余。 3の場合も、整数値を4進数とみなして同じことをやれば 掛け算すら使わずに3の剰余を求めることができる。 ビット演算+シフト+足し算だけ。 収束にやや時間はかかるけどいろいろ応用は利く。 (CASL/COMETって掛け算命令すらなかったよね)
>>612 >ちなみに10進数で9の倍数の求め方ってどうやるか知ってる?
>全部の桁の数字を、最後の1桁になるまで足して9になればそれが9の倍数。
BCDでもない限りは「10進数で」「全部の桁の数字」って言ってる時点で除算が発生してるってことだから
素直に9で割って余りがあるか判定したほうが良い。
できれば0は9の倍数の仲間に入れて欲しい
ちなみに2進数で1の倍数の求め方ってどうやるか知ってる? 全部の桁の数字を、最後の1桁になるまで足して1になればそれが1の倍数。 1にならなければそれが剰余。
>>613 別に9の倍数を求める必要はないよ。あくまで例として出しただけで。
3と5の剰余を求めたいんでしょ。3なら分割統治法で2ビット値を足し続ければいい。
整数除算はモダンなCPUでも何十サイクルもかかるからビット演算+加減算に
展開したほうが速い場合は多々ある。
> 素直に9で割って余りがあるか判定したほうが良い。
除算・剰余命令が使えないCPUで同じこといえるの?
9の倍数の判定は、7かけてから6ビットに縮約することでできる。
>>617 >3と5の剰余を求めたいんでしょ。3なら分割統治法で2ビット値を足し続ければいい。
>整数除算はモダンなCPUでも何十サイクルもかかるからビット演算+加減算に
>展開したほうが速い場合は多々ある。
ねぇよ馬鹿か
あるよ馬鹿か
ちなみに多倍長整数の因数分解とかでしょっちゅうやる
[ビット縮約を利用したNの倍数判定法] 1. メルセンヌ数2^n - 1を素因数分解してNを約数として持つ任意のnを決める。 2. Nの倍数判定をしたい数に、 (2^n - 1)/Nを掛ける。 3. n(またはその倍数)ビット単位で切り出し、加算する。 また、最後のnビットに収束するまでこれを繰り返す。 4. nビットに収束時、2^n - 1になっていればその数はNの倍数 (応用例として更に1足して2^n(あるいは1)への収束判定でもおk) ちなみに5は端折ったけど3倍して4ビットに縮約 7はそのまま3ビット、13の場合は315倍して12ビット RSAとか自前で実装したことあるなら思いつくだろこんなん
自分基準で物事を考える人って…
>>622 >RSAとか自前で実装したことあるなら思いつくだろこんなん
思い付かなかった。
何倍まで判定していた?
7の倍数が簡単そうなのは判るけど 13とか19とかはどうなのかな
メルセンヌ数自体の剰余なんてコストはタダみたいなもんだからいくらでも。 ワークメモリ消費量は計算が進むほど減っていくので非常に経済的。 しかしメルセンヌ数じゃない数までこの方法を使うのは必ずしも最適ではないと思う。 複数の方法を複合的に使うのがベストなのでは。
このスレで具体的なコードを示せてない時点でお察し
ここまで親切丁寧に教えてくれてるのにコードまで要求したら罰あたるよ つうか、具体性って>622で十分すぎるような……
スレ違いの投稿繰り返してるのに罰当たりってw
>>617 >除算・剰余命令が使えないCPUで同じこといえるの?
何言ってんのこのバカ
何度もいうがx86のモダンなCPUでもdivは使えても禁止的に遅いぞ。 クロック数計測してみればいい。 コンパイラの吐いたコードと比べてみ? 別に書いてもいいけどつまらんぞ? たとえば128bit整数のmod 3を求めるコード pxor xmm0, xmm0 movdqa xmm1, [src] psadbw xmm1, xmm0 ;; 11bit * 2 movdqa xmm2, xmm1 psrlq xmm2, xmm1, 8 paddd xmm1, xmm2 ;; 12bit movd eax, xmm1 mov edx, eax shr eax, 6 and edx, 63 add eax, edx ;; 7bit mov eax, [table+eax] ;; 計算済みLUTから引っ張ってくる
シフトと加算で剰余が求められる理由は理系学部レベルの代数学の知識があれば直感的にはわかるが アセンブラの構文を齧っただけの人間に説明するのは難しい。 使い方だけなら教えれば中学生でも使いこなせるレベルのテクニックだが。
剰余系、というか数論初歩(平方剰余の相互法則くらいまで)なんか数学科以外ではやらないと思うよ 教養課程の選択講座、くらいならわかるが
まともな大学の情報系•通信工学系ならやるよ。 m=16*a+bとおくと m mod 15 == (a+b) mod 15 難しい数式ほっといても簡単な理屈さえわかれば演算のショートカットは可能。
そうか?工学科でもやるよ。情報学科は知らん
m=16*a+bとおくと m mod 15 == (a+b) mod 15 中学生でも理解可能
>>635 >>637 うんうん、それ九去法の16進バージョンだね
m = 16*a + b
=(15 + 1)a + b
=15a + (a + b)
∴
m ≡ a + b (mod. 15)
ふつうこういう表記なんだけれどもね
mod 19のやり方いろいろ考えたけど被除数を32bit→18bitに削るくらいなら MMX/SSE使えば1命令だけでできるね
わしがなじんだアッセンブリー言語は Z80と8086や LDにmovやで どや!すごいやろ nopまであるさかいな
もうすごすぎてチンポたちっぱなしやで どや!羨ましいか よし、おまえ等もチンポ鍛えなや
気色悪い
mov, in, push, push, push, push, mov, out
645 :
デフォルトの名無しさん :2014/09/29(月) 00:56:30.26 ID:RKEDgsOw
GCCの吐いたコード見てアセンブラがわかった気になる本みたいだけど、あんま意味はないと思う。 実行環境が身近にないPowerPCとかその他アーキテクチャとか数がたくさんあっても無意味。 いまどきだったら VC++ Express のインラインアセンブラとか使うのがお手軽かつ効果も身近に感じれて いい気がするが。
はじめてi486 のかまち氏ご推薦だって
かわいそうに、集団いじめにあってるね
651 :
デフォルトの名無しさん :2014/09/29(月) 09:36:48.07 ID:NL6Qfls1
ツイッターで騒いでるヤツラ見てるとほんとニワカが多いなと実感する。 コンパイラの出力見てコードの評価するのなんて業務でコンパイラ言語使ってりゃ日常の行為だろうに。
↑ 2chも同じだということを自分で証明しているw
大手系の投稿記事よりはましなこと書いてたような
vs2013でyasmのソースコードデバッグできないのはどうしたらいいんだろう? 以前は-g cv8でできた気がしたけど、2012でもだめで、2008だったからかな
656 :
655 :2014/10/10(金) 00:03:18.91 ID:EfaI1XmC
vs2008を引っ張り出しきてインストールしたら、yasmのソースコードデバッグも可能で ちゃんとブレークポイントも設定できた 2013でもローカルシンボルのアドレスは読み込んでるんだけどなぁ
657 :
デフォルトの名無しさん :2014/10/10(金) 12:27:08.25 ID:553xVF6m
VCは64-bitインラインアセンブラできないんでしょ?
インラインアセンブラにこだわる理由もない
デバッグ情報が変わったのか、asmファイルでブレークポイントを設定しても 無効になっちゃうんだよ これは使いにくい masmなら大丈夫なんだけどね
660 :
デフォルトの名無しさん :2014/11/04(火) 17:11:16.93 ID:8a1BiHkJ
8086はデータ転送命令はmoveとexchangeしかないと思うのですが、 80486になるとload effective addressという命令が加わっています。 今までmove命令で書けていたものに、load effective address命令を加える必要はあるのでしょうか。 moveとload effective addressは別物でしょうか
8086の頃からあるわけだけど、利点としては ・普通のアドレッシング表現から、そのアドレスにアクセスするのでなく そのアドレスそのものが得られるので便利 ・P5以降とかだと、可能な限りどんな命令でも1クロックで実行できるよう 頑張ってるので、アドレス計算用にたくさん乗ってる加算器を有用に 使って、数個の数の足し算と4倍、みたいな計算が高速にできる とか。
663 :
デフォルトの名無しさん :2014/11/04(火) 17:59:26.43 ID:obX3t5pP
等価じゃないのに
664 :
デフォルトの名無しさん :2014/11/04(火) 18:34:18.92 ID:8a1BiHkJ
ありがとうございます。マニュアルを読むようにします
CASLUのRPUSH,RPOPがわからないのですが、メインルーチンでRPUSH、RPOPする理由を教えてください。 サブルーチン呼び出しでレジスタの値を退避し、その処理から抜けるときに復帰するのはわかるのですが、 メインルーチンが呼ばれてプログラムが始まるときにレジスタの値をスタックに退避し、抜けるときに復帰するのはスタートアップルーチンと何か関係があるのでしょうか
RETで終了するならそのプログラムもサブルーチンてことだから、レジスタを 退避/復帰する理由は他のサブルーチンと同じ。
オススメのアセンブラ入門サイト教えてくださいお願いします
あ、x86です
>>669 やはり最終的にはintelのサイトに行き着くんですね、ありがとうございます
<main+0> push rbp <main+1> mov rbp,rsp <main+4> mov eax,0x0 <main+9> mov DWORD PTR [rbp-0x4],0x0 <main+16> pop rbp <main+17> ret もとのプログラムはint main(){return 0;}をディスアセンブルしたものなのですが、 eaxにはリターン値0がロードされるのはわかるのですが、 mov DWORD PTR[rbp-0x4],0x0が何の処理なのかわかりません
使ってるコンパイラとコンパイルオプションは?
clangです コンパイルオプションは-gのみです
Cygwin64上のclang version 3.4.2 (tags/RELEASE_34/dot2-final)で hoge.c: int main() { return 0; } を $ clang -S hoge.c したら main: pushq %rbp movq %rsp, %rbp pushq %rax callq __main movl $0, -4(%rbp) xorl %eax, %eax addq $8, %rsp popq %rbp ret になったから結果が違うな。movl $0,-4(%rbp) はされるが。
$ clang -O2 -S hoge.c 最適化ありでコンパイルすると main: pushq %rbp movq %rsp, %rbp callq __main xorl %eax, %eax popq %rbp ret になったから movl $0,-4(%rbp) が意味ないことは確か。
ちなみにmain()でない関数なら最適化なしでも結果変わらんかった。 int hoge() { return 0; } $ clang -S hoge.c hoge: pushq %rbp movq %rsp, %rbp xorl %eax, %eax popq %rbp ret $ clang -O2 -S hoge.c hoge: pushq %rbp movq %rsp, %rbp xorl %eax, %eax popq %rbp ret $ clang -O2 -fomit-frame-pointer -S hoge.c hoge: xorl %eax, %eax ret
>>675 ありがとうございます
意味がないということがわかりました
678 :
片山博文MZ ◆T6xkBnTXz7B0 :2014/12/25(木) 22:21:21.82 ID:gEw73of1
IEEE754-2008の浮動小数点数をx86アセンブラで実装出来る人、此処に居ますか?
あげ
そんなの金次第
682 :
デフォルトの名無しさん :2014/12/27(土) 22:56:25.54 ID:u+dBZrZs
仮に、A1111,B1101 として精度4桁とすると、 和差は、指数部の大きい方へ合わせる 1111 00001101 → 0 指数の差が4桁以上あると、下は0と同じになる 仮に指数を、A50,B20とすると、 積は両指数の和 → 50 + 20 = 70 除は両指数の差 → 50 - 20 = 30
683 :
682 :2014/12/28(日) 10:12:28.37 ID:/YZxn3dB
これらをシフト・マスク演算などを使って、 Cで書いて、アセンブラで出力すれば? でも、ちゃんとステータスレジスタのフラグが立つかな?
aaa/daaとかの命令は結局どういう用途で存在しているんだ...? 調べてもよくわからん(多分それだけ使われないんだろうが)
687 :
デフォルトの名無しさん :2015/02/01(日) 19:33:48.31 ID:+Sv3xZC2
fpuが外付けな大昔 Z80のフローティングライッブラリをx86に移植して 三角関数もテーブルを使って近似値を求める方法で実装したことあるけど 今の時代、知的好奇心を満たす以外になにか意味ある? 三角関数の精度はFPUの付いたPCで計算した結果と摺り合わせて確認した
どっちが速かった?
689 :
デフォルトの名無しさん :2015/02/01(日) 20:53:10.36 ID:+Sv3xZC2
なにと比較するのかと言う意味なら比較対象がない 当時のN88BASIC(86)との比較ではインタープリタ対マシン語(アセンブラ)なので オーバーヘッドが少ない分自分で移植したライブラリの方が早かった(FPU無しの倍精度) 内部は80ビットフローティングの精度に対応する為に化数部を128ビット指数部を16ビットで計算後 80ビットフォーマットに丸めた x64って天国だよなx86と比較すると 紙に印刷したプログラム探せば出てくると思うw
>>687 0度〜45度をテーブル実装するの?それとももっと狭くていいの?
691 :
デフォルトの名無しさん :2015/02/02(月) 04:57:44.05 ID:j5MISSAc
>>690 忘れたけどたぶんそれくらい
もしかすると90度分かもしれなけど
テーブルの形式は計算精度が必要だったので
近似値に収束する形だったと思う(もう覚えていない)
三角関数の比率が必要な場面は今はFPUに依存できる
あらかじめ化数128指数16ビットの浮動小数点ライブラリで精度の高めな
近似値導出用テーブルを作ってそれを使ってtan-1(うろ覚え)を求めた後で三角関数を計算してた
利用目的で必要な計算精度も異なるので工夫しようぜ
三角関数の粗い比率だけなら64ビット整数で簡単に導出可能
とりあえず「仮数部」を単語登録した
693 :
デフォルトの名無しさん :2015/03/10(火) 01:21:00.65 ID:HHYC72Cw
PICでのC言語プログラム(上側)をアセンブラ言語(下側)へと書き直したのですが上手く動いてくれません
http://codepad.org/STGr8jeE http://codepad.org/p74NS78p プログラムの内容は8つのLEDのうち一つが光っており、
RB0のスイッチを押すたびに光る場所がひとつずつシフトしていくというものです
そして、このプログラム内でチャタリング対策を行っています。
Cの方は上手く動いてくれましたが、アセンブラの方は56行目でどうしてもスキップが有効になりCount_Loopから抜け出せない状況に陥ってしまいます
ステップオーバーで調べてみたところWregや物理スイッチの反応には問題なさそうだったので
Switch_Countが怪しいと睨んでいます(原因は分かりませんが)
どなたか原因の究明をお願いします