1read 100read
2013年03月プログラム367: アセンブラ初心者スレッド (336) TOP カテ一覧 スレ一覧 2ch元 削除依頼
Microsoft Silverlight その9 (428)
「OS自作入門」 (325)
3Dアルゴリズム全般 (499)
HTABOXコア Part3 (593)
【Java】DIコンテナって本当に便利か? (461)
人工知能は感情を獲得する事ができると思いますか? (497)

アセンブラ初心者スレッド


1 :2011/08/28 〜 最終レス :2013/03/07
初心者OK!質問大歓迎!のアセンブラのスレッドです。
基本情報の勉強中の人、PICやH8を勉強中の学生などなど…


2 :
このスレッドは天才チンパンジー「アイちゃん」が
言語訓練のために立てたものです。
アイと研究員とのやり取りに利用するスレッドなので、
関係者以外は書きこまないで下さい。
                  京都大学霊長類研究所

3 :
アセンブラ最高や!
C言語なんか最初からいらんかったんや!

4 :
マシン語最高や!
アセンブラなんて最初からいらんかったんや!

5 :
アセンブラを勉強するのにいい、unix系の本がありますか?

6 :
だいぶ前に落ちたっきり次スレが立たなかったアセンブラスレの
次スレを立てましたので、以後そちらで。
http://hibari.2ch.net/test/read.cgi/tech/1314512680/l50

7 :
>>6
初心者用らしいしここでいいんじゃね

8 :
初心者用なら質問用テンプレが居るな、特にアセとなると
石、アセンブラが何か分からんと答えられんケースあるし
【CPU】 アセンブラではCPU(通称「石」)によって回答が全く違ってくることも多いので必須です。
     まったく分からなくても「Windowsが動くCPUです」など、分かるだけのことを書いてください。
【アセンブラ】 これも分かれば。コマンド名とかでもいいです。
あとは何をテンプレにすべき?

9 :
書籍なんかがあればいいと思うけど

