トップページ⇒tech
1001コメント328KB

アセンブラの宿題質問スレ

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2006/10/18(水) 00:04:05
アセンブラの宿題ができないときに、
アセンブラ好きのお兄さんに尋ねるスレ。

・必ずCPUの名前を書くこと!
・情報を小出しにしない。書ける情報は全て書いた方が得だよ。
0449デフォルトの名無しさん2007/03/27(火) 13:48:23
ディスレキシア?
0450デフォルトの名無しさん2007/03/30(金) 18:28:58
>>448
どこに仮定法の要素が有るんだw
0451デフォルトの名無しさん2007/04/11(水) 00:25:42
今日はじめたばかりでまださっぱり意味がわかりませんが
CMP DWORD PTR DS:[EAX-C],1

の意味がわかりません。

EAXからCを引く???

0452デフォルトの名無しさん2007/04/11(水) 08:13:19
俺も判らん。 何のCPUで、どこで見た結果?
EAXって名前からすると IA32だとすると

 [EAX-0Ch] を省略表示したんだろうなと、 
0453デフォルトの名無しさん2007/04/11(水) 19:43:27
Intel Windowsアプリです。

EAX-0Chって結局どこのアドレス指すんでしょうか?

+ならまだしも-ってどこになるんだろう
0454デフォルトの名無しさん2007/04/11(水) 19:47:27
EAXの値から12引いた数値のアドレス。
0455デフォルトの名無しさん2007/04/11(水) 20:43:48
>>453
別にマイナスでもいいじゃん。
最適化のため先にポインタをインクリメントしているかもしれないし
スタック上の変数かもしれないし。
0456デフォルトの名無しさん2007/04/11(水) 21:19:49
>>451
C言語なら
eflags.zero_flag = (*(unsigned long*)(eax-0xc) == 1)
0457デフォルトの名無しさん2007/04/12(木) 08:42:59
>>456
おいおい。
0458デフォルトの名無しさん2007/04/12(木) 12:18:49
PUSH
PUSH
RET
0459デフォルトの名無しさん2007/04/13(金) 00:30:17
質問です。
1語8ビットとして、1の補数の求め方がわかりません。
00110101なら11001010を作りたいのです。プロセッサの演算命令は
DEC,INC,SHL,SHR.ROTL,ROTR,ADD,SUBのみ使えます。
おながいします。
0460デフォルトの名無しさん2007/04/13(金) 00:36:03
>>459
255から引け。
0461デフォルトの名無しさん2007/04/13(金) 00:41:15
なんか痛い質問だなw
本人マジだったら悪いけど
0462デフォルトの名無しさん2007/04/13(金) 04:30:55
ANDもORもXORも無いの? どんな石なんだろ?
0463デフォルトの名無しさん2007/04/13(金) 06:02:29
4bitマイコンであるよ subr #n っていう 定数-acc の命令で not の代用させるのは
0464デフォルトの名無しさん2007/04/16(月) 22:38:28
質問失礼します。最近8085アセンブリ言語プログラミングを習い始めた者なのですが、
「9000H番地の1バイトデータをa、9001H番地の1バイトデータをbとしたとき、
a×bを16ビットで求め、下位1バイトを9002H番地、上位1バイトを9003H番地に
格納するプログラミングを作りなさい。またこのプログラムの実行時間を計算しなさい。」
という問題がわかりません。
どなたか教えて頂けないでしょうか?

0465デフォルトの名無しさん2007/04/17(火) 00:57:54
たぶんね、大昔のi8085を知っている人は少ないと思う。

だれかZ80マスターいませんかー?
0466デフォルトの名無しさん2007/04/17(火) 01:03:33
昔は使いこなせてたけど、いまはもうだいぶ忘れちまったよ。>Z80
0467デフォルトの名無しさん2007/04/17(火) 01:12:46
>>464
何でもいいから適当な例を一つか二つほど晒してくれ。
8085アセンブリ言語の文法知らんから始まらない。

乗算自体は難しいことはないんだが。
0468デフォルトの名無しさん2007/04/17(火) 01:23:22
つーか8085てシフト命令ないのかよ...
0469デフォルトの名無しさん2007/04/17(火) 01:29:16
習い始めの宿題なら足し算+ループでいいじゃん。
04704642007/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
>>470
取り敢えず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
16bit加算があれば楽だけどって思ってたんだが、あったんだな・・・
てっきりないと思って苦労してたorz
0473デフォルトの名無しさん2007/04/17(火) 05:25:38
>>464 こんなのでどう?
    lda 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  ; 答
