アセンブラの宿題質問スレ
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/10/18(水) 00:04:05アセンブラ好きのお兄さんに尋ねるスレ。
・必ずCPUの名前を書くこと!
・情報を小出しにしない。書ける情報は全て書いた方が得だよ。
0449デフォルトの名無しさん
2007/03/27(火) 13:48:230450デフォルトの名無しさん
2007/03/30(金) 18:28:58どこに仮定法の要素が有るんだw
0451デフォルトの名無しさん
2007/04/11(水) 00:25:42CMP DWORD PTR DS:[EAX-C],1
の意味がわかりません。
EAXからCを引く???
0452デフォルトの名無しさん
2007/04/11(水) 08:13:19EAXって名前からすると IA32だとすると
[EAX-0Ch] を省略表示したんだろうなと、
0453デフォルトの名無しさん
2007/04/11(水) 19:43:27EAX-0Chって結局どこのアドレス指すんでしょうか?
+ならまだしも-ってどこになるんだろう
0454デフォルトの名無しさん
2007/04/11(水) 19:47:270455デフォルトの名無しさん
2007/04/11(水) 20:43:48別にマイナスでもいいじゃん。
最適化のため先にポインタをインクリメントしているかもしれないし
スタック上の変数かもしれないし。
0456デフォルトの名無しさん
2007/04/11(水) 21:19:49C言語なら
eflags.zero_flag = (*(unsigned long*)(eax-0xc) == 1)
0457デフォルトの名無しさん
2007/04/12(木) 08:42:59おいおい。
0458デフォルトの名無しさん
2007/04/12(木) 12:18:49PUSH
RET
0459デフォルトの名無しさん
2007/04/13(金) 00:30:171語8ビットとして、1の補数の求め方がわかりません。
00110101なら11001010を作りたいのです。プロセッサの演算命令は
DEC,INC,SHL,SHR.ROTL,ROTR,ADD,SUBのみ使えます。
おながいします。
0460デフォルトの名無しさん
2007/04/13(金) 00:36:03255から引け。
0461デフォルトの名無しさん
2007/04/13(金) 00:41:15本人マジだったら悪いけど
0462デフォルトの名無しさん
2007/04/13(金) 04:30:550463デフォルトの名無しさん
2007/04/13(金) 06:02:290464デフォルトの名無しさん
2007/04/16(月) 22:38:28「9000H番地の1バイトデータをa、9001H番地の1バイトデータをbとしたとき、
a×bを16ビットで求め、下位1バイトを9002H番地、上位1バイトを9003H番地に
格納するプログラミングを作りなさい。またこのプログラムの実行時間を計算しなさい。」
という問題がわかりません。
どなたか教えて頂けないでしょうか?
0465デフォルトの名無しさん
2007/04/17(火) 00:57:54だれかZ80マスターいませんかー?
0466デフォルトの名無しさん
2007/04/17(火) 01:03:330467デフォルトの名無しさん
2007/04/17(火) 01:12:46何でもいいから適当な例を一つか二つほど晒してくれ。
8085アセンブリ言語の文法知らんから始まらない。
乗算自体は難しいことはないんだが。
0468デフォルトの名無しさん
2007/04/17(火) 01:23:220469デフォルトの名無しさん
2007/04/17(火) 01:29:160470464
2007/04/17(火) 01:30:54このような例で大丈夫でしょうか。。。
「1から10まで加算して結果を8085H番地のメモリに記憶する。」
.8085
ASEG
ORG 800H
;
MVI A,0
MVI B,0
MVI C,10
LOOP: INR B
ADD B
DCR C
JNZ LOOP
STA 8085H
HLT
;
END
0471デフォルトの名無しさん
2007/04/17(火) 02:59:25取り敢えずHLレジスタに0を入れて、DEレジスタにaを入れてb回足せばいい。
擬似コードだとこんな感じ。
HL = 0
D = 0
E = [9000h]
C = [9001h]
loop:
HL += DE
--C
if NZ goto loop
[9002h] = HL
しかし、「プログラミングを作りなさい」って……
0472デフォルトの名無しさん
2007/04/17(火) 03:14:16てっきりないと思って苦労してたorz
0473デフォルトの名無しさん
2007/04/17(火) 05:25:38lda 09001h
mov e,a
mvi d,0 ; de<--(9001h)の値
lda 09000h
mov c,a
mvi b,0 ; bc<--(9000h)の値
; ここから掛け算:HL <-- HL*DE (16bit)
lxi h,0000
mvi a,10h
LBL1: dad h
xchg
dad h
xchg
jnc LBL2
dad b
LBL2: dcr a
jnz 0108
shld 09002h ; 答
0474473
2007/04/17(火) 05:35:578bitの数の場合最初の8回は足し算が起こらないからムダだけど、16bit同士の掛け算にも
そのまま応用できる。aをb回足す手法と比べて、bが10hより大きいときループ回数の点で
有利、という利点がある。これは実際に8085のclibに使われている手法です。
0475デフォルトの名無しさん
2007/04/17(火) 10:36:220476デフォルトの名無しさん
2007/04/17(火) 12:42:42工業高校か高専ってとこじゃない?
学校の宿題なら>>473の方法でいいと思うけど、実際の現場ではニブルXニブルの
look up tableを使うんじゃないかな?
まあ8085使ったことないんで知らないけど。
ちなみに8085は無くなってないんじゃないかな。
0477デフォルトの名無しさん
2007/04/17(火) 12:56:45>>473の方法で8x8を書くのに比べて速度出すのも難しい。
コード量は増えるしね
0478473
2007/04/17(火) 18:00:360479デフォルトの名無しさん
2007/04/17(火) 22:23:39を求め、連続する2語のメモリ上におけ。
という問題です。今期からはじめたばかりです。
もし出来れば
$a : 100
$b : -10
$sum1 : 0
&sum2 : 0
から続けれる形でお願いします。よろしくお願いします、。
0480デフォルトの名無しさん
2007/04/17(火) 22:29:080481デフォルトの名無しさん
2007/04/17(火) 22:31:32東工大情報工学科3年情報実験第3履修生乙wwwww
0482デフォルトの名無しさん
2007/04/17(火) 22:58:380483479
2007/04/17(火) 23:16:070484デフォルトの名無しさん
2007/04/17(火) 23:17:30ハライテェw
0485479
2007/04/17(火) 23:19:230486デフォルトの名無しさん
2007/04/17(火) 23:26:03てかあまり自分の大学名とか言わないようにww
0487デフォルトの名無しさん
2007/04/17(火) 23:26:35gas形式でx86だね?
0488479
2007/04/17(火) 23:32:38ADDとかADDIやら使う形式のOSです。。
0489デフォルトの名無しさん
2007/04/17(火) 23:33:16480 = 484 != 481
俺はただ単純に>483がツボっただけ
0490デフォルトの名無しさん
2007/04/17(火) 23:34:38仮に分からないとしても。(このレベルがわからないってかなり重傷だが)
だってそれなりにプライドあるだろ?
工業高校の生徒だって解ける問題だぞ
0491464
2007/04/17(火) 23:40:17詳しい解答、解説ありがとうございました。
とても助かりました。
>>476さん
やっぱり流行らないことなんですね。
一応地方の大学なんです..。
0492デフォルトの名無しさん
2007/04/17(火) 23:41:22俺は大学行ってないからわからんが、大卒だからこそ全然
書けないのばっか。ハードには一切触れないとこも多いらしい
ペン持って理論ばっか勉強しているんだろう。
てか490は馬鹿にすることで学歴コンプ解消しようとしてんだろ?
0493デフォルトの名無しさん
2007/04/17(火) 23:48:35っていうか、学歴コンプなんて今日日流行らないよ。
自分より優れている人間は素直にリスペクトした方が精神衛生上楽だし健全でしょ。
っていうか、煽り抜きで、本当に東工大で>>479がわからんとしたらかなり痛いと思うよ。
0494デフォルトの名無しさん
2007/04/17(火) 23:54:250495デフォルトの名無しさん
2007/04/17(火) 23:56:04あれ、なんだかわかる人いる?
0496479
2007/04/18(水) 00:01:180497デフォルトの名無しさん
2007/04/18(水) 00:09:26mov al, [a]
imul byte [b]
mov [sum1], al
mov [sum2], ah
だが俺はgas使えん。
0498デフォルトの名無しさん
2007/04/18(水) 00:10:010499デフォルトの名無しさん
2007/04/18(水) 00:13:250500・∀・)っ-○◎●
2007/04/18(水) 00:23:35gcc hoge.c -S
0501デフォルトの名無しさん
2007/04/18(水) 00:29:250502デフォルトの名無しさん
2007/04/18(水) 00:51:30a: dc.b 100
b: dc.b -10
.bss
sum1: ds.b 1
sum2: ds.b 1
.text
kkzn:
movem.l d0-d1,-(sp)
move.b a(pc), d0
move.b b(pc), d1
muls d1, d0
move.w d0, sum1(pc)
movem.l (sp)+, d0-d1
rts
.end
0503デフォルトの名無しさん
2007/04/18(水) 03:30:550504デフォルトの名無しさん
2007/04/18(水) 18:46:24今はwindowsが一番メジャーだからいいけどさ、
必死で覚えても仮にwindowsがなくなってmacが主流になったら
またアセンブリmac.verを覚えなくちゃいけないわけでしょ?そこらへんどうなのよ
0505デフォルトの名無しさん
2007/04/18(水) 18:51:21そして、毎年チップが新しく作られる都度、命令も増えている。
でもさ、それがアセンブラなんだ。
0506デフォルトの名無しさん
2007/04/18(水) 21:57:36パソコンに限って言えばアセンブラで書く(書ける)処理はかなり限定されるし。
0507デフォルトの名無しさん
2007/04/18(水) 22:12:57じゃあお前さんはGASでもMASMでも書けるかい?無理だろうよ
0508デフォルトの名無しさん
2007/04/18(水) 22:16:460509デフォルトの名無しさん
2007/04/18(水) 22:38:430510・∀・)っ-○◎●
2007/04/18(水) 22:45:06Cって最高のトランスレータだと思いませんか
0511デフォルトの名無しさん
2007/04/18(水) 22:51:300512デフォルトの名無しさん
2007/04/18(水) 23:26:54別に片方わかってりゃ GAS でも MASM でも書けるだろ。
習熟にはちょっと時間が必要かもしれないけど、無理ってことはないと思うぞ。
>>510
「最低の」の間違いだろ? (w
0513デフォルトの名無しさん
2007/04/18(水) 23:27:17ダントツで効率が悪いよな 将来性がないっていうの?
その分簡単だからいいんじゃね
まぁ長年使っていけるプログラムなんてそうないけどね
0514・∀・)っ-○◎●
2007/04/18(水) 23:53:31トランスレータかけようと思ったら全部展開せにゃならんよ、たしか
性能の要求と人件費を天秤にかければ
アセンブリ言語できる技術者の需要なんて糞みたいなもんだよ、
月100万でロートル数人雇うより、CPUメーカー謹製の最適化
コンパイラ買った方が圧倒的に安上がりだし。
最近はIntrinsicsでCでも低レベルの部分触れるようになってるから絶滅の一途。
読んで理解できるに越したことはないけど、書ける必要は全くないね。
命令の並びをどうこうするよりもアルゴリズム自体の改善で性能改善できるケースも多い。
そしてそれは構造化言語のほうが圧倒的にやりやすい。
>その分簡単だからいいんじゃね
何がどう簡単なの?機械が解読・変換しやすいって意味?それなら納得。
0515デフォルトの名無しさん
2007/04/19(木) 00:37:43どっちかしか書けないの? 頭を切り替えられない馬鹿?
それとも、アルファベットを見ただけで拒否反応を起こしちゃう英語嫌いと同じ手合い?
0516デフォルトの名無しさん
2007/04/19(木) 00:40:07違う命令覚えなきゃいけないとはいっても、結局やることはメモリかレジスタを
弄るだけだからすぐに慣れちゃうし。
どうせ資料見ながら作業するから暗記する気最初から無かったりする。
命令なんか使ってりゃ自然に覚えるし、覚えなくてもさほど困らない。
0517デフォルトの名無しさん
2007/04/19(木) 04:50:200518デフォルトの名無しさん
2007/04/19(木) 06:51:30今時 アセンブラ = 高速化 だけ で語ってる奴がいるとは...
0519デフォルトの名無しさん
2007/04/19(木) 18:44:26PIC16F84Aを使っているのですが…
CALLでサブルーチンとしてジャンプした後、RETURNせずに
スタックから戻り番地ひとつ消してサブルーチン外にGOTOすることってできませんか?
0520デフォルトの名無しさん
2007/04/19(木) 18:59:47適当なレジスタにPOPできない?
z80辺りだと常套手段だけど。
0521デフォルトの名無しさん
2007/04/19(木) 19:12:40適切な答えが欲しければやりたいことをもう少し具体的に詳細に書いた方がいいと思う。
例えば「スタックから戻り番地ひとつ消してサブルーチン外にGOTO」とあるが、
これは常にそういう動作をしたいの?
それとも条件によっては呼び出し元に戻りたい場合もあるわけ?
まあ、個人的にはそもそも何かトンチンカンなことをやりたがってるような
印象を受けるけど。
まともな質問ができない人ってのは、自分で自分のやりたいことをよく把握してない
場合が多いからね。
0522デフォルトの名無しさん
2007/04/19(木) 19:16:39push/popとか他のスタック操作命令もない。
だから出来ないよ。
基本的に専門系スレには知識も技術も無いのに、
妙な口出しするのが良く出没するけど、それはどこでもそうだから気にしないように。
0523デフォルトの名無しさん
2007/04/19(木) 19:20:580524デフォルトの名無しさん
2007/04/19(木) 19:25:09そもそもCALLやスタックの操作は手段に過ぎず目的ではないはず。
0525デフォルトの名無しさん
2007/04/19(木) 19:29:31アセンブラで書く時は良く使うテクニックだからやりたい事は良く判るよ。
PICの場合は、スタックポインタが無いし、スタックは循環するから
この場合、単にgotoで飛んでしまえば問題ない。
スタックの勘定は合わないけどね。 ただそれだけだから。
0526デフォルトの名無しさん
2007/04/19(木) 19:33:20それの方法がよくわからなくて…
>>522
ああ、やっぱりそうなんですか。
POP動作はRETURNとRETLWしか使えないんですね…
素直にRETLW使います。
0527デフォルトの名無しさん
2007/04/19(木) 19:37:43あ、飛ばしてOKなんですか?
スタック循環させてかまわないんですね…
今後PIC以外でアセンブリやるときに、こういうコトする癖がつくとマズい気もしますが…
0528デフォルトの名無しさん
2007/04/19(木) 19:41:41飛ばしていいけど、戻れるのはmain と同じレベルね。
一つ前とか2つ前というような戻り方は出来ない。
他のCPUで言えばスタックポインタの初期化するのと同じね。
0529デフォルトの名無しさん
2007/04/19(木) 20:21:48おいおいどう考えても>>519みたいのは「よく使うテクニック」なんかじゃないだろう。
call routine
ret
を
jmp routine
に置き換えるような、構造化プログラミングの作法に反しない最適化なら
ごく普通のテクニックだと思うけど。
っていうか、519みたいな手段をとる目的もわからずによく回答できるよなこのスレの連中は。
0530デフォルトの名無しさん
2007/04/19(木) 20:48:210531デフォルトの名無しさん
2007/04/19(木) 21:50:35アセンブラで書く理由は、それが低レベルだから。
低レベルで書くから可能な手法があって、その一つがコレってだけの事。
0532デフォルトの名無しさん
2007/04/20(金) 12:09:36ただ、まともにコンテクスト保存しようとしたら大変だから代替手段として
飛ばしリターン。 普通に使うと思うが?
0533デフォルトの名無しさん
2007/04/20(金) 16:23:41アセンブラで再帰関数っぽいものは如何表現すればよいでしょう。
Cで書くと
int x=10;
int y=9;
int saiki(x,y){
if (x=0) return (y+4)
if (x>0) return (saiki(x-1,y))
}
みたいなのを作りたいぉ。
0534デフォルトの名無しさん
2007/04/20(金) 16:30:35PICのようにスタックが無かったら再帰は無理だが
汎用CPUなら、再帰はそのままCALL/JSRで呼び出せばいいだけ
0535デフォルトの名無しさん
2007/04/20(金) 18:41:28>>533の質問の肝は、要はローカル変数や引数や返り値を再帰呼び出しが
可能なような実装にするにはどうしたらいいかってことだろうに。
俺は悪いけどそんな複雑なことやったことないんで知らない。
まあ、かなり石のアーキテクチャに依存する問題のような気がするけど。
0536デフォルトの名無しさん
2007/04/20(金) 18:47:31スタックがもったいないので再帰なんて使うな。
0537デフォルトの名無しさん
2007/04/20(金) 19:47:12引数や帰り値は、レジスタ渡しでいいだろう
普通に書けば問題ない。
この場合、末尾再帰だからレジスタが壊れる事を心配する必要さえない
0538デフォルトの名無しさん
2007/04/20(金) 19:50:28LAD GR7, STK
LAD GR1, 10
ST GR1, 0, GR7
LAD GR7, 1, GR7
CALL SIGMA
; DREG ='*END*'
RET
SIGMA LAD GR7, 1, GR7
XOR GR0, GR0
LD GR1, -2, GR7
JZE SKP0
ST GR1, -1, GR7
LAD GR1, -1, GR1
ST GR1, 0, GR7
LAD GR7, 1, GR7
CALL SIGMA
ADDL GR0, -1, GR7
SKP0 LAD GR7, -2, GR7
RET
STK DS 100
END
0539デフォルトの名無しさん
2007/04/20(金) 19:54:53アセンブリ言語でソートなどを書かなければなりません。
equはどうやって使うんですか?
#defineのようなものだと調べて知りましたが。
N: equ 80H
とすると80(16進法)番地にNという整数が用意されることは分かりましたが
どうやって値を設定するかが分かりません。
これが分かればあとはBccで分岐させるやりかたが分かればいいのですが。
0540デフォルトの名無しさん
2007/04/20(金) 19:55:40http://upc.ice.ous.ac.jp/~uejima/kue2-webasm/
ここにウェブアセンブラがあります。
もしよかったら使ってください
0541デフォルトの名無しさん
2007/04/20(金) 20:03:54http://www.arch.ce.hiroshima-cu.ac.jp/~ochi/kuechip2/umult4x4.asm.txt
これを見ると、
ld acc,N
で acc に 080h が入るんじゃないの?
0542デフォルトの名無しさん
2007/04/20(金) 20:18:25あと、分岐の実験中ですが
ld acc, 0
lp1: add acc, 1
cmp acc, xxx
bn lp1
end
このプログラムがxxx=100の時は動くのにxxx=150の時は動きません。
どうしてですかね
0543デフォルトの名無しさん
2007/04/20(金) 20:43:4116進数の80ってことだろ。たとえばcbhと書いたら16進数字か識別子か区別が
つきにくくなるから、先頭に0を書くこともある。
>このプログラムがxxx=100の時は動くのにxxx=150の時は動きません。
2の補数表現って知ってるか?
8ビットだと10進数で127までは正の数だが、128以上だと負の数扱いになる。
0544デフォルトの名無しさん
2007/04/20(金) 20:49:24つーか、チミには相談できる友達はいないのかい
0545デフォルトの名無しさん
2007/04/20(金) 20:52:11なるほど。
アセンブラが分かる友達はさすがにいないので・・・
おれもrubyしか分からない。Cすら不明
0546デフォルトの名無しさん
2007/04/20(金) 20:55:49まあ宿題スレだから
それに>539宿題丸投げってわけでもないからね
0547デフォルトの名無しさん
2007/04/20(金) 23:23:21質問ですが
ld acc, [j]
と
ld acc, (j)
はどう違いますか?
たぶんですが、[]はその番地にある値、()はその値そのもの
という解釈でよろしいでしょうか?
つまり()は即値代入、[]は、絶対アドレス代入ということで。
0548デフォルトの名無しさん
2007/04/20(金) 23:37:21まあとりあえず、落ち着いて>>1をよく読もうぜ。
■ このスレッドは過去ログ倉庫に格納されています