アセンブラ 13
レス数が1000を超えています。これ以上書き込みはできません。
> アセンブラを勉強するのにいい、unix系の本がありますか?
「プログラミングの力を生み出す本」がわりと良かったのだが在庫切れ増刷未定のようだな。 >>3
こういう奴って
どのバージョンのカーネルのどのファイルのアセンブラソースさしてんだ
他の奴は答えなくていいから ちょっとお前答えてみろよ
で、そのソースファイルを読むとどういうアセンブラの知識がみに付くのか、言ってごらん
知ったかぶりでカーネルカーネルいってるなら 責任とって死ねよお前 >>4
3じゃないがLinux 0.01のboot.s head.sなんかはよんでおいたほうがいいな。
16bit real modeでのBIOS interrupt callの使い方から、32bit保護モードへの以降
gdtr idtr等のディスクリプターテーブル、ページング機構の準備とか。
アセンブリの知識もあるけどx86アーキテクチャの知識も身につく Z80をIntelニーモニックで解説している本で勉強すればいいんじゃね?
(俺はZilogで覚えちゃったからMOVとかわからんちん)
それ以上の奴をいきなり最初にやるのは敷居が高い気がする マシン語レベルで同じなんだから
あとはコンパイラがザイログ形式を受け付けるか受け付けないかの違いでしかない
シンプルで使いやすいザイログ形式がこれだけ干されてるのが不思議だ
8080ニーモニック Z80ニーモニック
MOV A,M LD A,(HL)
MOV M,A LD (HL),A
LDAX B LD A,(BC)
LDAX D LD A,(DE)
STAX B LD (BC),A
STAX D LD (DE),A
LDA 1234 LD A,(1234)
STA 1234 LD (1234),A
LD一つで済むだろ 俺はアセンブラ程度は自分で作ったけど、全部「A=B」のような代入形式にしたな。 そういえば昔、SMCなんとかという8bitパソコンがそんな感じだったな Zilogのはアセンブラがめんどくなるのでメモリ厳しい環境にやさしくない
0f 01 d8 vmrun
0f 01 d9 vmmcall
0f 01 da vmload
0f 01 db vmsave
0f 01 dc stgi
0f 01 dd clgi
0f 01 de skinit
0f 01 df invlpga
オペコード表には載ってないけどこんな命令あったのか >>15
あーそれでしたどうもです
インテルのマニュアルには当たり前だけど何も載ってないから知らなかった longモードで
40 01 00 rex add %eax,(%rax)
01 00 add %eax,(%rax)
この二つは実質的にどういう違いがあるんでしょうか? x86で、アセンブラのソースとしては区別がつかない、ことなったバイナリ機械語列が
あることについての疑問?
特に差はないよ。昔からある。 REXプリフィクスのWビットを作った目的は
新たに増えた8本のレジスタの下位32/16ビットをアクセスするためということでいいんでしょうか?
オペランドサイズを32bitにするだけならREXプリフィックスなしの命令を使えば済むはずですよね
66とREX.Wの二つのフラグがあって分かりにくいです C言語に挫折したので、アセンブラから修行しようと思います。
シンプルで学びやすく資料が多いものとなればZ80になりますでしょうか?
定番と呼べる解説書などあったら紹介してください。 CASL2(情報処理試験用の架空アセンブラ)という手もある
素人向けの資料に関してはかなり多い、試験対策の参考書が大量に出回ってるからな CASLはやめとけ。
今時バイトアドレッシングじゃないアーキテクチャで入門の勉強しても、
後でわかりにくくなるだけだ。 この人のやりたいのはC言語じゃね?
C言語の予備知識つける程度にならあれで充分な気もするが >>20
16bitマイコンが良いんじゃない?
秋月その他でキットが買えるルネサスのH8とか、TIのMSP430とか。
どちらも開発ツールは使いやすいとは言えないかもしれんが、
命令セット自体は割とシンプルで癖もなく使いやすい。 いまさら8086の勉強しても…
確実にセグメントで挫折するぞ
はじめて読む486のx86-64版みたいな本はないのかな。洋書でもいいんだけど。 >>28
勧めてくれてありがたいんだけど、違う種類の本みたい。 x86で処理実行するコアを指定する命令を教えてください >>31
ありがとう。
こういうコマンドはどうやって実装してるのかな?
インテルのx86の説明書読んだけど、見つけられなかった。 読むもの間違ってる。CPUが勝手にプロセスをスイッチするわけないだろ?
関連する命令は載ってるだろうがそれだけでは何も解決しない。
自分でマルチプロセッサ対応のSMPマルチタスキングスケジューラーを作るなら、BSDかlinuxのカーネルのソースでも読めばいい。
OSがあるならAPI呼べ。 x86にどんな命令があるかって
インテルから説明書とか仕様書のコピーとかそんな感じのもの買わないと分からない? >>33
ありがとう。
ちょっと興味があっただけなんで、時間があれば読みます。
x86のアセンブラでプログラミングをしたいのですが、
アセンブラ用のエディタとかIDEとかって無いのですか? emu8086っての使ってた
15日ぐらいの試用でデバッガは使えなくなるけど自己解決しました >>39
使ってみましたが、入力画面がバグりますね…。
ググったらFASMのfreshっていうのがけっこう高機能そうなのでこれ使ってみます。
64bit非対応なのが難ですが。
>>40
そうそう、選んだフォントによってはおかしくなる
自分に合ったのを使った方がいいね >>37
Visual C++ 2010 Express でいいじゃん。
http://www.microsoft.com/japan/msdn/vstudio/express/
ASM も C/C++ も使えるし、VB や C# に浮気すんのもラクチンだし、マジオススメ。 >>37
インラインアセンブラがオススメやで?
逆アセンブルウィンドウとかも勉強になるしな
だから普通のVisual Studioちゃん >>43
WinASM以外と凄いな。
あんまりコード書かないで簡単なダイアログアプリ作れちゃったよ VirtualPCとかVMwareとかでアセンブルでオリジナルOSとか作れちゃったりする? この程度のことを自力解決できない様では
何使っても結果は同じだろう
gasで最近.intel_syntax使い始めたんだけど、
いままで
movw $Label, %SI
って書いてたのを
mov SI, Label
にすると即値代入じゃなくなってしまう。
どうすればいいんだろう。 masm系だとoffset Labelだけど
gasだとintel_syntaxでも$Labelじゃなかったっけ?
自信ないけど。 そうだ
movじゃなくてleaを使えば良いかも。
本質的な解決じゃないけど。 >>50
gasなんて所詮はコンパイラの出力をアセンブルする程度のツールなんだから、縁を切るチャンスと思うほうが吉。 初歩的な質問ですまないけど一つ教えて。
call label_name@xxx
(xxxは整数値)の@xxxは何を意味するのでしょうか?
見かけたのは↓の"call _GetStdHandle@4"などの表記です。
ttp://ja.wikibooks.org/wiki/X86%E3%82%A2%E3%82%BB%E3%83%B3%E3%83%96%E3%83%A9/GAS%E3%81%A7%E3%81%AE%E6%96%87%E6%B3%95 呼び出し規約が __stdcall(WINAPI) の場合の、引数の合計サイズですよ。 >>57
thx.
そういう情報ってどこか集まっているサイトか資料(本とか)あるんですか?
ここで質問する前に結構探したつもりなんですが…。 >>58
検索するとしたら "アセンブラ 呼び出し規約" かなあ。
例えば↓とか。
ttp://ray.sakura.ne.jp/asm/9.html BIOSでhello worldを表示するためのプログラムを作ってみたんですが、何も表示されません。
「mov (%bx), %al」コレがマズイ気がするのですが、表示する方法を教えてもらえませんか?
.code16
.text
_start:
.global _start
mov $msg, %dx
jmp loop1
loop:
mov $0x00, %bh
mov $0x07, %bl
mov $0x0e, %ah
int $0x10
loop1:
mov %dx, %bx
mov (%bx), %al
inc %dx
cmp $0, %al
jne loop
msg:
.ascii "Hello World\r\n\0"
end:
.org 0x200-2
.word 0xaa55
>>60
動作環境ぐらい書いとけ(つーかその辺りから分かってないだろ?) >>61
vmwareです。
正直あまりわかってないけど、昔は同じようなプログラムを作った。 QEMUは「qemu -fda as_bios3.com」で起動します。 知ってたらでいいんで、文字列の目の前でcallする以外のスマートな方法ありますか?
FreeBSDのブートプログラム見たらそんなのないけど、アセンブラの知識不足でよくわかりません。 >アセンブラの知識不足
パソコンのBIOSについての知識不足? 一番下以外はvmwareで試しました。(おかしな表示になりました)。
Windowsじゃなくて、LinuxなんでDOS窓では動かしてません。
一番下のは明日やります。
アドバイスくれた人ありがとう。
釈然としませんが、とりあえずcallを使うと上手く行くらしいことだけわかりました。 dosemuインストールしましたが、使い方を調べてみます。 >>73
それはわかったのですが、なぜか文字化けor表示されないのです。
>>63のサイトでは、callを使えとあるんですが、いまいち理由がわからず困っています。
コンパイルオプションの問題でした。
スレを汚してすみません。 callに呼応しているのはpop %bp。
IA32ではipを直接movしたりip相対でアドレシングすることができないから
その代わり。 >>76
遅くなりましたがありがとうございます。
割り込みに関するIDTRを調べているのですが、1組6byteのテーブルの内容がよくわかりません。
持っている本には、
1byte:ループカウンタ
1byte:P:DPL:タイプ
2byte:制御ワード
2byte:ハンドラへのジャンプテーブル
とあるのですが、ここでループカウンタと制御ワードの意味がわかる方がいれば教えてください。 BIOSでHelloWorldを表示ってどういう意味だ? NASMで「mov byte [es:edi], al」をgasで書き換えるとどうなるでしょうか? こういうのってバイナリで書いてnmの逆汗オプションで調べられないかな int main(void)
{
__asm__("nop\n\tnop\n\tnop\n\tnop\n\tnop");
}
てのをコンパイルして、nopの所を適当なコードに書き換えてしまえばいいんでないかい
nasm hoge.asm -o hoge.img
で良いじゃん。中身が単一の命令なら、それだけ吐き出されるだろ? どんなアセンブラがお望みだい
x86系かい
armかい
役にたってもたたなくても、ともに300ルピーだよ
いっひっひ >>90
MicrosoftのMACRO-80はインテルニモニックにもザイログニモニックにも対応してるので超オススメ!
マクロも強力だし、最新版は6502にも対応してるヨ! ★修学旅行、韓国から国内に変更…宮崎・日南高
日本と韓国の関係悪化を受けて、宮崎県立日南高は2年生27人が12月に予定していた韓国への
修学旅行を国内に変更した。
日南高によると、同校の修学旅行は韓国と国内の二つから選べることになっており、今年は2年生
170人のうち、143人が東京や群馬などの国内を選択。27人が同校の姉妹校・冠陽高があるソウル
などへの旅行を希望していた。
竹島問題などを巡って、日韓関係が悪化していることから、韓国への修学旅行について慎重に検討した
結果、「韓国の情勢が不透明で、生徒の安全などを考慮した」として、行き先を国内に一本化したという。
県内の別の高校も来年3月に計画している韓国への修学旅行について、変更を検討しているという。
http://www.yomiuri.co.jp/kyoiku/news/20121006-OYT8T00695.htm 尖閣問題で台湾だっていつ敵になるかわからんのに平和ボケもいいところだな gasもnasmも大して変わらんよ
アセンブラ独自の部分は MOVNTDQなどでIA-32アーキテクチャ解説書に書かれている「非テンポラルなヒントを使用して、
メモリへの書き込み時にデータがキャッシュしないように防ぎ…」の「非テンポラルなヒント」とは何を指しているんでしょうか?
何かトンチンカンな思い違いで、基本的な事が分からなくなってる気もするのですが…。 move対象のデータがnon-temporalである(つまり、次々に別のデータを
処理していくストリーミング型である。だからキャッシュに入れても
意味ないのでやめてね)というヒント、じゃないのかな? PGM STRT
LD GR5,DD
LAD GR1,3
LD GR6,DD,GR1
ADDA GR5,GR6
ST GR5,EE
RET
DD DC 5,6,7,8
EE DS 1
END
レジスタGR5の値(10進数)
レジスタGR1の値(10進数)
レジスタGR6の値(10進数
レジスタGR5の値(10進数)
を教えてください。
順番に読めよ・・・
単純にデータを読んで足して入れてるだけだ。まず自分の考えを書いてみな
それで間違ってるようなら、どこが、どのようにを教える気にもなる >>107
caslか。。。
LD命令とLAD命令の違い、指標レジスタの使い方とか大丈夫なのかな。
テキストある? レジスタGR5の値(10進数) 5
レジスタGR1の値(10進数) 3
レジスタGR6の値(10進数) 8
レジスタGR5の値(10進数) 13 じゃね? なんで
>レジスタGR5の値(10進数)
が二つあるんだ? だったらせめて行番号かアドレス書いて、どの時点でのGRnの値とかって聞く罠 movzbq (%rax,%rcx,8),%rax
()の中を、どう読んだらいいのか、わからない、教えてちょ
gdbの逆汗ですです >>116
>movzbq (%rax,%rcx,8),%rax
>()の中を、どう読んだらいいのか、わからない、教えてちょ
「パーセントアールエーエックスカンマパーセントアールシーエックスカンマはち」 バイナリコードの方から解析したよ、読み方ありがとう どもども
謎なx86な環境の謎なjitを動かそうとしてハマりまくってたけど、なんとか動いたよ >>116さんので気になって探してみたけど、gdbの使い方はたくさん出てくるのに
逆アセンブラ出力の記法の説明は特に見当たらなかった。
なので、デフォルトの設定でgasと同じかなと思ったんだけど。。。 x86の16bit汗はよくやってったんだけど
32bit以降は久しぶりで、まさか、汗の解釈が出来なくてハマったという
オチでした(中で何やってるかわからず、当てずっぽうだから余計)
C系の逆汗はたまに覗くぐらいだったからね
セグホしまくりのコケまくりでなかなか先に進めなかった
ここの解説に助けられました
ttp://www.mztn.org/lxasm64/amd05.html どなたか知者にお願いします、C言語系列(派生言語、類似言語)以外で
インラインアセンブラを表記できる高級言語には何があるか教えてくれませんか? 「インラインアセンブラ」「言語」でぐぐるだけでもいくつか見つかるんだが。。。 ネイティブバイナリ生成できる言語なら何かしらの手段が用意されとると思うが
昔のTurbo Pascalみたいにバイナリ直で書けなんてこともあったりして CでもANSI以前にはasmが予約語だったってだけでインラインアセンブラの実装は
処理系依存だし、その他の言語でも処理系に拠るのは同様だろう。 >>128
その程度の努力もしない相談者ということでしょう。相手しないに限る。 そんなこと言うとそこで話が終わっちゃうけど、
・実はこんな言語でインラインアセンブラにはまってるところ
・このあたりが最近ホットだよ
などと答えれば話が盛り上がるし、思わぬ発見にも出会えようかと言うもの インラインアセンブラなんてほぼ横着の方法だしなあ、盛り上がるような話題ではないと思う。 的外れな回答するなら無視しろよwww
>>131
ググル程度では使えるかは>>129が言っている話となんの違いもない。
言語仕様として実装しているかとか考えられないなら黙っていろよww >>135
>言語仕様として実装しているかとか考えられないなら黙っていろよww
聞きたい内容なら相談者が明記すべきでしょ >>135
君みたいなのが黙ってればいいんだよ
分からないから出て来るんだろうけどさw >>126
>どなたか知者にお願いします、C言語系列(派生言語、類似言語)以外で
>
>インラインアセンブラを表記できる高級言語には何があるか教えてくれませんか?
学校の宿題? インラインアセンブラが必要なことがある高級言語を探すほうが難しいような、C系以外で ネイティブコード吐く手続き型言語ならインラインアセンブラの機能ぐらいあっても不思議はないだろ。 中間コードをネイティブコードにして実行するのが今時の流行りじゃあ >>140
んで高級言語に欲しい機能はCで書くものだしなあ コンソールいじるのにwinapi叩かないといけないなんてwindowsさんひどい インラインアセンブラと聞いただけでこれほど荒れるって、
どんだけキチガイがたくさんいるの?w こんなんで荒れてるように見えるとは、2ch見たことない人? 2chっつーか、ム板だけでここより荒れてるスレくらいいくつも見つかる 下を見てもきりがない2ちゃんねるで何の自慢にもならん >>33
それをOSのスケジューラやVMが管理しているとしても
最終的にはCPUに何らかの命令が下って切り替わるわけだろ せいぜい単語レベルで置き換えるトランスレータかますくらいだろ ; こんな感じか?
スタート:
コピー dl,データ1
加算 dl,データ2
加算 dl,'0'
;日本語にすると、ド偉く開発効率が下がりそうなのはなぜ?
;母国語でわかりやすいはずなのに。 >>159
IMEが間に入るからじゃね?
確定させるまでに文字の誤爆もあったりとか。 アセンブラなら横にクソ長くなることはないから
IDEが領域分けて日本語名を表示してくれるだけでいい気がする >アセンブラなら横にクソ長くなることはないから
1行にマルチステートメントで複数命令を記述できるアセンブラもあるし、
同時に動作する複数のバスの動作を1行に記述するのが前提のもあるし、色々だよ。 プリプロセッサマクロでレジスタにCみたいな変数名をつけたり
ループや条件分岐の構造をわかりやすくする為にインデント使う
こともあるから、長さに関してはそこまで変わらない。
AVX以降多いよね、Cで書かせる気ねーだろってくらい長い名前の
組み込み関数とか まずカナ入力の練習からだな
ていうか、命令はひらがな中心で行くべき
特に使用頻度の高そうなものは 自分でNASMなりYASMなりのプリプロセッサ書いてみりゃいいんじゃねーの
grepとか使えば余裕だろ
AVX-512のマスクやSAE指定で使う{}はRubyの構文ならブロック扱いになるから
普通に使えるよなと思って「Xbyak on Rails(仮)」を書き始めて3時間で放り投げ
よく考えたらこんなもんいらねー >>166
> 自分でNASMなりYASMなりのプリプロセッサ書いてみりゃいいんじゃねーの
> grepとか使えば余裕だろ
grep? HaswellのTSX命令にバグありでマイクロコードで無効にされるってマジかよ
しかもBroadwellの初期ステッピングまで響くかもしれないなんて言われてる Errata prompts Intel to disable TSX in Haswell, early Broadwell CPUs
ttp://techreport.com/news/26911/errata-prompts-intel-to-disable-tsx-in-haswell-early-broadwell-cpus
目玉の新機能がバグw
自動車だったらリコールだな >>157
名前(オペランド)だけでいい、オペレータまで日本語化する必要はない MOV EAX,1234+5678 ←オペランド
↑ ↑ ↑
ニ オ オ
モ ペ ペ
ニ ラ レ
ッ ン |
ク ド タ おいおい、"EAX" も "1234+5678" もオペランドだろう、オペレータはまずかったなオペコードというべきだったか‥ >>175
0: a1 00 1b 00 00 MOV EAX,1234+5678 ←オペランド
↑ ↑ ↑ ↑ ↑
オ オ ニ オ オ
フ ペ モ ペ ペ
セ コ ニ ラ レ
ッ | ッ ン |
ト ド ク ド タ >>177
その"+"はアセンブラがアセンブル時に演算するものであり、ターゲットのCPUが演算するわけではないのだから、オペレータとはいわないね‥
"1234+5678" 全体で一つのオペランドだ >>179
http://www.sourceware.org/binutils/docs-2.10/as_6.html
> 6.2.2 Operators
> Operators are arithmetic functions, like + or %. Prefix operators are followed by an argument. >>180
だからそれはアセンブラ層で扱うオペレータだとなんどいったら‥ レジスタも実際はオペコードに含まれてるケースも多いので
EAX がオペランドになってるのは違和感がある >>182
> 157 デフォルトの名無しさん:2014/04/24(木) 20:23:29.80 ID:6eU9esML
> 日本語アセンブラは、誰も作らないね。
> 173 デフォルトの名無しさん [sage]:2014/10/24(金) 23:21:06.42 ID:60xLGkt4
> >>157
> 名前(オペランド)だけでいい、オペレータまで日本語化する必要はない
という話の流れだからアセンブラの話で合ってるよ。 >>183
> レジスタも実際はオペコードに含まれてるケースも多いので
ちょっと何言ってんのか分からんからネットで確認できる実例挙げてよ。 ああ、x86のオペランドがAX固定の命令みたいな奴のことを指してるのかな。
そのへんは命令のネーミングの問題という感じもあって、(仮に名づけるなら)
ADDAXとかMOVAXみたいな名前の別の命令にしちゃったりすることもあるので、
まぁあまり厳密に定義はできないから、議論する意味はあまりないね。 例えばMC6800のLDAAとかADDBみたいなののこと?
あれはニモニックの一部にレジスタ名が含まれてるだけでオペランドとは違うよ。 x86で、アセンブリ言語では「ADD AX, 1」の「ADD」はオペコード(インストラクション、命令)、
AXと1はオペランド(引数)というように明確に分離できる。
機械語では 0x05 0x0001 となるが、ここでADDを意味する部分とAXを意味する部分は
0x05に一緒に入ってしまっていて分離できない(正確には5のLSBでALとAXのどちらかを
選択しているけど)。
結論としては、オペランド(の1部)がハードコードされた命令という奴があるので、
オペコードとオペランドの区切りはかならずしも明確ではない、ということになる。 >>191
極少数の命令だけだけどオペコードのバイトにregフィールドがある命令があるな
通常はオペランドはr/mバイトにあってオペコードとオペランドは完全に分離できるけど アセンブラとマシン語が混ざって元々意味の無い話がやっぱり意味の無い話で回ってるね
更に遡ってくと元は日本語アセンブラか。。。本当バカ臭い 基本情報技術者試験でアセンブラ勉強しはじめた。
午後の選択問題で、アセンブラが簡単だと聞いたが…。
いまのところわけわからん。 https://www.jitec.ipa.go.jp/1_13download/shiken_yougo_ver2_2.pdf
>3.プログラム言語
>@ 基本情報技術者試験において,ソフトウェア開発分野に関する試験問題に出題するプログラム
>言語は,C,COBOL,Java,アセンブラ言語(CASLU)の 4 言語とする
CASLなんて役に立たないもの勉強なんてしないで普段使ってるものか将来使いそうなの勉強したほう
いいんじゃない
# FORTRANて今ないんだなー 二つやらないといけないそうだからな‥C と Java か‥ センター試験とか簡単なことを難しそうに見せて
というか問題(の意図)を判り難くして回り道させて
出題者側が時間稼ぎしてる感じしかしない gccの-Sオプションでアセンブラファイルを作成したら日本語文字列が
.ascii "%d\202\252\223\374\227\315\202\263\202\352\202\334\202\265\202\275\12\0"
みたいになったんですがこれは何でしょうか
ascii 日本語で検索しても出て来ません >>202
「が入力されました」をShift_JISでエンコードして各バイトがASCII範囲外なので8進表記したもの mov eax, cr0
or eax, 1
mov cr0, eax マイコンで初めてアセンブラ書いてるけどスパゲッティおいしい @
add dword ptr[i], 1
と
A
mov eax, dword ptr[i]
add eax, 1
mov dword ptr[i], eax
ってどう違いますか?
i++を逆アセするとAになりますが
インアセンブラで@と書いても一見同じようですが
3倍の速度ってわけではないですよね コンパイラが2のようなコードを吐くのは、そっちの方がトータルで速いから
デコーダだの複雑命令だの
並列実行だのoooだの
パイプラインだのマイクロ命令だの
そういうのが理由
端的に言えば、1の命令は複雑すぎるので
分解して複数命令にして実行したり使えるデコーダが限られたり、制限が多い
2は、比較的CPUの内部命令に近いので、他の命令と同時並列に実行したり出来る >>209
多分だけど
レイテンシは同じだが前者はポート掴みっぱなしで他の命令を動かせない
後者は分けるから他の命令を動かしやすい
>>211
多分、Pentium 4時代はaddの方がuOPとスループットが有利だったから レイテンシがどうのとかそういうレベルの話じゃなくて
単純にVC++のデバッグビルドだからじゃねーの CPUをFPGAで実装してみたらわかると思うけど
一つの命令の中でメモリをリードした後ライトする命令をサポートするISAと
そういう命令は持たないで一つの命令の中ではメモリはリードするだけかライトするだけのISAでは実装の複雑度はかなり違うよ もちろん排他制御のためにどんなISAでもtest and set的な命令は持つ必要があるけど
主眼は使用頻度が高い演算とか操作の話だからね 確かにmemory to memoryのオペレーションはRISCだと命令長が合わないから無理だよね。
無理やりやるならレジスタAのアドレスをロードしてincしてストアするとかになるから命令が複雑すぎるかもな。 memory mapped register を持った RISC もあったような レジスタに書くとメモリに転送されんの?知らんかった。
命令のサイクルとかむちゃくちゃになりそうだな。CPUのコアじゃなくて、SOCとかで勝手に拡張した擬似レジスタなのかな。 6502はそういうレジスタないよ。アドレッシングが癖があるけど。
ちょうど今FPGAで6502組んでるとこなんだよね。 サンクス!
昔のCPU好きなんだよね。調べて見よっと いろいろいい加減な型番出てるが
TIのTMS9900調べとけ なんかいっぱい出てきたな。。。
見てみるよ。あざす 話の流れをぶった切って申し訳ないんだが、
armv8のインラインアセンブラとかの質問をここでしてもいい? レスの日付を見てなかった(^^;
上の質問は取り消します、さいならw 新しく出てたプログラム本を何気なく手にとって読んでみたらアセンブリ言語中心の内容だったな
タイトル忘れた 命令長が違うだけで32ビットのニーモニックとあんま変わらんよ。
入門書読みたけりゃ32ビットので勉強して、リファレンスマニュアルを探せばいいと思う。
64ビットの固有の命令とかコントロールレジスタの事なんかは入門書では書く必用ないしね。 プログラムの不思議を解く―実力派プログラマのための教養としてのアセンブラ入門 ク ク || プ //
ス ク ス | | │ //
/ ス | | ッ // ク ク ||. プ //
/ // ス ク ス _ | | │ //
/ ̄ ̄\ / ス ─ | | ッ //
/ _ノ .\ / //
| ( >)(<) ___
. | ⌒(__人__) ./ ⌒ ⌒\
| ` Y⌒l / (>) (<)\
. | . 人__ ヽ / ::::::⌒(__人__)⌒ \
ヽ }| | | ` Y⌒ l__ |
ヽ ノ、| | \ 人_ ヽ /
. /^l / / ,─l ヽ \ 「ほら吹き男爵の本を5冊調べました(中略)
ブーツの紐を引っ張って湖の底から脱出する
という話は、書かれていません(中略)
ブートストラップ(bootstrap)とは直訳すれば、ブーツのひもである。しかし、
独力でやるという派生した意味を持ち、そこから、
コンピュータが電源投入時に自動的にOSを読み込む方式を指したり、
コンパイラが自分自身を記述したりすることを指したり(中略)
bootstrapを靴紐とした誤訳である。
Bootstrapとはブーツを履くときにブーツを引っ張る上げるためのつまみ革
ブートストラップを引っ張って湖の底から脱出する
というエピソードは書かれていない。しかし類似の話として
馬ごと沼に落ちた Munchausen が手で自分の髪の毛をつかんで自分自身と馬とを引っ張り上げて沼から脱出する
というエピソ−ドが書かれている(挿絵つき)。岩波文庫版」
http://suzuki-tokuhisa.com/ushigome/hinoue.html
2000/12/24(Sun) FreeBSDi386
バックスペースの挙動の再現?方法が知りたいのですが
ioctlにてBSが無効化?している状態においてどのようにすればいいのでしょうか?
現状の挙動は
BSだけだとカーソル左移動のみ
エスケープシーケンスの"[[P"併用では似た挙動はするがコンソール左端を認識しない為 左端以降右を削除してしまう 243
無効化(terminal自体の設定変更 Cでいう?termiosで変更)してるのでそれでは駄目です 因みにその場合の(243の)挙動は
カーソル移動と削除(スペースの入力と表示)のみ行われてカーソル右はそのままとなります
ABCD
↓
A D
のようにカーソル右の文字が左スクロールしません 247
意味不明
248
意味不明
次の方どうぞ〜 >>196
アセンブラでアルゴリズム書くノウハウは身に付くよ。
64bitアセンブラでHello Worldしか書けないんじゃ悲し過ぎる。
レジスタ名やニーモニックが違うだけで方言みたいなものだから応用は効く。
CASLは命令数少ないから、擬似命令含めても覚える文法?は一番少ない。
OS作りたいとかなら必須だしね。
そこまで大掛かりじゃなくても、電子工作ではアセンブラで書いた方がマイコン使いこなしてるぜ!って感覚が好き。
(むしろBIOSすらないから、直接VRAM書き込みとかはこっちのが主流) >>252
CASLってoutputがわかりにくいんだよね
VRAMとか定義されてたっけ >>253
VRAMは実際のマイコンでも定義されてない。
CPUは書き込んだ先がただのメモリかVRAMか感知しない。
人間が実装し、CPUが認識するメモリのどこからVRAMとして扱うか決める。
OUTPUTが分かりにくいってのは実際にPICマイコンとかで電子工作してプログラム書き込んだことがないからだと思う。
(むしろOUTマクロで文字列表示出来るだけマシだと思う)
だってPCと違ってマイコンチップにはディスプレイとか無い。
CPUはメモリやポートに値や信号を出す出さない。読む書く、読まない書かない。
それしか外部に出来ない。
何をどう表示するか、どう動くかは実装と取り決め次第。
PCは複雑過ぎる(し、ある程度入出力の手段は決まってる)から、OUTマクロみたいなのをBIOSや各OSのシステムコールが提供してるに過ぎない。 >>252
>>254
アセンブラ勉強したい
おすすめはCASL?
ちな仕事ではCとJava Cが使えるなら、
普通にPCのx86のコードの中から、
単純なループをアセンブラ化することからはじめれば >>257
今、アセンブラやるならx86_64かARM64だな
x86_64ならLinux上でやるとDOSの頃のようなシステムコールを直接アセンブラから呼ぶようなプログラミングができる
C言語のコンパイルでアセンブラ出力をして関数の中身を書き換えてみるとかでもいい
gccなら-Sオプションを付けることでアセンブラ出力ができる
こんな感じでアセンブラ出力して、コンパイルできる
(最適化オプションを指定しないとかなり冗長なコードを出力するので適当に-O1、-O2、-O3などを使った方がいい)
gcc -S -o hogehoge.s hogehoge.c
as -a=hogehoge.lst -o hogehoge.o hogehoge.s
gcc -o hogehoge hogehoge.o
最適化オプションを使う場合
gcc -S -O2 -o hogehoge.s hogehoge.c
as -a=hogehoge.lst -o hogehoge.o hogehoge.s
gcc -o hogehoge hogehoge.o
ARM64ならPINE64買って同じようにLinuxやるか、
AndroidSDK入れてAndroidアプリの作成でJavaからJNIでC/C++を呼び出して
そのC/C++の中でインラインアセンブル組むといい
Linux で64bitアセンブリプログラミング
http://www.mztn.org/lxasm64/amd00.html
Linux で Arm64 アセンブリプログラミング
http://www.mztn.org/dragon/arm6400idx.html あと、ARM64のアセンブラを遅くてもいいからx86_64のUbuntuでやりたい場合
QEMUをインストールし、ARM64のクロスコンパイラを入れることで
ARM64のクロス開発とエミュレーション環境が構築できる
sudo apt-get install qemu
sudo apt-get install g++-aarch64-linux-gnu
sudo ln -s /usr/aarch64-linux-gnu/lib/ld-linux-aarch64.so.1 /lib
sudo ln -s /usr/aarch64-linux-gnu/lib /lib/aarch64-linux-gnu
これでARM64のプログラムをx86_64のプログラムと同じように実行できるようになる
(あくまでエミュレーションなので動作は遅い)
コンパイル方法は
aarch64-linux-gnu-gcc -o hogehoge hogehoge.c
アセンブラ出力してコンパイルするなら
aarch64-linux-gnu-gcc -S -o hogehoge.s hogehoge.c
aarch64-linux-gnu-as -a=hogehoge.lst -o hogehoge.o hogehoge.s
aarch64-linux-gnu-gcc -o hogehoge hogehoge.o
実行はx86_64のプログラムと同じように実行できる
./hogehoge
明示的にQEMUを呼び出して実行時のCPUを指定して実行したりできる
qemu-aarch64 -cpu cortex-a57 hogehoge
指定できるCPUの種類を調べるには
qemu-aarch64 -cpu help
どのARM64のバイナリかどうかを調べるには
file hogehoge
で確認できる Windowsの仮想マシンを使ってUbuntuを入れるのはこんな感じ
Windows 10 でVMware Workstation Player With Ubuntu
http://www.aise.ics.saitama-u.ac.jp/~gotoh/VMWorkstationPlayerIntoWindows10.html システムコールの勉強なんて今時いらんでしょ
VisualStudioなら既にインストールされてそうだし、
アセンブラソースをプロジェクトに加えるなので楽 >>257
上のx86_64アセンブラ勧めてるのは慣れてる人だから、自分が慣れて来たら参考にしても良いけど、ネットでもHello worldで終わってるコードばっかりとだけ言っておこう。
そう言う意味じゃ、自分でx86_64アセンブラの命令一覧を参考にコード書くためにも、CASLでアセンブラに慣れてみた方がいい。
PC向けはシステムコールじゃないと文字も出力出来ないので、VRAM直接弄りたいならGBやGBAなどのゲーム機や組み込み、電子工作のアセンブラコードのが面白い。 CASLじゃ、全然参考にならない
実際に使われてるものを使って勉強した方が良い
本屋でx86またはx86_64関係のアセンブラの本をいろいろ物色してみるのがいいかもね
ARMやARM64関連のアセンブラの本はあまり出てないからね >>265
64ビットOSでx86アセンブラの16ビットコード動かないじゃん?
仮想PCにFreeDOSでも入れればいいんだろうけど。
それにシステムコールの使い方ばっかで、意外とソートとかそう言うコード無いんよね。
だから最初はCASL勧めてる。
その後はx86なりx86_64なりARMなりお好きにどうぞ。 x86が目的ならはじめからx86でいいよ
わざわざ回り道しなくても ARMが目的ならARMで
MIPSが目的ならMIPSで
PICが目的ならPICで
RXが目的ならRXで
命令自体はMIPSが良いとは思うけど
わざわざ回り道するほどではない 下記URL参照だが、この意見に賛同。
x86は入門向けとは言い難い。
そもそもWinだと結局WinAPIより下の階層触れないからCで書くのとほとんど変わらない。
どうしてもx86_64ならLinuxがまだマシ。
オススメはGBAのARM32ビットCPUのアセンブラ。
ハードの仕様固定だから、直でVRAM弄れて楽しい。
PCはBIOSやOSが有るから、この辺楽しめない。
CASL IIはプログラマ視点で低水準な世界の雰囲気を味わう分には手軽な言語ではないかと思う。
本来は実機と本物のアセンブラを使うべきなんだろうけど、ちょっとしたボードであっても実際に動かすには色々な手順*4が必要で
面倒だし*5、普及しているアーキテクチャが入門向けとも限らない*6。低水準の世界にどっぷり浸かる必要があるならそういった現実ならではの汚い部分に向き合わなくてはならないけど、
そうでないならCASL IIの箱庭ぐらいが丁度良いのではないだろうか?
もっとも極めても直接的に役に立つことはない言語だという点は留意しておくべきだけど。
http://d.hatena.ne.jp/eel3/touch/20120109/1326110720 アセンブラの勉強のためならマイコンとかゲーム機とかでしなくても
JavaならビットマップにBufferedImage使えば
BufferedImageクラスに画面の内容をgetRGBというint型の配列として読み込むメソッドがあるので
これで読み取った内容をjniでC言語に渡して、
C言語からアセンブラに渡すか、インラインアセンブラでこの画像の処理をする部分を書いて
Javaに返してBufferedImageの画面の内容を書き換えれば(int型の配列を書き戻すのはsetRGB)
AndroidだとbitmapクラスにgetPixelsとsetPixelsがあって同様のことができる
(AndroidだとARMがメインになる)
これでVRAMをいじるのと同じことができる
javaとC言語ができるならJavaからCを呼び出すjniだって出来るんだろうし
アセンブラだからといって低レベルの部分にどっぷり浸かる必要はない
低レベルの部分にどっぷり浸かりたいならマイコンやればいいだけ
工業高校や専門学校ではそういう授業には8bitのPICやAVRなどのマイコンを使ってる
32bitマイコンだとアセンブラというよりもC言語がメインになるな もうそれ、アセンブラそのものの否定に片足突っ込んでるよね?
ぶっちゃけ高級言語からアセンブラ呼ぶ意義はSIMD命令使う以外は無いと思う。
アセンブラ好きの行き着く先はマイコンよ。 マイコンでもC言語をメインに使うのは同じ
Cでは書けないもしくは遅くなる部分でアセンブラを使うだけ >>270
Javaを経由する意味が不明
素直にアセンブラと相性が良いCでやれば良い >>271
いろんなアセンブラ好きがいる
SIMDや特殊命令でパフォーマンスを追求する人
アセンブラでのOSやシステム設計をする人
オールアセンブラでマイコンのプログラムを書く人
ハッキングに使う人
コンパクトなコードを極める人
アセンブラを作る人
命令セットを作る人
マイコンを作る人 普通の人ならVisualStudioでx86を動かすのが環境的には一番楽
プロジェクトを作成して、
メニューから [プロジェクト] ===> [ビルドのカスタマイズ] ===> masm をチェックして[OK]
あとは、*.cpp と *.asm のファイルを作ってコードを書けばビルド、実行、デバッグが可能
以下が64bitコードの例
---- cpp ----
#include <iostream>
extern "C" int func(int a, int b);
int main(){
std::cout << func(2,3) << "\n";
return 0;
}
---- asm ----
.code
func proc
mov eax, ecx
add eax, edx
ret
func endp
end
---- >>275
普通に、printf("%s", "%d\202\252\223\374\227\315\202\263\202\352\202\334\202\265\202\275\12\0");
を実行すればいいだけだろ? >>273
JavaとCができると書かれててグラフィックの話が出ててきてたからね
Javaならグラフィックスを扱うのも楽だから。
JavaのJNIはJavaからC/C++を呼び出せて
その呼び出されたC/C++のプログラムからJavaの関数を呼び出せたりする
だからJavaのAPIをC/C++から叩ける
そのC/C++の中でインラインアセンブラを使ったり、そのC/C++の関数をアセンブラから叩けばいいからね
C#ができる人ならC++でDLL作成してC#から呼び出せば同じことだけど >>279
Cでグラフィックを扱ったことがない感じ? グラフィックをやりたいのかどうかすら不明なのに
回答が先走りすぎ >>279
楽とかじゃなくて、直接弄れるのが大事なんだが。。。 質問者が直接弄りたいのか不明
グラフィックを扱いたいのかも不明 さらっとここまで読んでみた
勉強が動機ならCASLが一番いいのでは? >>290
ポイというよりまさにそれでしょ
最後の方の3ステージが未完だけどだいぶ楽しめた AndroidやiPhoneであれだけ64bitのARMが普及してるのに
64bitのARMの命令セットの解説書がほとんどないのがね
今からやるなら64bitのARMもオススメ
CPUの入門書であるComputer Organization and Design(日本語では「コンピュータの構成と設計」という題名)
は今までMIPSだけだったが洋書ではMIPS版の他に64bitのARM版も出てる
https://www.amazon.co.jp/dp/0128017333 64bitのARMで日本語の資料としてはこのサイトが一番わかりやすい
プログラムの実例があまりないけど
Linux で Arm64 アセンブリプログラミング
http://www.mztn.org/dragon/arm6400idx.html Computer Organization and DesignはあくまでCPUの基本を勉強するための本なので
別に買う必要はないよ
ただ、こういう有名な本でも64bitのARMが実例として採用されてるということ >>290
演算結果を直接床に置けないのがめんどい >>296
RISCだとそんなもん。
アキュムレータマシンがロードストアモデル採用すると
効率がどうなるかっていう教育にはぴったりのゲームだね。
あと条件分岐の条件の否定が欲しすぎる。 スクラッチみたいにGUIの部品並べたら
アセンブリが出来上がるソフトはないの? アセンブリが出来上がるっていうか実行ファイルだろう >>300
機械語に一対一対応のGUI部品作れば良いだけだけど、結局並べるのにハードの知識が要求されるっていう。。。
アセンブラを文字で入力するかマウスで入力するかの違いしかねえ。
入力の速さ考えたら文字のが早いっていうね。 どっちもただのジャンプ命令だから、GUI部品にした所で分かりやすくなるとは思えないが。。。
ジャンプ先のラベルを分岐かループかで色分けすれば? GUI部品がアセンブラの命令だけだと意味ないんじゃね その通りだが、機械語と一対一じゃなくなった時点でアセンブラではなくただの高級言語。 アセンブラマクロというものがなかったか?
それと、歴史的に機械語→アセンブラ→構造化→高級言語って進んてるんだから
構造化してないようなものは高級言語には入らないだろ
低級とか高級とかはどれだけハードウェアに近いかとか人間に近いかとかだが、
それでもアセンブラマクロがあるからって高級言語にはならんと思うよ そりゃそうだ。
命令とマクロは違うし。
それでもマクロ使えるのは高級アセンブラとか言われてたな。 それは「高級言語のアセンブラ」ではないんだが、
わかってるか? 両方の意味で使われてた気がするがなぁ。
マクロが豊富で高級言語っぽく使えるって触れ込み。
高機能アセンブラとも、高級言語風アセンブラともとれる。
マクロ使うかどうかはその人次第だろうが。 マクロや擬似命令がついてるからって、高級言語にはならない
いったいそのトンチンカンな知識はどこで習ったんだ? 誰が高級言語になると書いたよ。
高級言語「風」だ。
それにアセンブラメーカーの宣伝文句をそのまま書いただけだ。
(リーフアセンブラだったっけ?大分昔買ったやつ)
機械語を吐くって意味じゃアセンブラも高級言語も同じ。
むしろアセンブラのが機械語と一対一だから単純。
ループや分岐みたいなよく使う機械語パターンを文法によって吐くのが高級言語ってだけ。 >その通りだが、機械語と一対一じゃなくなった時点でアセンブラではなくただの高級言語。
>機械語と一対一じゃなくなった時点でアセンブラではなくただの高級言語。
>高級言語。 構造化を高級言語の条件にしちゃったら BASIC が可哀想だよ。
ラベルを明示的に書かずに分岐やループを書ければいいのなら OPTASM でやったよ。ずいぶん昔だけど。 ID代えてもバカさを隠せないなんて、
おれ、こんななの初めて見た
構造化を知らないからこそ、BASICがどうたらって話が出てくるんだろうな
そんなに知ったかぶりたいのか? >>314
マクロは文法とは違って単純に命令の塊を置き換えたもの。
ライブラリや文法よりはCのマクロが近い。
高級言語の場合、その言語のライブラリだったりランタイムがある。
だからアセンブラの中でも高級アセンブラって言われたりもするが、高級言語とは違う。
ループや分岐をGUI部品でとなると、それはマクロではなく文法のGUI化で、それはもう高級言語。 自分で言ってて分かりにくいな。
アセンブラのマクロは機械語と一対一命令に変換出来るのはアセンブラが機械語と一対一だから当然として、高級言語は高級言語の文法が機械語に一対一対応では無いので変換出来ない。
この機械語と一対一に変換可能かどうかが低級か高級の分かれ目じゃ無いかと思う。
なのでマクロをGUI部品にするならループとかの文法的なのじゃなくて、命令の塊を入れるフォルダー的な物になるんじゃ無いかな。
引数付きフォルダー? x低級か高級の分かれ目
o高級アセンブラか高級言語の分かれ目
ああ、でもCも高級アセンブラって言われることあるから、上げ足取りされそう。 KKCBM/yI の言う「構造化」って何のことだったのかな。
何が気に障ったのか本当に解らないよ。 機械語ひとつに対してニーモニックは複数である場合が多い
って話か? 機械語だけあったって完全には逆アセできねーだろってことじゃね? 同一命令に対して複数の表記があるのは普通だし、
逆にアセンブラでは(命令の形では)記述できないようなのもあったりもする
即値によって命令を自動で変えてしまうとか
特定のプレフィックスを指定できなかったり
アセンブラは決して一対一を目指してるわけではない 最近のCPUって中はμOpなんだし
外にも公開してでプログラミング可能にすれば効率よくね? それがIA64(Itanium)だったけど、互換性の壁に敗れた。
それに現行だと変換後、直接実行か0次キャッシュからしか参照しないから将来どっちもメモリから受け付けるアーキテクチャ出すとかしないと意味はない。
あとμOpはAMD CPUと互換性ない。 恐ろしいほど知能の低いのが混じってるな
なんだこのスレ 本当にできる人は自分よりレベルの低い人を見下したりはしない >>335
x86も元々はuOPなんてものはなく、そのまま実行してたんだよ >>337
おれは天才だけど、他人を見下すの大好き >>341
知ってますよ〜。
高速化の過程でRISC風命令に変換するようになったんですよね?
だから、最初からRISC命令なIA64はμOpに対する最適化の集大成+α。
Intelが思ってたほどコンパイラの最適化が出来なくてVLIW(だったっけ?)が上手くいかなかったらしいけど。
(上手く出来るコンパイラ作るのが難し過ぎたらしい)
もっと安くしてモバイルや組み込みから攻めてたら、もう少しいけてたかもなと考えると勿体無かった。 コンパイラに頼ってたら長続きしないよ
命令互換でもCPUによって命令のスループットもレイテンシもuOPも違うんだから x64はuOP変換前提だとそんなに悪くない
苦手な処理は新命令で補ったし
レジスタも増えたし >>342
じゃあ自分が思ってるほどじゃないんだよ。 口だけじゃなくて、やねうらおみたいに実績で示して
あの人は自分で自分を天才って言ってるけどそれだけのことはしているからね >>349
お前に心配されなくても実績はたくさんある
こんなところでわざわざ示さなくても ちょっとお尋ねします
手続きカウンタの値により手続き順に処理を飛ばすプログラムを考えています
この時手続きカウンタの評価が先頭につきますが
このオーバーヘッドがいやなのでProgramCounterに次の処理の飛び先をロードしてjumpさせたいのですが
if 手続きカウンタ==1 jump 処理1:
if 手続きカウンタ==2 jump 処理2:
:
if 手続きカウンタ==n jump 処理n: 手続きnが多いとオーバーヘッドが無視できなくなる
else 出口:
処理1: {
:
jump_出口:
手続きカウンタ +=1 } // ここをPCに代入するための飛び先番地に変更
処理n: {
:
手続きカウンタ=1(手続きカウンタ初期化) // ここをPCに代入するための処理1の飛び先番地に変更
jump_出口: }
出口:
通常のCPUのJUMP命令は直値のみでレジスタ間接は無いので変化球技で実現する必要があります
こんな変なことをやって居る方はおられますか? 又、どのように実現したのでしょうか? x86とかならjump [mem] やjump reg があるよ
場合によっては、スタックに戻り先とジャンプ先を積んでretしてもいい いや普通のCPUにはレジスタ間接ジャンプあるよね? わいの今使ってるCPUのニーモニックを目を皿のようにして探しているんだが
レジスタ間接ジャンプがないんやでえええ
見方が悪いのかもな 普通そんなことありえないか・・・そうだよな?
テーブルジャンプなんて普通に使うもんな Cコンパイラがあるならswitchでコード書いてアセンブラソース吐かせろ
多分テーブルジャンプになるんじゃないかな Cコンパイラが使える環境なのか?
なら素直にCで書けば 本当にジャンプ位置をダイナミックに決められないのなら、
2分検索とかでいいし、率がわかっているならもうちょっと頭の良い方法でも良い
1個ずつ分岐するのは大抵の場合効率が悪い ID:DMOHal5+はハマってるのかな?
MCS51じゃあないよな avrってメモリ保護とかあるの?
なければ
・jmp命令とオペランド(飛び先)をテーブルにする
・機能番号でテーブルからjmp命令を拾ってくる
・次のjmp命令を書き換える
だけじゃねぇか
そこだけram上でやればいい 多分岐switchのアセンブラ出力をパクるのが一番か 関数ポインタが確実だろ。switchはifでも実装できる。 あー関数テーブルか失礼
C使えるんだからソレでいいと思うけどね AVRなら、IJMPというそのまんまな名前の間接ジャンプ命令があるようだ。 ┌○┐
│死|ハ,,ハ
│ |゚ω゚ )
│刑| //
└○┘ (⌒)
し⌒ ┌○┐
│ハ|ハ,,ハ
│ |゚ω゚ )
│ゲ| //
└○┘ (⌒)
し⌒ 1164ページw
でも、PowerPCとか需要あるのか? アセンブラ自体だけじゃ無くて、考え方を考える本でもあるからな。 ★☆☆☆☆w
virtex-6以降はpowerpcコア搭載タイプ無いのかすぃら? Z80の本が出たときは我慢出来たけど
6800の本が出たときは逝ってしまった zeas88
一月かけて入力して動かなかった
三月かけてダンプをチェックしても動かなかった
思い出した 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
VM3VN Intel記法とAT&T記法ってどっちがいいと思う?
思う? とか訊いておいて 実は俺のなかではAT&T記法のほうがいいと思ってるw
例えば
add eax,4
addl $4,%eax
という命令があってAT&T記法のほうはUnixで用いられているコマンド
(というかOS/2系列でも同じようなコマンドがあるが)
$ copy aaa.txt bbb.txt
の文法に並びがそっくりだし,変数に$を前置するというのもUnixで最もよく用いられているB系シェルの
変数を表わす規則と同じ。レジスタに%が付いてるのも分かりやすいと思う。
今主流なのはIntel記法なので 残念ながら俺は少数派なんだろうがw >>395
チェックサムは、
・・・ A B ・・・SUM1
・・・ B A ・・・SUM2
見たいな間違いがあると、縦横チェックサムであっても、
間違いに気づく事が出来なかったなぁぁ・・・。 雑誌に書いてあったバイナリコード :
・・・ A B ・・・SUM1
・・・ B A ・・・SUM2
間違って入力したコード
・・・ B A ・・・SUM1
・・・ A B ・・・SUM2
これだと、横・縦の両方のチェックサムが雑誌と同じになってしまう。 >>396
gccでIntel記法でアセンブラ出力できるよ
gcc -S -masm=intel hogehoge.c
インラインアセンブラでIntel記法使う場合も
gcc -masm=intel hogehoge.c
objdumpでIntel記法で逆アセンブルする場合は
objdump -M intel -d hogehoge.obj 396ですが,AT&T記法を中心に学ぶことにしました。
理由は,2つあり,
・OSの勉強をするためにこれから読んでいこう(というか既に読んでいる)
UNIX v6 for x86のアセンブラがAT&T記法である
・仕事でアセンブラを使う訳ではないので,今現在普及しているものでなくてよい
つまりIntelが発表するCPUの最新機能を使ったりする機会がないので
枯れた情報しかないAT&T記法でも十分やっていけると考えた
ということです。
まあ,チラ裏ですが,これから個人でアセンブラを学ぶとしてる人が見てれば参考にして下さい。 Intel・AT&T 記法を抽象化した、仮想アセンブラのLLVM で学べ!
情報処理資格でも、仮想アセンブラのCASL 2 gdbの逆アセンブラも
set disassembly-flavor intel
と打ち込めばIntel記法で逆アセンブルしてくれる
デフォルトでIntel記法にしたいならホームディレクトリの.gdbinitに上記を記述
詳しくはググると出てくるかも ARMは
mov r0, #4
64bitのARMは
mov x0, #4
と右から左
MIPSも
li $4, 4
RISC-Vも
li a0, 4
と右から左
PowerPCも
li %r3, 4
と右から左
今のパソコンやサーバでメジャーなCPUの多くが右から左 しかしどうして右から左に読むのでしょうね。
英語だと特に
move number to address
と自然に読み下せるのに。(というかニーモックってまさにその目的の筈では……) 左右なんてどっちでもいい
記法もどっちでもいい
もっと本質的なことに頭使え アセンブラの本質って機械語不便だからわかりやすくする記法なのに
それに気を使わずにどこに頭使うの? >>407
ある種の文化の衝突が起きていると思う。
事実標準に近かったZ80などでは、語順的には、今「Intel記法」と
呼ばれているものだった。でもIntel記法よりも洗練されている
感じだった。それが、人気があったひとつの理由だと思ってる。
でも、学者などは、さかさまに固執するような印象が多い気がする。
なんでも市場や事実標準とは逆を好む天邪鬼みたいな姿勢の人が多い。
たとえば、NEC機が流行っていたころは、京大構内では日立マシンが標準だった。
今、Windowsマシンが標準なのに、灯台ではMacが標準。 >>411
学者は、事実標準に逆らったことをするのが大好き。なぜなら、そうすれば、
自分たちが優位になると思っているから。
たとえば、数式処理プログラムのMaximaも、LISPで書かれているし、
AI関連のライブラリが充実している言われる、Pythonも然り。
東大がMacを標準にしたのは、表向きはMSの独占的地位を破壊するため
かも知れないが、裏には、プログラミングが得意な学生に学者が負ける
と面目を保てなくなるのが困るからではないかと考えられている。 >>408
それは
a is b
とか読むんじゃないですかね。 UNIX v6やv7が使われた16bitミニコンのPDP-11やBSDが使われたVAX11が左から右の記法だった
PDP-11からの影響を受けた680x0も左から右
だから1970年代、1980年代前半から半ばまでのUNIX界隈では左から右が主流だった
だからx86のAT&T記法が左から右なんだろうな
1980年代終り頃に普及したMIPS、POWERが右から左の記法
(よく知らないがSPARCやPA-RISCは左から右のようだ)
要するに左から右の記法はPDP-11の影響を受けてるわけだ
(VAX11はPDP-11の後継の32bitミニコン)
SPARC、PA-RISCが左から右なのは
680x0を使ったワークステーションの後継機種用のCPUとして作られたからだろうな
今でも680x0の影響を受けてるCPUは左から右
逆に言えば、パソコンやサーバ、スマホなどは
PDP-11、VAX11、680x0などのCPUの影響を受けてないCPUが主流 そういう経緯とか全然知らんかったわ。
Z80は古い機種だと思うんだけど,>>411によればIntel記法に近いらしい。
一概に,「昔はAT&T記法が主流だった」とも言えねえのな。 >>416
Intel 8080 の改良版が、Z80。
以下、同じ命令を、8080とZ80について書いてみる。
Z80の方が現代のアセンブリ言語に近く、人間には覚え易くて
理解しやすいが、アセンブラの作成が当時としては難しくなった。
Z80がなぜ人気が爆発したか、これだけ見ても分かるかと思う。
【8080】
MVI A,byte ; A <-- byte // move immediate を略して MVI
MOV A,B ; A <-- B // 意味は同じなのに、第二オペランド
// がレジスタに変わったなっただけで命令表記が変わる。
MOV A,M ; A <--(HL) // M の意味は、(HL)
MOV H,A ; H <-- A
MOV L,A ; L <-- A
LXI H,word ; HL <-- word // これも意味は move なのに命令が変わる。
LHLD word ; HL <---(word) // これも、現代なら単に(word)と書けばいいとこ
// ろが命令自体を変えなければならなかった。
【Z80】
LD A,byte
LD A,B
LD A,(HL)
LD H,A
LD L,A
LD HL,word
LD HL,(word)
【参考】
http://nemesis.lonestar.org/computers/tandy/software/apps/m4/qd/opcodes.html >>415
命令表記を左右逆にしていれば、今頃 68000 が天下を取っていたかもしれない。
高級言語の「A = B」がそのまま、MOV A,B と書けるのはやはり分かりやすいので。 >>417
昔も今もそうかもしれないが、IntelもMSも、余り「判りやすく書く」
「すっきりと設計する」ということが余り得意ではないかもしれない。
MSの作ったAPIは構造が汚い。 Zilogがせっかく、二モニックを美しく修正したのに、Intelは、また、MMX や SSE以後で
汚くしてしまった。
それに、セグメントの概念もMMUの設計もひどかった。
セグメントに関しては、トランジスタの集積度が少なすぎてしょうがなかったのかも
しれないが、それを長く引きずりすぎた。
80386のプロテクトモードなんかどうでも良くて、単にプロテクトの無い32BITの
フラットモードがあれば喜ばれ、MS-DOSが今でも続いていたかもしれない。 >>418
しつこくてすまんが
$ cp file.org file.new
$ mv file.org file.new
↑こういう操作を考えると
AT&T記法のほうが馴染みやすくない? >>421
個人的には、数学や物理の表記の方が親しみがある。 >>423
http://afsoft.jp/os/p02.html
CP/M も copy コマンドは、「左から右」だったと思うけど:
COPYコマンド
ディスクをコピーします。
【書式】COPY {mode} {コピー元} {コピー先}
mode : ALL・・・ディスク全部をコピー
BOOT ・・ブートトラックをコピー
FILES・・ブートトラック以外をコピー
コピーではないが、rename コマンドにそれらしき痕跡はあった。
確かに、右から左で、しかも、「=」記号もつけていたらしいね:
http://www.discordia.org.uk/px4/cpm.html
REN [d:]newname.ext = oldname.ext
Change the name of a disk file from oldname.ext to newname.ext これかな???
PIP [d:][newfile.ext]=[d:][filespec][<t>
Copy files between peripherals whilst performing optional conversion <t>.
Copy file from drive to drive: C> PIP H:=A:INFO.DAT
Copy file to new name: C> PIP A:NEW.DAT=A:INFO.DAT
Copy file to printer: C> PIP LST:=A:LETTER.TXT 確かに有った。copy コマンドが登場するより前に、PIP コマンドがあったのか。
知らなかった。
https://en.wikipedia.org/wiki/Peripheral_Interchange_Program
The original PIP syntax was
PIP destination←source /switches
using the left-arrow character from the ASCII-1963 character set
that the Flexowriter keyboards of the time used.
As other terminals were introduced that used later versions
of ASCII (without the left-arrow character), PIP allowed the syntax
PIP destination=source でもcopyコマンド(in CP/M)自体はUnix風の動作なんだよね。
pipコマンドというとPythonのアレしか思い浮かばないがw pipはビルトインじゃなくて外部コマンドだったから数バイトのコピーするときにでも
pipを読み込むために数十KBの実行ファイルをフロッピーゴトゴト言わせてからコピーが始まる >>435
マジかよww
なんでそんな不便な方法しかなかったんだろう
当時はそれが一番効率的と考えられてたんかな MS-DOSのVer2.xxからはいろんな意味でUNIXをリスペクトしてるからな
UNIX流にファイルハンドルでファイルを扱ったり、階層ディレクトリを導入したり、
環境変数を導入したりな
マイクロソフト自身がXENIXというUNIXを販売してたしね マカーが散々捏造したきたようにその手の話は眉唾もの。 最近のC++コンパイラはAVX2命令ガンガン吐いてくるからすごいな あんま詳しくないが同じような処理を繰り返す場合には速いらしいな >>451
MMX, SSE〜SSE4, AVX, AVX2, AVX512 は、SIMD命令だから、ループを展開して、
ベクトル計算のように考え直した場合、そのベクトルの足し算やベクトルの
要素ごとの掛け算などが速くできるようになる。 C++で吐く場合ってあえてそうなるようにコーディングしてるんだと思うが x86_64のRAXのRってなんの略か分かる?
EAXはExtended AX、AXはAccumulator (eXtended)でしょう。
「R」とはいったいなんなのだろう。
それとは別に、EAXって拡張拡張可算なんだね。
互換性とかの観点からすると仕方無いとも思うが もうちょっとマシな名前はなかったんだろうかw >>455
>>456
あざす。
マジかよ「レジスタ」のRなのか。 i386アセンブラで書かれたGNU coreutilsみたいよ。
なんか紹介文に「アセンブラ楽しいから 皆もソース読んでね!」みたいなことが書かれてたw iOSアプリでPoketAssemblyなるもの落としたんだが、説明に英語でLC-3アセンブリ言語って書いてて、
初めて見るCPUなんだが、何か情報源知ってたら教えて欲しい。
ネットで調べてもイマイチ見つからない。
幸いにも?CASL2に似てる命令っぽいし、マクロ的なのは多いっぽいのはサンプル見て理解出来た。
命令一覧があれば遊べそうなんだが。。。 ありがとう。
ざっと読んだ感じ、立ち位置的にもアメリカ版CASLみたいな教育用アセンブラって感じみたいね。
リンク辿って簡単な入門書読んでみたけど、結構独特の文法。
(あっちでは普通なのかもだけど) 最近Shenzhen I/Oっていうゲームで遊んでる。
なかなか面白い。 >>417
1.5年前の書き込みで誰もいないスレだと思うけどw
ふと思ったんだけど、これ言語設計した人に
ヘブライ語圏とか右から左に書く言語の人がいたりしたんじゃないかな、などと思ったり
MOV A,B 例えばこれ左から読むと日本人には言語的にわかりやすい
BをAに移動
この説どう?w >>513
mov A,B //(1)
に関して、
英語圏の人では、必ず語順が
「from B to A」
となるので、(1)とは逆になり違和感を感じる人が居るらしいが日本語では、
「AにBを代入する」
という言い方だと(1)と同じ順序になり、昔から問題ないと言われている。
個人的には、言葉ではなく、数学の
A=B
という表記と同じなので、Z80やx86のこの順序が天下をとったと見ている。 >>516
数学で、量を定義する際、
A≡式
のように書くことがあるが、Aは短い変数名で、右辺の式は大体、長い。
このような定義式を複数、縦に並べたて書く時に、変数を左側に書いたほうが
≡の記号が同じ場所に並んで見やすい。
そのために、左辺にdestination、右辺にsourceを書く習慣になったと
個人的には考えている。 古くは、Fortran, Basic の時代から、Pascal, C、C++、JS、Java、Perl, Ruby、C#、Python
に至るまで、変数 A に式 B の値を代入する構文は、
1. A = B
と書いてきた。これは、数学の記号と似てる。そしてその順序を
そのままアセンブラで持ち込めば、
2. mov A,B
と書ける。ところが、英語で mov (移動する)という言葉を使う際、
1と大体意味的に同じことは(本来はmovではなくcopyであるのだが)、
3. I mov an B to A.
の順序になってしまう。それでこの順序で書きたい人が出て来て
そういうアセンブラも存在するようになった。
今でも、LLVMでは、
4. A = add 型名 B, C で A = B + C の意味なのに、
A = B の意味では、Aがレジスタではない変数の場合には、
5. store 型名 B, 型名* Aのアドレス
の順序で書き、A がレジスタの場合には、
6. A = load 型名 * Bのアドレス
と書く。
5.では、1と順序が逆になっているが、6.では、1と同じである。
(この書き方は、数学的統一性が無いので好きではない。) >>519
誤: 3. I mov an B to A.
正: 3. I mov a B to A. >>517
数学では
A=BもB=Aも同値
A≡BもB≡Aも同値 .486
.model flat,stdcall
option casemap :none
.code
>>540 kakakisann
kaki
kakitaina
kaitemoiika
kakeyo LD HL,0 ; DEHL := DE * BC ; min 445, max 723
LD A,D
ADD A,A
JP NC,skp0
LD H,B
LD L,C
skp0:
repeat 7
ADD HL,HL
ADC A,A
JP NC,skp1
ADD HL,BC
ADC A,0
skp1:
end repeat
LD D,A
LD A,E
LD E,H
LD H,0
repeat 8
ADD HL,HL
ADC A,A
JP NC,skp2
ADD HL,BC
ADC A,0
skp2:
end repeat
ADD A,E
LD E,A
LD A,0
ADC A,D
LD D,A >>772
16ビット÷16ビット=16ビット……16ビット
を CASL で >>777
; GR1 ÷ GR2 → GR1 … GR2
LAD GR4,65535
LAD GR3,0
LOOP SLL GR3,1
SLL GR1,1
JOV SKP1
JUMP SKP2
SKP1 LAD GR3,1,GR3
SKP2 CPL GR3,GR2
JMI SKP3
SUBL GR3,GR2
LAD GR1,1,GR1
SKP3 SLL GR4,1
JNZ LOOP
LAD GR2,0,GR3 >>912
運営に通報すれば、アボーンはしてくれるはずだけど、規制すると
同じプロバイダの人も規制されてしまって迷惑が掛かるかな。 >>914
5chにも通報板があるはずなので、やって。
2chには有った記憶が有る。 このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 3610日 8時間 47分 29秒 5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。
───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────
会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。
▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/
▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php レス数が1000を超えています。これ以上書き込みはできません。