04744732007/04/17(火) 05:35:57
解説:シフトしながら1が立っているときだけ足すのが掛け算の常套手段なのね。
8bitの数の場合最初の8回は足し算が起こらないからムダだけど、16bit同士の掛け算にも
そのまま応用できる。aをb回足す手法と比べて、bが10hより大きいときループ回数の点で
有利、という利点がある。これは実際に8085のclibに使われている手法です。
0475デフォルトの名無しさん2007/04/17(火) 10:36:22
石自体なくなってるのに、何に使うんだろう? 専門学校の課題、っていうだけ?
0476デフォルトの名無しさん2007/04/17(火) 12:42:42
こんな流行らないこと教える専門学校ってある?
工業高校か高専ってとこじゃない?

学校の宿題なら>>473の方法でいいと思うけど、実際の現場ではニブルXニブルの
look up tableを使うんじゃないかな?
まあ8085使ったことないんで知らないけど。

ちなみに8085は無くなってないんじゃないかな。
0477デフォルトの名無しさん2007/04/17(火) 12:56:45
ニブルXニブルで 8x8の掛け算でも4回のテーブル引きと加算が必要になるから
>>473の方法で8x8を書くのに比べて速度出すのも難しい。
コード量は増えるしね
04784732007/04/17(火) 18:00:36
無くなってはないけど、生産中止になってだいぶ経つ。俺の客は弁当箱作る度に秋葉で買朝・・
0479デフォルトの名無しさん2007/04/17(火) 22:23:39
メモリ上におかれた二つの2の補数表示整数(8ビット)の積(16ビット)
を求め、連続する2語のメモリ上におけ。
という問題です。今期からはじめたばかりです。

もし出来れば
$a : 100
$b : -10
$sum1 : 0
&sum2 : 0
から続けれる形でお願いします。よろしくお願いします、。
0480デフォルトの名無しさん2007/04/17(火) 22:29:08
>>1のテンプレ2行くらい嫁
0481デフォルトの名無しさん2007/04/17(火) 22:31:32
>>479
東工大情報工学科3年情報実験第3履修生乙wwwww
0482デフォルトの名無しさん2007/04/17(火) 22:58:38
最近は日本語読めない奴でも東工大入れるのか
04834792007/04/17(火) 23:16:07
リナックスです!
0484デフォルトの名無しさん2007/04/17(火) 23:17:30
そのネタまじ秀逸
ハライテェw
04854792007/04/17(火) 23:19:23
>>481 ちなみに専門学校生です。
0486デフォルトの名無しさん2007/04/17(火) 23:26:03
480=481=484は何故そこまでいじめるww
てかあまり自分の大学名とか言わないようにww
0487デフォルトの名無しさん2007/04/17(火) 23:26:35
>>479
gas形式でx86だね?
04884792007/04/17(火) 23:32:38
>>487すみません、わかりませんが、先の書き出しの形式で、
ADDとかADDIやら使う形式のOSです。。
0489デフォルトの名無しさん2007/04/17(火) 23:33:16
>>486
480 = 484 != 481
俺はただ単純に>483がツボっただけ
0490デフォルトの名無しさん2007/04/17(火) 23:34:38
さすがに東工大の学生なら>>479のレベルの質問はしないだろう。
仮に分からないとしても。(このレベルがわからないってかなり重傷だが)
だってそれなりにプライドあるだろ?

工業高校の生徒だって解ける問題だぞ
04914642007/04/17(火) 23:40:17
>>471さん>>473さん
詳しい解答、解説ありがとうございました。
とても助かりました。

>>476さん
やっぱり流行らないことなんですね。
一応地方の大学なんです..。
0492デフォルトの名無しさん2007/04/17(火) 23:41:22
今の大学生なんてそんなもののような気がするぞ。
俺は大学行ってないからわからんが、大卒だからこそ全然
書けないのばっか。ハードには一切触れないとこも多いらしい
ペン持って理論ばっか勉強しているんだろう。

てか490は馬鹿にすることで学歴コンプ解消しようとしてんだろ?
0493デフォルトの名無しさん2007/04/17(火) 23:48:35
誰も馬鹿にしてないと思うんだが。。
っていうか、学歴コンプなんて今日日流行らないよ。
自分より優れている人間は素直にリスペクトした方が精神衛生上楽だし健全でしょ。