10 :
質問します
『独習アセンブラ』という本を買って来て、文字を出力するプログラム(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 :
dispchar.asm のソースを一応載せておきます
>cat dispchar.asm
; dispchar.asm
mov ah, 02
mov dl, 31h
int 21h
mov ah, 4Ch
mov al, 0
int 21h

12 :
>>10
それに乗ってるのは16bitのコードだから、win7 64bitでは動かないよ
アセンブラも多分16bitだから動かないんじゃないかな?

13 :
>>12
えっ、そうなのですか
残念です
では64bitの環境で学習できるよいサイトはあるでしょうか?

14 :
NASMはWin32版もある

15 :
ピックやれピック

16 :
>>13
32bitアセンブラコードは。。。
ほとんどwin32API呼び出しで、アセンブラの意味はないしねぇ。。。
>>15の言う通り、PICマイコンでアセンブラした方が遊べると思うけど、こっちのアセンブラが64bitOSで動くかも不安が在るな。。。
ためして見た人居る?

17 :
実ハードで動かすことにこだわらず、エミュ使うのも手だと思うが。

18 :
xpモードで開発&実行

19 :
アセンブラで、C言語のcase文のように書きたいのですけどどう書けばいいですか?
また、イフ文のようにも書きたいんですけどどう書けばいいですか?


20 :
あ、開発環境はMPASM
PIC16F84Aです

21 :
基本的には無理。
定番としてはテーブルジャンプだけど、その石でできるかどうかは知らない。

22 :
call adressを機械語にすると
E8 77 77 77 77 みたいになるけど
この77777777実際のアドレスと違うんだよね
どういう規則でこのアドレスは算出されてるの?

23 :
call命令っつっても対応するオペコードは複数あるんだよ。
E8の場合はIPからの相対アドレスへのnear call。

24 :
相対ジャンプの場合は、石によるけど、ジャンプ命令のアドレスからのオフセットか、
その次の命令のアドレスからのオフセット(8086はどっちだっけ)。

25 :
8086はWindowsのことだよね?
逆算してみたら、次のコードの開始位置からの相対位置ですね

26 :
BSR ラベル:16 で書くのと JSRではどっちのがメモリ食うのか分からないです。
長いならJSRですかね?

27 :
石の種類によるけど、BSRは3〜4バイト、JSRは4〜6バイト。
BSR ラベル:8 と書ける石もあって、この命令は2バイト。
でも、一般的にBSRのほうがJSRよりもマシンサイクルが多い(=遅い)。
その差まで気にかけるほどシビアな条件にはならないようにハード選定時点で
考えられるはず。 ってもう見てないよな(w

28 :
暇なんでやってみた
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

29 :
64bitOS上の32bitアプリで関数コールにpushad popadだけ書いてretしたらエラー落ちするのは何が問題なんでしょう?

30 :
>>29
    .386
    .model flat
    .code
_start:
    call  testsub
    ret
testsub:
    pushad
    popad
    ret
    end  _start
ml test.asm /link /subsystem:console
Vista 64bit で動かしたけど、なんも問題ないっぽいけど。

31 :
たのしそうだなー

32 :
>>30
それ64bitOS上の64bitコードじゃね?

33 :
バカ発見

34 :
キチガイ発見

35 :
アフォは自己紹介をする。

36 :
>>35
早く自己紹介して

37 :
アセンブリをCのソースに変換するフリーのデコンパイラって存在しますか?

38 :
存在しますよ。

39 :
検索キーワードを教えちくり

40 :
英語で検索すればおk

41 :
なるほど
ありがとう!やってみる

42 :
フローチャート書いてるんですが
スタック操作命令のPOP,PUSHってどうやって書けばいいですか?
PUSHの場合これ出会ってますか?
SP←0+(GR1)

43 :
フローチャートはコーディングじゃないから、箱(処理)の中に「GR1をスタックに保存」「GR1をスタックから復帰」とか、自分で分かりやすい風に書きゃいーよ。

44 :
>>43
そうなんですか。
ありがとうございます

45 :
68kの性能のいいディスアセンブラないですか?
例えばデータの直後に命令があったらそれを識別できるくらいのがありがたいのですが

46 :
サブルーチンからメインルーチンヘジャンプ命令ってプログラム的には問題なんでしょうか?
たとえば
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
これの場合風呂チャートはどう書けばいいでしょうか?

47 :
何これ、CASL?

48 :
>>47
CASL2です

49 :
>>46
まず第一に、そのコード自体がまずい。
コール、リターンというのがどういう動作なのか理解してる?
コールは次の命令のあるアドレスをスタックに積み、ジャンプする。
逆にリターンはスタックから1つ取り出して、そのアドレスにジャンプする。
そのコードだとLOOPへジャンプする度にスタックを食いつぶしていくことになる。
本来ならループされた数だけ戻り先の処理が行なわれてしまい、戻った際の処理もおかしくなるところ。
(そのコードの場合は戻り先がたまたまRET…つまり、何もせずにリターンするために一応動くことには動くのだが)

50 :
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)

51 :
>>50
自分でトレースすりゃすぐに分かりそうなもんだが、何故人に訊く?

52 :
fldの所でdword ptrは付けないの?
そのままだとtbyte ptrがデフォルトになっちゃうと思うんだけど

53 :
angle 0.78539819
↓こうなる。何だよDENって。。
cos 1.0000000
sin 1.997e-039#DEN
↓正しくはこう
cos 0.70710677
sin 0.70710677
>>51
さっぱりわからんとです。ハード的なコアな問題じゃないかと思って聞いた。
>>52
fld dword ptr [angle]
こうしたが同じだった。


54 :
>>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ではアドレスではなく中身を取ってきてしまう

55 :
また間違った 今起きたばかりで脳がボケている
&だから参照なんでアドレスが入っているんだね
だから最初のfldもアドレスを先にロードしてそこからさらに読み取ればうまくいった
_asm {
mov eax, angle
fld [eax]
fsincos
mov edx, cos
mov ecx, sin
fstp dword ptr [edx]
fstp dword ptr [ecx]
}

56 :
>>53 DENはおそらくデノーマル数だろうな。

57 :
>>53
>さっぱりわからんとです。ハード的なコアな問題じゃないかと思って聞いた。
ステップ実行すりゃ、一番最初の fld angle で失敗してることくらい一目瞭然だろ。
ひょっとしてデバッガの使い方分からんのか?

58 :
>>55
そのコードで直りました!ありがとう!
>>57
うちのVCたんはレジスタ表示出来ないの
お茶目な奴なんだよ

59 :
>>58
>うちのVCたんはレジスタ表示出来ないの
ツール(T)→設定(S)→上級者用の設定
にチェック入れてる?

60 :
x86の浮動小数点演算って変な格好をしてるよなあ
8087というコプロセッサを使うために作られたアーキテクチャとは言えそのまま引きずってるし
SSE2を使うと精度は64bitに落ちるが一応倍精度演算出来るもんな
x64も最初はFPUをコンテキストスイッチで保存しない計画だったんでしょ
全部SSE2に切り替えようとした
でもどっから圧力が掛かったのか社内の意見で反発されたのか、64bitOSはFPUを保存する事にした

61 :
あ、ちなみにSSE2には超越関数はもちろんないが、プログラムで組んでもFPUと互角か
FPUより速い場合が今のCPUでは普通

62 :
>>60-61
日本語でおk

63 :
>>62
意味が分からないなら無理に読まなくてもいいよ

64 :
>>63
> 8087というコプロセッサを使うために作られたアーキテクチャとは言えそのまま引きずってるし
「〜とは言え〜し」の使い方が異常。

> SSE2を使うと精度は64bitに落ちるが一応倍精度演算出来るもんな
IEEE754でいうところのDouble precisionなのに何が「一応」なのか意味分からん。

65 :
難癖付けるのだけはうまいな
Intelは互換性を重視したために今のような汚いアーキテクチャになった
これは意図的に選んだ道だ
いくらでも綺麗に設計しなおすチャンスはあったが敢えてそうしなかった
MSのVCのlong doubleが64bitであるようにFPUを切り捨てる計画は
かなり前からあったようだがIntelに押し切られるような格好でOSの設計
だけは譲られなかったのだろう
それからFPUの内部演算は全て80bitだ
だから64bitで計算するのと結果が異なる場合がある

66 :
>>65
>Intelは互換性を重視したために今のような汚いアーキテクチャになった
8086の頃から汚かったゾ?
>これは意図的に選んだ道だ
「今のような汚いアーキテクチャになった」のは「結果」であって、「選んだ道」ではないが。

67 :
>>65
>いくらでも綺麗に設計しなおすチャンスはあったが敢えてそうしなかった
432とか、80860とか、Itaniumとか、ハイエンド製品についてアーキテクチャを見直すチャレンジは何回かやってるよ。

68 :
どこに言っても言葉尻だけ捉えて重箱の隅をつつくようなアホがいるから対応策は一つ
66 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん
67 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん

69 :
>>67は言葉尻ではないよな

70 :
69 名前:あぼ〜ん[あぼ〜ん] 投稿日:あぼ〜ん

71 :
スレ違だったらすみません
H8マイコンで、ボタンが押されるたびにLCDに表示されてるいる数を減らすのを作りたくて、ER4に MOV.W #D'5みたいに入れてそれをボタンが押されるたびに、一個づつ減らすように書いたのですが、そのER4の内容をLCDに表示させるのはどうすればいいんでしょうか?

72 :
>71 日立…じゃなくて今はルネサスか…に問い合わせればきっと
トレーニングキットなり講習なりの案内はもらえるとは思えますよ。
数十万〜数百万個とか使うのでなければ有償だとは思うけど。

73 :
>>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の内容を表示用の文字列に変換できる。


74 :
>>72
>>73
レスありがとうございます。>>73さんのやり方で表示できました。ありがとうございました!

75 :
お役に立てて嬉しい

76 :
あ、途中で書き込んじゃった・・・レジスタや変数の内容を表示したいのはよくあること
だから、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 :
ここがASMスレなのを忘れて書いてしまった。
コンパイラによって違うけど、ルネのだと
dmp(変数)
    MOV.L #変数,ER0
    JSR  dmp
dmp(変数,長さ)
    MOV.L #変数,ER0
    MOV.W #長さ,R1  (16bitで充分、8bitでも可)
    JSR  dmp
となります。

78 :
返信遅くなりすみません
有益な情報ありがとうございます
是非この先使ってみたいと思います!

79 :
すみません,アセンブラ単体でヒープ領域のメモリ確保ってできますか?
アーキテクチャはlinux 2.6 on EM64T(およびPIC30F4012です.)
(おそらく後者は不可能という結論は出ていますが,ついでなので質問です.)
前者は,call malloc等でC関数を呼べば実装できているんですが,
Cランタイム非依存のlinux環境下では,int 0x80のシステムコールのみで
ヒープ領域の確保,解放を行う必要性があると思っています.
(システムコールなく,CPU命令で直接ヒープ領域にメモリ確保できれば十分です)
わかる方いらっしゃるでしょうか

80 :
>>79
>すみません,アセンブラ単体でヒープ領域のメモリ確保ってできますか?
できますよ。
>アーキテクチャはlinux 2.6 on EM64T(およびPIC30F4012です.)
どちらも当たり前にできますよ。

81 :
>>80
それぞれのインストラクションコードってわかりますか?
ggり方の問題なんでしょうけど,探しても見つかりません……

82 :
>>80
騙してやるなよ可愛そうだろ.
それとも本気で無知乙か?w
>>79
PICのアーキテクチャ見てみろ.heap……ってか,
レジスタ以外にメモリあるか? 別途メモリとか実装すればそれっぽいことはできるかもな.
そもそもシングルタスクなのにメモリ空間を分ける意味がわからないが.
AMD64はわからんが,linuxならシステムコールのリファレンスとか,
libcの逆アセンブルを見ればいいんじゃないか?あとはggれ

83 :
>>82
無知乙

84 :
ページのフラグ変更すればいいんじゃね?

85 :
>>82
>PICのアーキテクチャ見てみろ.heap……ってか,
>レジスタ以外にメモリあるか? 別途メモリとか実装すればそれっぽいことはできるかもな.
「PIC heap malloc」とかでぐぐってみ?
>そもそもシングルタスクなのにメモリ空間を分ける意味がわからないが.
ハーバードアーキテクチャとタスクがどうこうは関係ない話だが? 本気で無知乙だな。

86 :
初心者スレで、初心者を愚弄する奴は来るな!

87 :
初心者スレってバカが知ったかでアドバイスするスレだったのか?

88 :
>>86
「初心者を愚弄」って、>>82
>それとも本気で無知乙か?w
みたいなこと?

89 :
32ビットのフラットメモリモデルの場合なのですが、アドレスを記述する際にセレクタを
指定しなかった場合、実行時に使われるセレクタはDSで合ってますか?

90 :
普通のアクセスは。
EIPによる命令フェッチはCSなのと、PUSHやPOPでのESPによるアクセスはSSだけど、
他に例外はあったかな。

91 :
ebpはssだろうし
ストリング命令でのdiはesだと思う。

92 :
フラットモデルは
CS==DS==SS==ESというキチガイモデル
LDTでプロセス毎のメモリ空間を確保
まあお陰で楽と言えば楽なんだが

93 :
>>90-92
大変よくわかりました、ありがとうございます

94 :
秋に基本情報を受けようと思ってるのでCASL2の勉強をしようと思うのですが、お勧めの参考書かサイトないでしょうか?
あとまったく知識ゼロの状態でCASL2を勉強して合格しようと思ったら
どれぐらいの期間かかりますか?(CASL以外の時間は含まず)

95 :
>>94
何かひとつ実際のアセンブラが使えればCASLなんて屁でもないので
CASLの勉強なんて無駄なので止めなさい。
今使ってるPCのアセンブラでも勉強したほうがはるかに有意義だから。

96 :
>>94
人による、としか。
CASL2自体を覚えるのはそんなに掛からないよ。
早い人ならそもそも試験会場で問題冊子に書かれた仕様と問題文から覚えちゃう。
苦手な人でも、一年やって仕様自体が頭に入ってない人は稀だろう。
問題となるのはそこからの応用力だから、そればかりは本当にその人次第だねえ。
応用できちゃう人は覚えた瞬間からほぼ全問解けるだろうが
応用の苦手な人は問題集で色んなパターンを覚えるしかない。

97 :
レスありがとうございます
>>95
そうなんですか…CASLが勉強時間も短くて、試験にも通りやすいと聞いたので
選択しようと思ってたのですが、今後役に立たない知識ならば別のを選択したほうがいいですかね…
>>96
試験本番で仕様を読んで合格する人ってすごいですね…

98 :
>>97
まあ、合格するまではやってみてもいいんじゃね

99 :
すみません最近勉強しだした、ど素人なんですが
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

100read 1read
1read 100read
TOP カテ一覧 スレ一覧 2ch元 削除依頼
フリーソフトなどに使われる言語は? (237)
★★Java質問・相談スレッド160★★ (529)
【Java】DIコンテナって本当に便利か? (461)
Borlandにはやられた... (367)
プログラムに詳しくなりたい (508)
【初心者歓迎】C/C++室 Ver.82【環境依存OK】 (962)
--log9.info------------------
Classillaは最後の砦なのか? ver.2 (213)
初代 G4 AGP Graphics 専用 4台目 (200)
MacBook Air 164枚目 _/ (764)
iOSアプリ 個人開発者の雑談スレ10 (454)
[SDK]iPhoneアプリ開発初心者質問箱32[touch][iPad] (666)
iMac part 172 (777)
MacOSX86の夢を語ろう!第39夜 (363)
Mac mini Part114 (883)
【2014年夏リリース予定】Graffitipot for Mac ★4 (394)
MacBook Pro with Retina Display (Part 31) (931)
OSXのウプデータンが出てるよ(;´Д`)ハァハァ 【97】 (373)
【Mac用】【AGP PCI PCIe】ビデオカード総合 5枚目 (552)
iPad Part160 (458)
Mac Pro 85 (954)
VMWare Fusion for Mac Part 25 (290)
[S] Scrivenerで物書きを楽しもう - 2 - (206)
--log55.com------------------
★2ch.scは何故失敗したのか
★クロール批判要望スレ
★削ジェンヌに文句ある人集合
★迷惑行為報告担当 - 小さな親切募集中 2
★2ch.scへの要望スレ Part3
★かっこう観測所
★スレ立て人キャップ
★2ch.scニュース系板観測所