>>933 初歩のラジオで、8085 の記事はありましたっけ。
私は 1979/4 から購読していましたが、8080 か z80 しか記憶にありません。
939 :
_:2008/11/05(水) 00:26:20
>>916 おっしゃるとおりです。
「Cユーザのための実践アセンブラ」という本や、
「x86アセンブラ入門」といった本に、
その辺の説明がありました。
(それまで読んでいた「高級言語プログラマのためのアセンブラ入門」
という本には説明がありませんでした。)
>>917 ありがとうございます。
ちなみに「はじめて読むMASM」という本だと、
MYDT1 DW 1234H
MYDT2 DW OFFSET MYDT1 ; OFFSETをつける。
また、「Cユーザのための実践アセンブラ」
という本に以下の説明がありました。
DWの右側にラベルを指定すると、ラベルのオフセット値(2バイト)が設定される。
DDの右側にラベルを指定すると、ラベルのセグメント値+オフセット値(計4バイト)が設定される。
目からウロコでした。
http://xy.yu.to/ 始終荒れまくりの海外サーバ絵チャだ
一人の神プログラマーが強すぎてマクロ荒しが全く太刀打ちできてない。
荒しプログラマーは全員退散!!
誰か倒してくれwwwwww
941 :
デフォルトの名無しさん:2008/11/05(水) 16:02:10
アセンブラでたらい回し関数を作りたいんですが、だれか教えてくださる方いませんかね?
943 :
デフォルトの名無しさん:2008/11/05(水) 17:54:42
失礼しました
X86です
スタックをきちんと使って再帰可能なコードが書ければわけないと思うのだが。
GCCな環境ならとりあえず gcc -S してみてはどうか?
945 :
デフォルトの名無しさん:2008/11/05(水) 18:21:38
恥ずかしい話ですがプログラム言語自体初心者でして…C言語の基礎知識とアセンブラの授業を数回やったのみで
本やネットでいろいろ調べたのですがイマイチ理解しきれません。
ソースなどあれば参考にさせていただきたいのですが
mov eax,[x]
cmp [y],[z]
cmovl eax,[z]
cmp [x],[y]
cmpvl eax,[y]
ret
947 :
デフォルトの名無しさん:2008/11/05(水) 18:29:32
ありがとうございます、参考にさせていただきます
おいおい。
というか、どういう考えで、アセンブラでたらいを書けば理解できそうだと思えたんだか
激しく疑問なのだが。
情報弱者だなぁ
こんだけインタネッツが発達してんだから、ググレよカス
C言語でいう「数字を割った余りの求め」って
どうやるんですか?
C言語だとこうですが
100%10=0
12%10=2
x86ならdiv命令一発で商も余りも求まるYO
>>950 おまいのCコンパイラには-Sオプションはないのか?
ないのかもしれんが...
8085やZ80ならシフトと減算の組み合わせのループが要るな。
>>950 とりあえず、8085のc用libの除算ルーチンを貼っておくね。tabが詰まると思うけど。
00A9 DIVIHD ; HL商,DE余り <--- HL/DE:符号付き除算
00A9 7C mov a,h
00AA B7 ora a
00AB F5 push psw ; HLの符号判定をpush
00AC AA xra d
00AD F5 push psw ; HL/DEの符号判定をpush
00AE CDC400 call 00C4 ABSHL ; DEを符号無しに
00B1 EB xchg
00B2 CDC400 call 00C4 ABSHL ; HLを符号無しに
00B5 EB xchg
00B6 CDCF00 call 00CF DIVNHD ; 符号無し除算を実行
00B9 F1 pop psw
00BA FCC700 cm 00C7 NEGHL ; HL/DEが負なら商を負にする
00BD F1 pop psw
00BE EB xchg
00BF FCC700 cm 00C7 NEGHL ; HLが負なら余りを負にする
00C2 EB xchg ; HL=商、DE=余り
00C3 C9 ret
00C4 ABSHL:
00C4 7C mov a,h
00C5 B7 ora a
00C6 F0 rp
00C7 NEGHL:
00C7 2B dcx h
00C8 7D mov a,l
00C9 2F cma
00CA 6F mov l,a
00CB 7C mov a,h
00CC 2F cma
00CD 67 mov h,a
00CE C9 ret
00CF DIVNHD ; HL商,DE余り <--- HL/DE:符号無し除算
00CF 42 mov b,d
00D0 4B mov c,e ; BC <--- 除数
00D1 EB xchg ; DE <--- 被除数
00D2 210000 lxi h,0000 ; 商 <--- 0
00D5 3E10 mvi a,10h ; for(a=16;(a);a--) {
00D7 F5 push psw ; save ACC
00D8 29 dad h ; 商 <<=1;
00D9 AF xra a ; A,CY = 0;
00DA EB xchg
00DB 29 dad h ; 被除数<<=1;
00DC EB xchg
00DD 8D adc l
00DE 91 sub c
00DF 6F mov l,a
00E0 7C mov a,h
00E1 98 sbb b
00E2 67 mov h,a ; ここまでHLとBC比較
00E3 1C inr e
00E4 D2E900 jnc 00E9
00E7 09 dad b ; キャリーが出たら繰り下がり
00E8 1D dcr e
00E9 F1 pop psw
00EA 3D dcr a
00EB C2D700 jnz 00D7 ; }endfor;
00EE EB xchg
00EF C9 ret
コメントは俺が適当に考えて振ったんで、間違えてるかもしらん
C言語を扱っていて、この度インラインアセンブリを学ぼうと思っているのですが
まずはどのようなものから学べばよいですか?
Cで書いた簡単な関数 (引数に1を足して返すだけとか) をコンパイルしてアセンブラコードを吐かせ、
それを参考書片手に理解するところからってのはどうだろう
インラインアセンブリは、インライン独特の癖とかあるから、
独立した関数をアセンブラで書くほうから始めるほうがいいと思う。
いっそアセンブラを作る所から入ってみてはどうだろう?
淫乱アセンブラ
LSIC-80の、インライン関数定義。_asm_cがキーワードで、cに無いコードを出す時使う。
char _asm_c(char *);
#define di() _asm_c("\n\tDI\n") /* DI,EI ASMコード発生マクロ */
#define ei() _asm_c("\n\tEI\n")
/* 割込み関数用 PUSH/POP コード発生マクロ */
#define PUSHALL() _asm_c("\n\tPUSH PSW\n\tPUSH H\n\tPUSH D\n\tPUSH B\n")
#define POPALL() _asm_c("\n\tPOP B\n\tPOP D\n\tPOP H\n\tPOP PSW\n")
LSICのそれは只のマクロだからなぁ。改行し忘れるとなかなか楽しいことになるし。
つーか、80かよw
アセンブリ言語全くの初心者なのですが、wsprintfAというのは使い方によっては画像の表示とかメモリにロードするとかそういう画像関係のこともできるのですか?
初心者ですいませんm(_ _)m
wsprintfの仕様が知りたければMSDNで調べなさい。
966 :
デフォルトの名無しさん:2008/11/17(月) 00:12:00
xor 使ってeaxを0にするのと、mov使ってeaxを0にするのは
xor使ったほうが早いって言うけど、どうやって調べたのか教えて下さい
調べる云々じゃなくて、CPU設計したIntelがそういう風に言ってるの。
アウトオブオーダ機構を備えるCPUにおいて、同じレジスタに対するxorは
レジスタリネーミングのヒントとして特殊な意味を持つようにした。
具体的な効果として、xor eax, eaxを挟んだ前後のeaxを操作する命令間には
依存関係がなく並列実行可能であることが、パイプラインのスケジューラにヒントとして与えられる。
あと、0という値をロードするよりも命令長は短い。
同じ効果の命令なら命令長が短い方が命令キャッシュのヒット率が高くなり
全体のパフォーマンスはよくなる
何で難しいことを先に説明するんだよwww
すまん空気読めなかった
普通に、効果が大きい方の順
>>967 即値ロードも同じように並列実行可能だとおもうんだけど
それはヒントにしないのはなぜ?
ヒューリスティックを無限に増やせないってのは分かるんだが
即値って普通に現れるコードだよね。
即値ロードの場合、実際にその値をeaxに書き込む必要があるが
xor eax,eaxの場合、たとえば常に値ゼロの特殊レジスタ(俗にゼロレジスタという)
があるマイクロアーキテクチャでは、それをeaxにリネームするだけでいい。
Intelじゃないかもしれないのだが・・・。
973 :
デフォルトの名無しさん:2008/11/17(月) 23:43:33
団子はインテルのCPUには詳しいけどそれ以外知らないからなー
eaxなんて名前のレジスタがある非Intelプロセッサ・・・あるんか?
まあAMDでもVIAでもいいけどさ。OoO、レジスタリネーム機構を備えるx86はみんなそういうつくり。
ほんとにIntelじゃなければ
>>966が何か言うだろ
>>974 mipsとかalphaとかarmとかsparcとかは?
>>976 団子が煽る前に書いておくが、「eaxなんて名前のレジスタ」はその辺のCPUにはないと思うぞ。
最初がAreg、16bit必要になってAH,AL 合わせてAX、32bit必要になって左側をEA 合わせてEAX
歴史が詰まっているネーミングですね。
Accumlater
Data Register
Counter
Base Register
>>954 細かいところだけど、気付いたのでカキコ
00AE CDC400 call 00C4 ABSHL ; DEを符号無しに
00B1 EB xchg
00B2 CDC400 call 00C4 ABSHL ; HLを符号無しに
00B5 EB xchg
↓
00AE CDC400 call 00C4 ABSHL ; **HL**を符号無しに
00B1 EB xchg
00B2 CDC400 call 00C4 ABSHL ; **DE**を符号無しに
00B5 EB xchg
そう言えば、RAXとかのRって何ですか?
Re-ExtendedのR
もしくはRegisterのR(汎用レジスタのr8〜r15を新設したけど、他のレジスタの64ビット拡張にもRつけちゃえ)
Rokujuyon の R だろ?
XMMレジスタ多すぎる
4つで充分
985 :
954:2008/11/19(水) 17:53:02
XMMレジスタで128bit実数をサポートしてテンポラリリアルを一掃して欲しい。
だいたい、ポート間のデータ転送にCPUリソース使うなよな