っていうか、煽り抜きで、本当に東工大で>>479がわからんとしたらかなり痛いと思うよ。
0494デフォルトの名無しさん2007/04/17(火) 23:54:25
どこの学校か関係なしに自分の習ってるCPUの名前すらわからん様ではいかんわ。
0495デフォルトの名無しさん2007/04/17(火) 23:56:04
どっかで見たような、それでいて思いだせない文法。
あれ、なんだかわかる人いる?
04964792007/04/18(水) 00:01:18
gas形式でx86です・・
0497デフォルトの名無しさん2007/04/18(水) 00:09:26
x86なら話は早い。

mov al, [a]
imul byte [b]
mov [sum1], al
mov [sum2], ah

だが俺はgas使えん。
0498デフォルトの名無しさん2007/04/18(水) 00:10:01
て言うか、勉強もせずににちゃんに書き込む時点でアウトじゃね?
0499デフォルトの名無しさん2007/04/18(水) 00:13:25
ふつう勉強しない奴が2chにくるんだろ
0500・∀・)っ-○◎●2007/04/18(水) 00:23:35
もうこれでいいじゃん
gcc hoge.c -S
0501デフォルトの名無しさん2007/04/18(水) 00:29:25
コンパイラの性能については詳しくないが、機械翻訳だと冗長なコード吐きそうな悪寒。
0502デフォルトの名無しさん2007/04/18(水) 00:51:30
.data
a: 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:55
東工大とか神じゃんか・・・
0504デフォルトの名無しさん2007/04/18(水) 18:46:24
アセンブリ言語ってwindowsはwindowsで、macはmacで別物なんでしょ
今はwindowsが一番メジャーだからいいけどさ、
必死で覚えても仮にwindowsがなくなってmacが主流になったら
またアセンブリmac.verを覚えなくちゃいけないわけでしょ?そこらへんどうなのよ
0505デフォルトの名無しさん2007/04/18(水) 18:51:21
そのまえに、アセンブラだと、GASとMASMで既に表記方法が違う。
そして、毎年チップが新しく作られる都度、命令も増えている。

でもさ、それがアセンブラなんだ。
0506デフォルトの名無しさん2007/04/18(水) 21:57:36
どれか一つきちんと覚えればやってることはどれも大して変わらないし。
パソコンに限って言えばアセンブラで書く(書ける)処理はかなり限定されるし。
0507デフォルトの名無しさん2007/04/18(水) 22:12:57
>>506
じゃあお前さんはGASでもMASMでも書けるかい?無理だろうよ
0508デフォルトの名無しさん2007/04/18(水) 22:16:46
片方が書ければ、トランスレータ作っておいて、自分で書くスタイル内ならそれで変換すりゃいい
0509デフォルトの名無しさん2007/04/18(水) 22:38:43
トランスレータ書ける奴ならこんなところに質問しない
0510・∀・)っ-○◎●2007/04/18(水) 22:45:06
> トランスレータ

Cって最高のトランスレータだと思いませんか
0511デフォルトの名無しさん2007/04/18(水) 22:51:30
>>1の注意書きも読めない奴がほとんどだからな
0512デフォルトの名無しさん2007/04/18(水) 23:26:54
>>507
別に片方わかってりゃ GAS でも MASM でも書けるだろ。

習熟にはちょっと時間が必要かもしれないけど、無理ってことはないと思うぞ。

>>510
「最低の」の間違いだろ? (w
0513デフォルトの名無しさん2007/04/18(水) 23:27:17
まぁあれだな、なんだかんだでアセンブラはプログラムの中では
ダントツで効率が悪いよな 将来性がないっていうの?
その分簡単だからいいんじゃね
まぁ長年使っていけるプログラムなんてそうないけどね
0514・∀・)っ-○◎●2007/04/18(水) 23:53:31
GASのコードって慣習的にCプリプロセッサマクロ使うから
トランスレータかけようと思ったら全部展開せにゃならんよ、たしか

性能の要求と人件費を天秤にかければ
アセンブリ言語できる技術者の需要なんて糞みたいなもんだよ、
月100万でロートル数人雇うより、CPUメーカー謹製の最適化
コンパイラ買った方が圧倒的に安上がりだし。
最近はIntrinsicsでCでも低レベルの部分触れるようになってるから絶滅の一途。
読んで理解できるに越したことはないけど、書ける必要は全くないね。

命令の並びをどうこうするよりもアルゴリズム自体の改善で性能改善できるケースも多い。
そしてそれは構造化言語のほうが圧倒的にやりやすい。


>その分簡単だからいいんじゃね
何がどう簡単なの?機械が解読・変換しやすいって意味?それなら納得。
0515デフォルトの名無しさん2007/04/19(木) 00:37:43
>>507
どっちかしか書けないの? 頭を切り替えられない馬鹿?
それとも、アルファベットを見ただけで拒否反応を起こしちゃう英語嫌いと同じ手合い?
0516デフォルトの名無しさん2007/04/19(木) 00:40:07
コード・スニペット使うからアセンブリ言語で書いても昔ほど効率は悪くない。
違う命令覚えなきゃいけないとはいっても、結局やることはメモリかレジスタを
弄るだけだからすぐに慣れちゃうし。
どうせ資料見ながら作業するから暗記する気最初から無かったりする。
命令なんか使ってりゃ自然に覚えるし、覚えなくてもさほど困らない。
0517デフォルトの名無しさん2007/04/19(木) 04:50:20
一応ここ宿題スレなんだよな
0518デフォルトの名無しさん2007/04/19(木) 06:51:30
>>514
今時 アセンブラ = 高速化 だけ で語ってる奴がいるとは...
0519デフォルトの名無しさん2007/04/19(木) 18:44:26
せっかくの宿題スレなので…
PIC16F84Aを使っているのですが…

CALLでサブルーチンとしてジャンプした後、RETURNせずに
スタックから戻り番地ひとつ消してサブルーチン外にGOTOすることってできませんか?
0520デフォルトの名無しさん2007/04/19(木) 18:59:47
>>519
適当なレジスタにPOPできない?
z80辺りだと常套手段だけど。
0521デフォルトの名無しさん2007/04/19(木) 19:12:40
>>519
適切な答えが欲しければやりたいことをもう少し具体的に詳細に書いた方がいいと思う。

例えば「スタックから戻り番地ひとつ消してサブルーチン外にGOTO」とあるが、
これは常にそういう動作をしたいの?
それとも条件によっては呼び出し元に戻りたい場合もあるわけ?

まあ、個人的にはそもそも何かトンチンカンなことをやりたがってるような
印象を受けるけど。
まともな質問ができない人ってのは、自分で自分のやりたいことをよく把握してない
場合が多いからね。
0522デフォルトの名無しさん2007/04/19(木) 19:16:39
残念だけど PICのスタックは別領域で、スタックポインタも操作出来ないし
push/popとか他のスタック操作命令もない。

だから出来ないよ。

基本的に専門系スレには知識も技術も無いのに、
妙な口出しするのが良く出没するけど、それはどこでもそうだから気にしないように。
0523デフォルトの名無しさん2007/04/19(木) 19:20:58
というわけで、設計の見直しをしてください。
0524デフォルトの名無しさん2007/04/19(木) 19:25:09
恥ずかしいやっちゃなあw

そもそもCALLやスタックの操作は手段に過ぎず目的ではないはず。
0525デフォルトの名無しさん2007/04/19(木) 19:29:31
リターン飛ばしは、
アセンブラで書く時は良く使うテクニックだからやりたい事は良く判るよ。

PICの場合は、スタックポインタが無いし、スタックは循環するから
この場合、単にgotoで飛んでしまえば問題ない。
スタックの勘定は合わないけどね。 ただそれだけだから。
0526デフォルトの名無しさん2007/04/19(木) 19:33:20
>>520
それの方法がよくわからなくて…

>>522
ああ、やっぱりそうなんですか。
POP動作はRETURNとRETLWしか使えないんですね…
素直にRETLW使います。
0527デフォルトの名無しさん2007/04/19(木) 19:37:43
>>525
あ、飛ばしてOKなんですか?
スタック循環させてかまわないんですね…


今後PIC以外でアセンブリやるときに、こういうコトする癖がつくとマズい気もしますが…
0528デフォルトの名無しさん2007/04/19(木) 19:41:41
ああ、そういうレベルか。 なら注意を書くと、

飛ばしていいけど、戻れるのはmain と同じレベルね。
一つ前とか2つ前というような戻り方は出来ない。

他のCPUで言えばスタックポインタの初期化するのと同じね。
0529デフォルトの名無しさん2007/04/19(木) 20:21:48
>>525
おいおいどう考えても>>519みたいのは「よく使うテクニック」なんかじゃないだろう。

call routine
ret

を

jmp routine

に置き換えるような、構造化プログラミングの作法に反しない最適化なら
ごく普通のテクニックだと思うけど。

っていうか、519みたいな手段をとる目的もわからずによく回答できるよなこのスレの連中は。
0530デフォルトの名無しさん2007/04/19(木) 20:48:21
阿呆に限って偉そうに大嘘こくから困る
0531デフォルトの名無しさん2007/04/19(木) 21:50:35
>>529
アセンブラで書く理由は、それが低レベルだから。
低レベルで書くから可能な手法があって、その一つがコレってだけの事。
0532デフォルトの名無しさん2007/04/20(金) 12:09:36
C言語でいう longjmp 他の言語での例外を実装したかったのだろ
ただ、まともにコンテクスト保存しようとしたら大変だから代替手段として
飛ばしリターン。 普通に使うと思うが?
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:35
末尾再帰だからそのままループにすれば? と思うが

PICのようにスタックが無かったら再帰は無理だが
汎用CPUなら、再帰はそのままCALL/JSRで呼び出せばいいだけ
0535デフォルトの名無しさん2007/04/20(金) 18:41:28
呼び出せばいいだけって何だよw

>>533の質問の肝は、要はローカル変数や引数や返り値を再帰呼び出しが
可能なような実装にするにはどうしたらいいかってことだろうに。

俺は悪いけどそんな複雑なことやったことないんで知らない。
まあ、かなり石のアーキテクチャに依存する問題のような気がするけど。
0536デフォルトの名無しさん2007/04/20(金) 18:47:31
>>533
スタックがもったいないので再帰なんて使うな。
0537デフォルトの名無しさん2007/04/20(金) 19:47:12
>>535
引数や帰り値は、レジスタ渡しでいいだろう
普通に書けば問題ない。
この場合、末尾再帰だからレジスタが壊れる事を心配する必要さえない
0538デフォルトの名無しさん2007/04/20(金) 19:50:28
HOGE  START
    LAD   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
京大電電の実験で使いました。kuechip2です。
アセンブリ言語でソートなどを書かなければなりません。
equはどうやって使うんですか?
#defineのようなものだと調べて知りましたが。

N: equ 80H
とすると80(16進法)番地にNという整数が用意されることは分かりましたが
どうやって値を設定するかが分かりません。
これが分かればあとはBccで分岐させるやりかたが分かればいいのですが。
0540デフォルトの名無しさん2007/04/20(金) 19:55:40
すいません
http://upc.ice.ous.ac.jp/~uejima/kue2-webasm/
ここにウェブアセンブラがあります。
もしよかったら使ってください
0541デフォルトの名無しさん2007/04/20(金) 20:03:54
>>539
http://www.arch.ce.hiroshima-cu.ac.jp/~ochi/kuechip2/umult4x4.asm.txt
これを見ると、

  ld acc,N

 で  acc に 080h が入るんじゃないの?
0542デフォルトの名無しさん2007/04/20(金) 20:18:25
080hてなんですか?

あと、分岐の実験中ですが
ld acc, 0
lp1: add acc, 1
cmp acc, xxx
bn lp1
end
このプログラムがxxx=100の時は動くのにxxx=150の時は動きません。
どうしてですかね
0543デフォルトの名無しさん2007/04/20(金) 20:43:41
>080hてなんですか?
16進数の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
>>543
なるほど。

アセンブラが分かる友達はさすがにいないので・・・
おれもrubyしか分からない。Cすら不明
0546デフォルトの名無しさん2007/04/20(金) 20:55:49
>>544
まあ宿題スレだから
それに>539宿題丸投げってわけでもないからね
0547デフォルトの名無しさん2007/04/20(金) 23:23:21
今シェルソートしています。
質問ですが
ld acc, [j]
と
ld acc, (j)

はどう違いますか?
たぶんですが、[]はその番地にある値、()はその値そのもの
という解釈でよろしいでしょうか?
つまり()は即値代入、[]は、絶対アドレス代入ということで。
0548デフォルトの名無しさん2007/04/20(金) 23:37:21
>>547
まあとりあえず、落ち着いて>>1をよく読もうぜ。
■ このスレッドは過去ログ倉庫に格納されています