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

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
アセンブラの宿題ができないときに、
アセンブラ好きのお兄さんに尋ねるスレ。

・必ずCPUの名前を書くこと!
・情報を小出しにしない。書ける情報は全て書いた方が得だよ。
2デフォルトの名無しさん:2006/10/18(水) 00:05:44
HLT
3デフォルトの名無しさん:2006/10/18(水) 00:06:56
ファミコンアセンブラはまじで楽しい。
それ以外のアセンブラなんて人間にすすめるもんじゃない。
4デフォルトの名無しさん:2006/10/18(水) 00:20:21
>>3
本家スレに逝けw
5デフォルトの名無しさん:2006/10/18(水) 00:47:59
質問で失礼します。
[8085h]←[8051h]+[8052h] を計算し、符号付2進数加算としてのオーバーフローを判定する

8085プログラムで書けという問題なのですがまったく分かりません。
どなたか分かる方教えてください。よろしくお願いします。
6デフォルトの名無しさん:2006/10/18(水) 01:28:16
パリティーフラグでオーバーフローを検出できるのはZ80からだっけか。

まあまず、8bitの2の補数を足したときにオーバーフローする条件を考えてみれ。
7デフォルトの名無しさん:2006/10/18(水) 03:12:34
nop

8デフォルトの名無しさん:2006/10/20(金) 23:58:08
盛り上がらないよなやっぱ
9デフォルトの名無しさん:2006/10/21(土) 00:56:11
>>5
LDA 8051H
MOV B,A
LDA 8052H
ADD B
PUSH AF
STA 8085H
POP BC
MVI A,02H
ANA C
JNZ OVERFLOW
10デフォルトの名無しさん:2006/10/22(日) 11:20:40
Verilog-HDLを使った下記URLの問題で悩んでいます。
プログラム全体は自分で頑張って作ってみようと思っているのですが、
32ビットの整数値を予め用意しそれを操作する方法が分かりません。
命令自体が32ビットなのに32ビットの数なんて操れるのでしょうか?
addi命令でも操れるのはせいぜい24ビットだったような気がしますし、
5個も足したら普通にオーバーフローしてしまうんじゃないかとorz

http://www.za.ztv.ne.jp/yosi-h/v6010005ffffff.jpg
11デフォルトの名無しさん:2006/10/22(日) 15:02:43
キーボードから正整数n を入力し、n の階乗n!を計算してディスプレイに出力せ
よ。ただし、n!の計算にはACC に結果をセットするサブルーチンを用いること。
[解答例]
.EQU @,$000
.EQU stk,$700
LDS# stk
JSR GET_NUM
PSHA
JSR fact
JSR PUT_NUM
HLT
.EQU @,$100
.EQU n,2
fact: PSHF
TSF
POPX
do: LDA! n
CMA# 0
JLE end
MUL res
STA res
DEC! n
JMP do
end: LDA res
POPX
POPF
RTN
res: .WORD 1
.END
これってもっと簡単に書ける?
12デフォルトの名無しさん:2006/10/22(日) 15:05:15
キーボードから正整数n(>0)を入力し、1〜n番目のフィボナッチ数f<1>〜f<n>の各々を
サブルーチンで計算し、全て呼び側(caller)でディスプレイに出力せよ。
ただし、f<I>は次のように定義される。
:f<1> f<2> = 1, f<i> = f<i-1> + f<i-2> (i>=3)。
また、iとfibonをcallerの局所変数とするとき、フィボナッチ数f<i>を計算するサブルーチンは
2つのCBA引数iとfibonを受け取り、f<i>を変数fibonにセットして戻るように作れ。

お願いします。
13デフォルトの名無しさん:2006/10/22(日) 15:35:34
せめてクピュ名をかけy
14デフォルトの名無しさん:2006/10/23(月) 00:31:10
すみません教えてください
問題
もしコンピュータが直線的な処理しかできないとすると、0番地から計算を始めても主記憶の最後の番地までの命令をただ実行するだけでそこで終わってしまう。
1GBの主記憶であるとして、全ての命令が仮に2バイトで表せたとして、
・何命令収容できるか
・全部の命令を実行するのに、どれくらいの時間がかかるか

PDP11のプログラムカウンタとかについての問題です
答えだけじゃなくて説明をしなければならないので、できるだけ解説もお願いします
よろしくおねがいします
15デフォルトの名無しさん:2006/10/23(月) 00:37:42
>>14
1命令2byteだから1GBで0.5G命令、つまり2^29命令、
1命令に1クロックかかるなら2^29クロック。
1MHzなら、これは537秒くらい。

と、書いてはみたが、俺は勘違いしているような気がしてきた。
16デフォルトの名無しさん:2006/10/23(月) 00:50:19
PDP-11のプログラムカウンタって16bitじゃなかったっけ、とか
プログラムカウンタの上限までいったら次は0番地に戻るんじゃないか
とかいうツッコミはダメですか?
17デフォルトの名無しさん:2006/10/23(月) 00:50:37
ちょ待って・・w
わけわかりません・・・
勘違いって?
1815:2006/10/23(月) 00:53:58
>>17
俺は>>16みたいなことを考えずに書いちゃったわけ。
出題意図がイマイチわからんしな。
19デフォルトの名無しさん:2006/10/23(月) 00:55:24
0番地に戻る・・?16・・?
すみませんわかりません

20デフォルトの名無しさん:2006/10/23(月) 01:10:36
どなたか教えてください。。。
21デフォルトの名無しさん:2006/10/23(月) 01:34:54
お願いします!
22デフォルトの名無しさん:2006/10/23(月) 02:11:39
>>14
ものすごく基礎的なことなので

コンピュータのしくみ
ttp://www.dsgn.im.hiroshima-cu.ac.jp/~tomoo/lecture/documents/arch.pdf

プログラムはなぜ動くのか ― 知っておきたいプログラミングの基礎知識
ttp://www.amazon.co.jp/exec/obidos/ASIN/4822281019

この辺のを読んで勉強し直せ。
23デフォルトの名無しさん:2006/10/23(月) 02:31:10
すみませんが急ぎなので教えてください・・
そもそもここはそういうスレですし
基礎的で申し訳ありませんがよろしくお願いします
24デフォルトの名無しさん:2006/10/23(月) 02:55:05
気が向いた人が答えるスレ
他の人が課題に挑戦するスレ
だよ。

おまえの単位を取るためのスレじゃないのだけは確か。
25デフォルトの名無しさん:2006/10/23(月) 02:58:53
>>23
問題が意味不明
GBを理解してるか、の問題?

どんな命令を実行するのかわからないのに、
どれくらいの時間がかかるかなんてわからない
26デフォルトの名無しさん:2006/10/23(月) 03:59:33
直線的な処理しかできないってのは、仮にプログラムカウンタが存在しなくて、
0番地から順に命令を実行できるのみだとしたら、と考えるんだろう?

命令数は簡単だから省く。

1命令って、どういうプロセスで実行されるんだっけか?
読み出しに1クロック、解釈に1クロック、実行に1クロックで、合計3クロックか?
27デフォルトの名無しさん:2006/10/23(月) 04:05:36
書き戻しもあるぞよ
28デフォルトの名無しさん:2006/10/23(月) 04:15:08
いまどきのプロセッサはそう単純にはなってないだろうが
昔は、fetch, decode, execute, writeback の4つに分類されてたな。
29デフォルトの名無しさん:2006/10/23(月) 08:36:07
Verilog-HDLを使った下記URLの問題で悩んでいます。
プログラム全体は自分で頑張って作ってみようと思っているのですが、
32ビットの整数値を予め用意しそれを操作する方法が分かりません。
命令自体が32ビットなのに32ビットの数なんて操れるのでしょうか?
addi命令でも操れるのはせいぜい24ビットだったような気がしますし、
5個も足したら普通にオーバーフローしてしまうんじゃないかとorz

http://www.za.ztv.ne.jp/yosi-h/v6010005ffffff.jpg
30デフォルトの名無しさん:2006/10/23(月) 11:56:44
2つだけでもオーバーフローは起きる
31デフォルトの名無しさん:2006/10/23(月) 12:51:32
>>14です!
教えてくださいお願いします
問題は書いた通りです

補足です
学習範囲は実行制御にかかわる命令というところで、GBとかも習いました
教科書によるとプログラムカウンタは2ずつ増加していくけど、直線的な処理にとどまるらしいです
そこでジャンプ命令と条件分岐命令が用意されており、柔軟な処理が可能になると書いてあります

急ぎですのでなるべく早くお願いします!
32デフォルトの名無しさん:2006/10/23(月) 13:01:04
>>15-16の何が不満なんだろう。
33デフォルトの名無しさん:2006/10/23(月) 14:38:55
結局自分で考えて提出しました‥
答えも教えてもらいましたが全然違いました‥このスレの人のも
もうかなりヤバイです(ノд`)
答え1問目は5億何ちゃらというとんでもない数字でした
2問目はそれに10の-9乗掛けたものです
そもそもクロックとかまだ習っていませんでしたし‥
皆さん難しく考えすぎだったのでは‥
34デフォルトの名無しさん:2006/10/23(月) 14:44:06
2^29=5億何ちゃらだから>>16で合ってたじゃん。
それに10^-9をかけるということは1GHz動作だったんだな。
問題に1GHzって書いてなかったん?
35デフォルトの名無しさん:2006/10/23(月) 14:44:38
あ、>>15だった。
36デフォルトの名無しさん:2006/10/23(月) 14:44:59
2^29=536870912だろ。何がヤバイんだ?
37デフォルトの名無しさん:2006/10/23(月) 14:54:17
答えを教えてもらっても駄目な奴っているんだな
38デフォルトの名無しさん:2006/10/23(月) 14:55:06
クロック習ってないのにどれくらいの時間がかかるか、なんて問題出るの?
39デフォルトの名無しさん:2006/10/23(月) 15:18:03
0.5秒で1GB処理するのか
40デフォルトの名無しさん:2006/10/23(月) 16:34:35
>>34
書いてないです
>>36
間違えた答えで提出してしまったことです
>>38
出ましたね‥
クロックは教科書のその20ページ後ぐらいに初めてでてくるようです
41デフォルトの名無しさん:2006/10/23(月) 16:42:54
全ての命令が一秒待つとかだったら17年かかるな。
42デフォルトの名無しさん:2006/10/23(月) 17:05:00
>答えも教えてもらいましたが全然違いました‥このスレの人のも
だから>>15で合ってるじゃん。何が違うの?
もしかして2^29=5億何ちゃらって理解してなかった?
43デフォルトの名無しさん:2006/10/23(月) 20:10:49
問題です。お願いします。
ラベルA、B、Cにそれぞれ、10、20、5という整数値が格納されている。
A−B+Cの値を計算してラベルDに格納するプログラムを作成する。
ただし、プログラムの先頭4桁は次の形式(54*****は学生番号、
YAMADA TAROUは氏名)とすること。


  54***** YAMADA TAROU

EXIT START
44デフォルトの名無しさん:2006/10/23(月) 20:22:22
>>43
MOV D, -5
45デフォルトの名無しさん:2006/10/23(月) 23:45:43
なんでクピュ名かかないやつ多いんだ
46デフォルトの名無しさん:2006/10/23(月) 23:52:53
わからない人のために補足しておくと、
クピュとはCPUのことです。
47デフォルトの名無しさん:2006/10/24(火) 23:49:38
dc.b 54xxxxx
label_a:
ds.b 1
label_b:
ds.b 1
label_c:
ds.b 1

clr.b d0
loop:
add.b #1, d0
cmp.b #10, d0
bne loop
move.b d0, d1
add.b d1, d1
move.b d1, d2
lsr #1, d2
move.b d0, label_a
move.b d1, label_b
move.b d2, label_c

あー、アセンブラなんか書いたの 13年ぶりぐらいだから
lsrの意味がよく思い出せねえんだけど右に一桁ずらすんだっけ?w
ワードしかだめなんだっけ?
48デフォルトの名無しさん:2006/10/25(水) 02:42:36
お願いします。
8085CPUで

      _ _
A←B・C+D ・ E   (論理演算)

という問題なんですが、さっぱりわかりません。プログラムのキーポイントと一緒に解説をおねがいします。
49デフォルトの名無しさん:2006/10/25(水) 04:02:46
>>47
その形式ならサイズ指定してやればバイト/ワード/ロングワードのどれでもいける。
lsr -4(A0)とか、lsr $C00000とか、lsr LABELとかやると、ワード限定になる。
あと、漏れならこう書く。
.include DOSCALL.MAC
.text
moveq #4, d0
lea D, a0
loop: swap d0
addq.w #1, d0
swap d0
dbra d0, loop
swap d0
move.w d0, -(a0)
lsl.w #2, d0
move.w d0, -(a0)
lsr.w #1, d0
move.w d0, -(a0)
swap d0
add.w (a0)+, d0
sub.w (a0)+, d0
add.w (a0)+, d0
move.w d0, (a0)
addq.w #1, (a0)
DOSCALL EXIT
.data
A: ds.w 1
B: ds.w 1
C: ds.w 1
D: ds.w 1
50デフォルトの名無しさん:2006/10/25(水) 05:47:44
>>48
キーポイント:何も無し
MOV A,B ;アキュームレータにBを転送
ANA C ;アキュームレータとCの論理積をとる
MOV B,A ;結果をBへ待避
MOV A,D ;アキュームレータにDを転送
ORA E ;アキュームレータとEの論理和をとる
CMA ;結果の否定をとる
ORA B ;アキュームレータとBの論理和をとる
HLT ;プログラム停止
51デフォルトの名無しさん:2006/10/25(水) 15:24:03
>>50
詳しい解説付きでどうもアリガトウ御座います。
5247:2006/10/25(水) 21:52:00
>>49
DOSCALL.MACってなつかすぃものを見たーーーーーーw
53デフォルトの名無しさん:2006/10/25(水) 21:58:51
ところで学生って、デバッガ使わせてもらえないの?
オレは自力で覚えたから知らんが、全部、紙とか黒板で理論のみ習うわけ?
んなわけないと思うけど
デバッガで遊んでレジスタの変化とか見てれば、各命令の動作なんてすぐ覚えられると思うんだけど。。。
54デフォルトの名無しさん:2006/10/26(木) 08:59:47
MINIPSアセンブラです。jalr命令(jalr r1,r2:プログラムをr2レジスタの値の示す
アドレスへ分岐させる。その際に、復帰アドレスがr1レジスタに格納される)
を使って再帰的に以下のCプログラムをアセンブラにしたいのですが、
C言語を作るまでで若干力尽きております。ご教授いただければ幸いですorz

int func(int j){
if(j==0){
return j;
}
return j+func(j-1);
}
55デフォルトの名無しさん:2006/10/26(木) 09:41:57
>>54
gccがその環境にあるかしらんけどコンパイラオプションに
アセンブラコードをはかせるよう指定してみたらいかがかと。
gccの場合

#gcc -S test.c
#vi test.s

・test.cの中身
nt func(int j){
if(j==0){
return j;
}
return j+func(j-1);
}
//コンパイラを通すためのダミーのmain
main(){

return(0);
}
5654:2006/10/26(木) 11:07:08
>>55
ご回答ありがとうございました。
gccってそんな機能があったんですねorz
使えると思いますので、学校に行ったら試してみたいと思います。
57デフォルトの名無しさん:2006/10/26(木) 11:18:53
>gccってそんな機能があったんですね

というか、C言語をアセンブリ言語に落とすのがCコンパイラの仕事だが。
5855:2006/10/26(木) 11:34:48
>>56
ガンガレ
59デフォルトの名無しさん:2006/10/27(金) 00:05:13
質問しようと思ったら、全く同じ問題があってワラタ
60デフォルトの名無しさん:2006/10/28(土) 19:58:33
誘導されてきました。
VerilogHDLを用いたMINIPSアセンブラについてですが、テキストに

1: initial begin
2: InstMem.mem_data[0] = 32'h20011234; // addi $1, $0, 0x1234
3: InstMem.mem_data[1] = 32'hac030004; // sw $3, 4($0)
4: InstMem.mem_data[2] = 32'hfc000000; // halt
5: end

という書き方と

ADDR: Instruction #Mnemonic
0000: 20010001 # addi $1, $0, 1
0004: 0061202a # slt $4, $3, $1
0008: fc000000 # halt

という書き方(InstMem.mem_data[]= があるかないか?)があるのですが、
これらはどういった違いがあるのでしょうか?
61デフォルトの名無しさん:2006/10/30(月) 23:22:20
宿題です、分かる方お願いします。

ラベルAに整数(たとえば10)が格納されている。
Aを4で割ったあまりをラベルBに入れ、さらにAを9倍した値をラベルCに
いれるプログラムを作成せよ。
62デフォルトの名無しさん:2006/10/30(月) 23:28:32
>>61
CPU名を書いてないので答えられない。
63デフォルトの名無しさん:2006/10/30(月) 23:29:49
答えがわからないなら書き込まなくていいです
64デフォルトの名無しさん:2006/10/30(月) 23:33:56
頭おかしい奴だなw
6562:2006/10/30(月) 23:44:53
>>63
確かにCPUによっては俺は答えられない。
だが、CPU名が書いてないと、
答えを書きたい人がいても答えられないんだ。
66デフォルトの名無しさん:2006/10/30(月) 23:48:08
>>1も読めないような奴だから、こんな問題も解けないんでしょう。
ほっとけばいいよ。
67デフォルトの名無しさん:2006/10/31(火) 00:03:33
>>60
前者はシーケンシャルに実行される、ってことは、代入するコードが生成される。
後者はプロセッサの初期化時に値がロードされる。
FPGAなんかだと外部からロードされるデータの中に値が含まれてる。

ってことだと思う、 VerilogHDLは経験が無いけどきっとそう。
68デフォルトの名無しさん:2006/10/31(火) 00:11:40
なんだよアセンブラって。
>>62に禿同。
んじゃ>>63>>66に問題だ。
ldi r30,low(0x60)
ld r16,r30
ldi zl,16
ld r17,z+
cp r16,r17
brne NG
rjmp OK

意味書け!
もちろんアセンブラですけど。
69デフォルトの名無しさん:2006/10/31(火) 00:21:44
なんだろう、レジスタが30本以上(おそらく32本であとはPCとSP)
でzlがレジスタっぽいし、分岐がbrってことは、AVRかな?
70デフォルトの名無しさん:2006/10/31(火) 00:35:24
どうでもいいが痛い奴二人の

「どっちがより痛い奴か」

の競争にしか見えません俺には。
71デフォルトの名無しさん:2006/10/31(火) 00:42:26
はい次の方、質問をどうぞ。
CPUと環境を明記してね。
7268:2006/10/31(火) 00:55:51
>>69
正解。だが、お前の発言は面白くもなんともねぇ。
何故なら、お前には聞いてないからだ!ボケ
7369:2006/10/31(火) 02:04:57
>>72
だから質問にある「意味」には答えてないだろ、
よくよめカス!
74デフォルトの名無しさん:2006/10/31(火) 12:10:50
>>73
意味についてでなく
CPUが解らなければ
答えられないということを解らせなければいけなかった。
ということではないかな?
そういう流れだと思うが。
75デフォルトの名無しさん:2006/10/31(火) 14:38:07
ソースだしたらCPU解かっちゃうからなぁ
76デフォルトの名無しさん:2006/10/31(火) 16:42:28
>>62を見た時点でCPUでも書いてりゃよかったのに
開き直っちまうからこんなことになる
77デフォルトの名無しさん:2006/10/31(火) 18:28:24
MINIPSアセンブラ(?)です。
FFFFFF00番地に1→11→111と値を変えながら入れていくプログラムなのですが、
bne前後でエラーが起こって1周目で終了してしまいます。
もしかしたらプログラム以外の問題である可能性もありますが、
プログラム、アルゴリズムに問題はありますでしょうか?

addi $1, $0, FF00       luiと合わせて、$1にFFFFFF00を入力する処理
lui   $1, FFFF
addi $2, $0, 1          $2=1
addi $3, $0, 0          $3=0
addi $4, $0, 500         $4=500。この数字は大きければいいだけで特に意味なし
slt   $5, $4, $2 ←L1    bneと合わせて、$4<$2になったらhaltへ行く処理
bne $5, $0, L2       
add $3, $3, $2         $3に$2を足し込んでいく
sw  $3, 0($1)         $3の値をFFFFFF00へ
add $2, $2, $2         $2は繰り返しのたびに2倍に
beq $0, $0,L1       
halt          ←L2
78デフォルトの名無しさん:2006/10/31(火) 19:28:01
ググッたら、教育用のCPUか>MINIPS
分岐命令の後ろに、nop入れろ
79デフォルトの名無しさん:2006/11/01(水) 01:02:32
ここでFPGAにMINIPSコアを乗せている>>60が登場!
80デフォルトの名無しさん:2006/11/01(水) 02:55:09
>>79
そんなやつおらんやろー。
そもそも、架空のCPUコア乗せてるのが信じられない。
ARMや8051とかならまだしも。
81デフォルトの名無しさん:2006/11/01(水) 04:27:47
COMET も架空かな
82デフォルトの名無しさん:2006/11/01(水) 10:35:08
「オレほどCPU持ってるやつはいない。100個持ってる。」
83デフォルトの名無しさん:2006/11/01(水) 18:28:18
教育用の架空のコアだから、FPGAに乗せるのも学習の一環だと思うな。
ソフトウエアでのエミュレータなら普通にアリだろ?
84デフォルトの名無しさん:2006/11/01(水) 19:35:52
計算機基礎 アセンブラ・プログラム演習問題
1.キーボードから上底、下底、高さを入力し、台形の面積をディスプレイに出力せよ。
2.キーボードから底面の縦・横の長さ、高さを入力し、四角錐の体積の体積をディスプレイに出力せよ。
3.キーボードから整数を入力し、その値の偶数/奇数を判定し、「odd」/「even」をディスプレイに出力せよ。
4.キーボードから整数nを入力し、を求めて、結果をディスプレイに出力せよ。 Σ=nii1
ただし、ループを使う方法と2)1(+nnの2通りで計算し、両方出力すること。
5.キーボードから西暦(1868≧)を入力し、年号に変換しディスプレイに出力せよ。
(参考)
明治(m):1868-1912
大正(t):1912-1926
昭和(s):1926-1989
平成(h):1989-2006
(例)
入力 出力
1900 → m33
1926 → s1 (新しい年号優先で表示)

誰か一問でも出来たらやってください!
授業ではttp://www.k.hosei.ac.jp/~i05r4102/までやりました
85デフォルトの名無しさん:2006/11/01(水) 22:50:58
疲れるし、つまんないから仕事じゃなきゃやらなーい。
出来たから何って感じだし。

スレ違いだし。
8685:2006/11/01(水) 22:56:14
あ、すまん。>>84じゃないよ。
FPGAやらの話してるやつへのレスね。
87デフォルトの名無しさん:2006/11/01(水) 23:21:52
>出来たから何って感じだし。
88デフォルトの名無しさん:2006/11/02(木) 02:18:04
>>84
CPU名を明記するように。
89デフォルトの名無しさん:2006/11/02(木) 07:31:46
>>84
とりあえずCUSPエミュレータとアセンブラを貰っといた。しばらくは楽しめそうだ。
で、ちょっと読んで書いたのが↓。
問1.
.EQU @,$000
JSR GET_NUM
STA uhen
JSR GET_NUM
STA lhen
JSR GET_NUM
STA h
LDA uhen
ADA lhen
MUL h
JSR PUT_NUM
HTL
uhen: .WORD
lhen: .WORD
h: .WORD
.END
90デフォルトの名無しさん:2006/11/02(木) 07:55:53
問2
.EQU @,$000
.EQU StkTop,$700
JSR GET_NUM
STA h1
JSR GET_NUM
STA h2
JSR GET_NUM
STA h
LDA h1
MUL h2
MUL h
DIV# 3
JSR PUT_NUM
HLT
h1: .WORD
h2: .WORD
h: .WORD
91デフォルトの名無しさん:2006/11/02(木) 07:57:27
問3
.EQU @,$000
.EQU StkTop,$700
JSR GET_NUM
SHRA
JOV putodd
LDA 'e'
JSR PUT_CHR
LDA 'v'
JSR PUT_CHR
LDA 'e'
JSR PUT_CHR
LDA 'n'
JSR PUT_CHR
HLT
putodd:
LDA 'o'
JSR PUT_CHR
LDA 'd'
JSR PUT_CHR
LDA 'd'
JSR PUT_CHR
HLT
.END
92デフォルトの名無しさん:2006/11/02(木) 08:10:51
問4
.EQU @,$000
.EQU StkTop,$700
LDS# StkTop ←問2と3もこの行追加して
JSR GET_NUM
STA n
PSHA
LDA# 0
loop: ADA n ←ここからloop版
STA a
DEC n
JNE loop
JSR PUT_NUM
POPA ←ここからn(n+1)/2版
STA n
INC n
MUL n
DIV# 2
JSR PUT_NUM
HLT
n: .WORD
.END
93デフォルトの名無しさん:2006/11/02(木) 09:39:36
問5 入りきらないんで複数行を一行に纏めた箇所がある。(一目でわかるよね)
.EQU @,$000 .EQU StkTop,$e00
LDS# StkTop JSR GET_NUM
PSHA
CMA# 1989 JGE PutH
CMA# 1926 JGE PutS
CMA 1912 JGE PutT
LDA# 'm'←問3の似た行LDA ' 'をLDA# ' 'に直して
JSR PUT_CHR
LDA# 1867 STA y
JMP PutN
PutT: LDA# 't' JSR PUT_CHR
LDA# 1911 STA y
JMP PutN
PutS: LDA# 's' JSR PUT_CHR
LDA# 1925 STA y
JMP PutN
PutH: LDA# 'h' JSR PUT_CHR
LDA# 1988 STA y
PutN: POPA SBA y JSR PUT_NUM
HLT
y: .WORD
.END
94デフォルトの名無しさん:2006/11/02(木) 15:01:17
久しぶりに宿題板みたいになってきたな♪(゚д゚)ウマー
95デフォルトの名無しさん:2006/11/02(木) 23:57:40
微妙にスレ違いかもしれませんがここに書きます。
アセンブラの課題が出たのでWinXPにcygwinを入れてその動作や命令について勉強しようと思ったのですが、
cygwin自体は何とか入った(?)もののソースを書いて〜.sとして保存後、
 $ gcc 〜.s
としてコンパイルしようとしても
/usr/lib/gcc-lib/i686-pc-cygwin/3.3.3/../../../../i686-pc-cygwin/bin/ld: cannot find -luser32
collect2: ld returned 1 exit status
と表示され実行ファイルは何も作られません。

これは〜.sファイルをコンパイル出来るパッケージ(?)が入っていないせいで、
それを入れれば上手く行くのか、cygwinのインストールが上手く行っていないのか、
それとも単純にコマンドを間違えているのか、何か根本的に間違えているのか…
全く手詰まりになってしまったので何か助言をいただけないでしょうか…。
96デフォルトの名無しさん:2006/11/03(金) 00:16:06
97デフォルトの名無しさん:2006/11/03(金) 01:27:26
ありがとう。
ということはインストールが上手く行っていないのか…。
確かにインストールの途中で固まって以後すすまなくなってた。
アンインストールインストール…と繰り返すうちに訳が分からないことになってる…。
9895:2006/11/03(金) 03:32:32
ダメだ…何度やってもインストールの途中で固まってしまう。
w32apiパッケージのlibuser32.aというのを入れれば動くという事は分かっても入れ方が分からない…。
他の質問者の人はインストールし直すと正常に動くようになったとあるけれど
自分の場合はインストールし直そうとするとほぼ確実に途中で固まってうまくいかない。
どうすればいいんだ…。
99デフォルトの名無しさん:2006/11/03(金) 03:58:45
>98
どこでどう止まるの?
ファイルのダウンロード中?コピー中?
何のファイルでとまる?
10095:2006/11/03(金) 05:33:41
もともとは
ttp://www.ongs.co.jp/publications/books/unix_applications/index.html
この本買ってcygwin入れようと思ったのだけれど、どうも他のアプリケーション含めて
上手くインストール出来ない事が多かったんだけど、
CDからインストールの場合もネットからインストールの場合もファイルのコピー中(?)に
進捗状況が0%から進まなかったり20%ちょっとで止まったり61%出止まったり…。
どこで止まるかは毎回違うといった有様ですが、CPU使用率は高いのに何もしていない
(HDDがガリガリ言わなくなる)がインストールは途中…という。

で、ここからが続きなんですが、それでもPCを再起動したりしてインストールは
正常に終了させられたのですが、やはり
/usr/lib/gcc-lib/i686-pc-cygwin/3.3.3/../../../../i686-pc-cygwin/bin/ld: cannot find -luser32
collect2: ld returned 1 exit status
と同じエラー。
C:\cygwin\usr\lib
の中がカラなのでライブラリ自体入っていない様です。
インストーラにこのライブラリが入っていないと言う事があるのでしょうか?
普通このライブラリは手動で入れるのですか?

ググって
ttp://www.jp.netbsd.org/ja/JP/Documentation/Packages/list/devel/w32api/README.html
このページには行き当たったもののどうやってcygwinにいれればいいのか…。
101デフォルトの名無しさん:2006/11/03(金) 10:24:01
>100
それは普通「正常に終了」とは言わないケド…
…でも何で止まるんだろ。
ごめん。訊ねたけど判らないっす。
102デフォルトの名無しさん:2006/11/03(金) 10:25:04
普通にCygwinのサイトからダウンロードしてきたら?
遣り方についてはスレ違いにつき割愛。
10395:2006/11/03(金) 15:18:10
cygwinのサイトから入れてみました。
エラーメッセージが増えましたorz

$ gcc 〜.s
/cygdrive/c/DOCUME~1/(user)/LOCALS~1/Temp/cchKzoMI.o:fake:(.text+0x9):undefined reference to 'printf'
/usr/lib/gcc/i686-pu-cygwin/3.4.4/../../../libcygwin.a(libcmain.o):(.text+0xab): undefined reference to '_WinMain@16'
collect2: ld returned 1 exit status
104デフォルトの名無しさん:2006/11/03(金) 17:46:33
printf() と main() ガ見つからない、ってさ
105デフォルトの名無しさん:2006/11/03(金) 18:03:54
要するにやっぱライブラリがみつかんねぇってこった。
106デフォルトの名無しさん:2006/11/04(土) 02:02:32
解決案その1
gccを介さず、素直にasとldを自分で呼び出して使う。

解決案その2
gccに-nostartfilesオプションを指定する。

あと、ソースは公開しよう。
107デフォルトの名無しさん:2006/11/05(日) 17:31:28
LC3シミュレーターというソフトがあるらしいのですが、下のプログラムをLC3で作成せよ
という問題が出ました。どなたかご教授下さい。
http://kjm.kir.jp/pc/?p=24382.jpg
108デフォルトの名無しさん:2006/11/05(日) 19:01:28
で、何を教えりゃいいの?
LC-3 Simulatorとマニュアル、命令セット&アーキテクチャ資料の入手法?
109デフォルトの名無しさん:2006/11/05(日) 19:58:31
教授によると、その画像(数式)をアセンブラで作成せよ
ということでした、
110デフォルトの名無しさん:2006/11/05(日) 21:15:03
ある特定のメモリ番地の値がディスプレイに出るだけのハードウェアを使って
その値を変えることで様々な表示をさせることを実習でやったのですが、
もっと複雑なハード(PCのキーボードやマウス、ディスプレイ)もCPU(アセンブラ)から駆動できるそうです。
どのような方法で実現されているのでしょうか?若干スレ違いになるようで申し訳ないoですrz
111デフォルトの名無しさん:2006/11/05(日) 21:27:04
>>110
>どのような方法で実現されているのでしょうか?
いろいろ。
その実習のようにメモリ空間に周辺機器のI/Oをマッピングしたり、
CPUによってはI/O専用のアドレスを持ってるのでそこに配置したり。
112デフォルトの名無しさん:2006/11/05(日) 23:17:04
>>111
ありがとうございました。皆さん物知りで大変助かります^^;
113デフォルトの名無しさん:2006/11/05(日) 23:34:20
いや、あんたが物を知らないか調べる能力がないだけだ。
114デフォルトの名無しさん:2006/11/05(日) 23:38:30
プログラマーになるつもりなのか知らんが
希望する情報を自分で探し出せない能力は
プログラマーに必要な素質がかけてるようなきガス

昔に比べりゃ、googleなんて便利なものがあって
なんで探し出せないか不思議だわ。
やる気ないとしか思えん。
115デフォルトの名無しさん:2006/11/06(月) 00:26:04
教えてgoo!で、ググって出た答えを書いてあげると感謝されるもんね!
116デフォルトの名無しさん:2006/11/06(月) 11:43:24
>メモリ空間に周辺機器のI/Oをマッピング
>I/O専用のアドレスを持ってるのでそこに配置
これ、理解してて書いてるならタダモノではない気配。
117デフォルトの名無しさん:2006/11/06(月) 13:01:15
メモリマップドI/Oとか、I/OマップドI/Oとか言ったかな。
昔8bit機いじってたヤツなら結構知ってるんじゃね?
118デフォルトの名無しさん:2006/11/06(月) 14:57:02
どっちもメモリマップドの話にしか見えない。
119デフォルトの名無しさん:2006/11/06(月) 19:07:07
>>116
いや、君が何を言いたいのかそれだけじゃよくわからんが、
たぶん君が無知なだけだと思うよ。
120デフォルトの名無しさん:2006/11/06(月) 21:09:35
>>108
遅レスですみません、さきほど教授に聞いたら、問題は
Task: write a program (in machine code for LC3) which does the following:

1) creates an array of 30 numbers, A[i]=(i+3)*(1+(-1)^i), writes
this array into the memory, and then
2) reades the integer numbers A[i] from memory, and sums them up,
i.e. R=Sum(A[i], for i=1,..,30).
だそうです、どなたかお願いできないでしょうか?
121デフォルトの名無しさん:2006/11/06(月) 21:28:46
だからね、LC3が何者か提示しないと話が進まないと思うのだが。
122デフォルトの名無しさん:2006/11/06(月) 21:46:12
>>114
日本語大丈夫か?

>>120
そのLC3やらの言語と俺らが知っている一般的なアセンブラは必ずしも同じじゃないんだよ。
あと、その問題のどの辺りが分からんのかも教えてくれ。一から作らす気か?w
123デフォルトの名無しさん:2006/11/06(月) 23:19:09
>>120
ここは宿題が分からないときに質問するスレであって変わりに宿題してもらうスレじゃないんだよ。
誤解するな。
124デフォルトの名無しさん:2006/11/06(月) 23:44:44
そもそも問題の内容自体理解してない様だから、もう1年受け直した方がいいな。
125デフォルトの名無しさん:2006/11/07(火) 00:30:27
>>119
IOマップドは普通「I/O専用命令」の下りがあるもんだ。
メモリマップドとの区別ついてないだろ?
あと>>110はDMAの可能性もある。
126デフォルトの名無しさん:2006/11/07(火) 01:00:13
>>125
何が言いたいねん。

>>111(俺じゃないが)は>>110に対するレスだよ。
その辺踏まえてるのかな。
127デフォルトの名無しさん:2006/11/07(火) 01:27:36
>>111が答になってない件について
128デフォルトの名無しさん:2006/11/07(火) 01:33:46
質問者が納得してるんだからいいんじゃねーの?
129デフォルトの名無しさん:2006/11/07(火) 03:13:34
【ちょっといいですか?】
不勉強な人が不勉強な人にでまかせを教えるのはやめましょうw
最悪ですw
本当にどうもありがとうございました。
130デフォルトの名無しさん:2006/11/07(火) 03:17:59
>>120
ttp://highered.mcgraw-hill.com/sites/0072467509/student_view0/lc-3_simulator.html
LC-3シミュレータはここにあった。

ttp://highered.mcgraw-hill.com/sites/dl/free/0072467509/104653/PattPatelAppA.pdf
これに命令セットとアーキテクチャについては全て書かれてる。

ttp://www.uploda.org/uporg573061.asm.html
で、始めて触るけどマニュアル見ながらとりあえずやってみたのがこれ。
マシンコードってことは2進数で書かないとダメかね?
131デフォルトの名無しさん:2006/11/09(木) 00:43:33
初めまして、最近アセンブラを始めました。
現在、アセンブラでの計算に悩んでいます。
今回出た課題はw=x+5*y*z+4と言う式があり、
キーボードからインプットされた数字をx、y、zにいれてwを出したいんです。

先程、自分で入力された数が正の数だったらちゃんとした答えが出るようには出来たのですが、
答えが負の数になると何か変な数値が出てきます。

どうか教えて頂けると幸いです。

CPU:Intel Pentium 4 CPU 3.00GHz
132デフォルトの名無しさん:2006/11/09(木) 00:54:39
>>131
まず、負の数を表示すること自体ができるか(出力だけが間違ってる)、
次に、乗算でmulでなくちゃんとimulを使っているか(計算が間違ってる)、
この2つは大丈夫ですか?

と思ったが、
Nbitの整数同士を掛け算した結果の下位Nbitは、符号付きかどうかに関係ない
のだった。mul使っても普通は大丈夫だね。
133デフォルトの名無しさん:2006/11/09(木) 01:29:15
>>131の掛け算を見てふと思い出した。
2次元配列の値をアセンブラで出したいのですが、例えば
A[0][0] * A[1][1] - A[0][1] * A[1][0] = 3000 * 300 - 2000 * 400
のように結果的な値はある程度小さくなっても途中の計算が大きくなる場合、
効率的に計算するにはどのような方法がありますでしょうか?
A[1][1]の回数A[0][0]を足し込んで・・・とかやってたらアホみたいなサイクル数になったorz
134デフォルトの名無しさん:2006/11/09(木) 11:21:08
>>133
掛け算もないCPUなの? Z80かなんかの8ビットCPUとか?
だとしても、その程度の話ならCで足し算で掛け算を実装してみればいいじゃん。
掛け算の両辺の大小見たりシフトで代用できないか検討したりするだけ。
#8ビットCPU用のCコンパイラのアセンブル出力覗いてみてもいいね。
135133:2006/11/09(木) 17:18:45
>>134
CPUはFPGAというのでしょうか?作ったら使えるのかもしれませんが残念ながら掛け算はありません。
大小を見るというのは繰り返し回数に持ってくる方の変数は小さい方がいいからということでしょうか?
シフトについても、シフトを使うことでサイクル数が少なくて済む処理があるということを
聞いたことがある程度なのですが、どういったアルゴリズムなのでしょうか?
3000*300を300000*3にするようなイメージでしょうか?
質問ばっかりになってしまって申し訳ないですorz
136デフォルトの名無しさん:2006/11/09(木) 17:58:11
>>133
A≒C、B≒Dという場合にはこれが使えるかも。
A*B-C*D=(A-C)*B+(B-D)*C

ていうかCPU名を書いてくれないと答えようがない。
普通の32bitCPUならこんな小細工は全くの無意味だし。

>>134
例えばimul eax,8の代わりにsal eax,3とするとか。
これもCPUによって素直にかけ算した方が速いことがあるから注意。
137デフォルトの名無しさん:2006/11/09(木) 17:58:56
136の後半は>>134じゃなくて>>135へのレス
138134:2006/11/09(木) 18:38:35
>>135
FPGAか、納得。それじゃこったことは何もできないと思った方がいいねぇ。
#つーか、それこそノウハウの塊だから先人に教えを乞う方がよくね?
139デフォルトの名無しさん:2006/11/10(金) 00:22:44
スレ違いかもしれませんが・・・
CPUに関して勉強中なんですが、2バイトや4バイトでメモリに1回でアクセスするのに
番地は2や4の倍数である必要があるらしいんですが、なんでですか?
奇数アドレスの2バイトアクセスは、どの辺が困るのかわかりません。
CPUはARMです。
140デフォルトの名無しさん:2006/11/10(金) 00:49:59
>>139
こういう風に16byteのメモリがあったとする。
00──┐
04──└─→CPU(アドレス00から4byte読む)
08──
12──

00──
04────→CPU(アドレス04から4byte読む)
08──
12──

こういう配線になってたらアドレス02から4byte読めないだろ?
こういう制限が出てしまうくらい配線が大変だということだ。
141デフォルトの名無しさん:2006/11/10(金) 01:16:27
バスがエラーだ、電車を使え
142139:2006/11/10(金) 10:15:08
>>140
1バイト用、2バイト用、4バイト用の配線があるというわけですね?
CPUじゃなくてバスの制約に引っかかるんですか。 ありがとうございました。
143デフォルトの名無しさん:2006/11/10(金) 14:28:28
>>142
いや、たとえば4バイト境界から一度に4バイト読む配線だけ用意した場合、
02番地から4バイト読む時は2回読んでくっつけなくちゃいけない。
読み出しのコストが倍かかっても読んでくれるCPUと、「それ、おかしいだろ」
ってエラーにするCPUとがある。

144デフォルトの名無しさん:2006/11/10(金) 23:56:47
ARMさんはちょっとわがままなRISCプロセッサなので
「ちょっと!メモリの読み出しに2回もコストをかけたら、一定速度での命令実行なんて出来ないじゃない!」
「私に読んで欲しかったら、アドレス境界を4の倍数に合わせなさい!さあ、はやくっ!」
と文句を言ってしまうのだ。許せ。
145139:2006/11/11(土) 00:00:04
>>143
>一度に4バイト読む配線だけ用意した場合
これはメモリスペックで言うバス幅が32ビットであるということでしょうか?
んでこれが境界を決めているというわけですか?
バス幅が16bitなら2バイト毎のアドレス、64bitならば、8バイト毎のアドレス、みたいな感じで・・
146デフォルトの名無しさん:2006/11/11(土) 00:51:33
>>145
>メモリスペックで言うバス幅が32ビット
CPUアーキテクチャでいうバス幅が近いかな、とおもう。
最近のCPUはキャッシュや内部RAM/ROMを持ってたりするから
単純にこ〜だ、とは言えない。
設計する時に決める事、ってかんじ。

バス幅128ビットにしました、けど互換性確保したいから
4バイト境界です、って可能性もある。
147デフォルトの名無しさん:2006/11/11(土) 08:12:47
かつてIntelは8085の後継として16ビットCPUを開発していた。
16ビットCPUとは言え、メモリが今とはビット単価も占有面積も違う時代。
まして8ビットバス版の8088の存在もある。当然の如く命令長は1バイトからの可変長とされた。
そこではたと気付く。「命令長が奇数だったら、次の2バイト命令がワード境界を跨ぐじゃん。」
斯くして現在にまで続く可変命令長の際物CPUができあがったというわけ。

一方Motorolaは68000の開発に当たって素直に命令長を2の倍数のみとした。
そのために3ビットイミディエイト加減算なんて命令までできることになったが、
それはまた別のお話。
148デフォルトの名無しさん:2006/11/11(土) 14:15:42
バカ基本的な質問をさせてください

IA-32 on NASM です

サブルーチンの先頭でよく見かける
push ebp
mov ebp, esp
は、何をしてるんでしょうか?
ebp を push する意味って esp を ebp に mov するためですよね?
この mov って必要なんですか?
引数とからんでる気はするんですが・・・
教えてください><
149デフォルトの名無しさん:2006/11/11(土) 14:16:34
ばかぁ><
150デフォルトの名無しさん:2006/11/11(土) 14:25:31
>>139
どうせこんなスレでまじめに聞いてやしないだろうけど、
あんまりこのスレの連中のいうこと真に受けない方がいいよ。

俺も本当の理由をソース付きで答えられるわけじゃないけど、
それは恐らくCPU側の都合というよりもアドレスをデコードする側(つまりメモリとか
デバイス)側の問題でしょう。

任意アドレス指定でアドレスされても常にバス幅のデータを正しく吐き出すような
回路が複雑になることってなんとなく想像できるでしょ。
151デフォルトの名無しさん:2006/11/11(土) 14:46:38
152デフォルトの名無しさん:2006/11/11(土) 14:56:38
>>151
thx!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
153139:2006/11/11(土) 15:10:34
>>146
>バス幅128ビットにしました、けど互換性確保したいから
>4バイト境界です、って可能性もある。
メモリのバス幅が128ビットで、CPU−メモリ間のデータバス幅が32ビットという場合ですね?
データバス幅を32ビットにすると、メモリアクセスは、4の倍数のアドレスから4バイトだけ、
という方法しか許さなくなるわけですか。

>>150
結構収穫ありました。 ググってもさっぱりわかりませんでしたし。

>任意アドレス指定でアドレスされても常にバス幅のデータを正しく吐き出すような
>回路が複雑になることってなんとなく想像できるでしょ。
回路のことはさっぱりわかりませんで、想像出来ませんでした。
154デフォルトの名無しさん:2006/11/11(土) 15:15:36
わけわかめ
155デフォルトの名無しさん:2006/11/11(土) 15:28:22
>>153
>147
>150こそ滅茶苦茶だから。
156デフォルトの名無しさん:2006/11/11(土) 15:34:07
設計次第でバス幅は関係ない。
ハードにその機能があるかどうか。
157デフォルトの名無しさん:2006/11/11(土) 16:09:41
>>156
何が言いたいんだろうw
158139:2006/11/11(土) 16:10:03
>>156
メモリに
・2の倍数のアドレスから2バイトアクセスする
・4の倍数のアドレスから4バイトアクセスする
みたいな機能があるってことですか?
159デフォルトの名無しさん:2006/11/11(土) 16:20:19
そんな訳のわからんこと言ってる奴ほっとけってw
古典的なISAバスでも何でもいいから、メモリやデバイスのアドレスデコード回路が
どうなってるかを調べれば自ずとわかるよ。
160デフォルトの名無しさん:2006/11/11(土) 16:48:39
>>156
そう作るのが大変だから今の設計はほとんどそんな風に
作ってないって話だろうが。

メモリ読みだし単位は決まってた方が作るのに便利って事。
大体から、昔から1ビット単位じゃなくて1バイト単位でアクセスするって
お約束もあっただろ?
161デフォルトの名無しさん:2006/11/11(土) 16:52:18
ARMの命令長は常に1ワード=4バイト。Thumb命令なら1ハーフワード=2バイト。
素直に並べりゃ絶対にアドレス境界を跨がない読み出しになるんだから、
奇数アドレスから読めないことで一体何が困るのか逆に理解できない。
162デフォルトの名無しさん:2006/11/11(土) 17:00:00
>140 >143 あたりで説明おわっとるがな
163デフォルトの名無しさん:2006/11/11(土) 17:40:45
139<どうしてぼくの思ったとおりにならないんですか?
164139:2006/11/11(土) 17:44:07
CISCでも境界を跨げないなら、その境界ってのはどこの制約なのか気になったのです。
>>140を見る限り、境界はメモリの構造によるものと考えていいんでしょうか。
165デフォルトの名無しさん:2006/11/11(土) 18:25:35
だからメモリというよりバスというものの構造から来る制約だといってるだろw

っていうかどうせHW勉強する気がないんだろ?
だったらそういうことにいちいち疑問を持たず、そういうものだと思う態度が正解。
勉強する気もないのにいちいちドチテ坊やするのは愚の骨頂っていうんだよ。
166デフォルトの名無しさん:2006/11/11(土) 18:47:20
>>164
>147も書いているが、各々のプロセッサ設計段階での事情を反映しているだけ。
制約云々は二の次。
167デフォルトの名無しさん:2006/11/11(土) 18:53:01
はぁ。
それ優先順位としては逆だと思いますが。。
168デフォルトの名無しさん:2006/11/11(土) 18:55:52
っていうか、任意アドレスにアクセスできるようにしようと思ったら
どんなハードにする必要があるのか考えれば自明だろうに。。

データバス8本ごとにアドレスデコーダ付けるような冗長な回路が一つの方法だが、
そういう冗長な回路が必要になるだろ
169デフォルトの名無しさん:2006/11/12(日) 10:42:23
>>167
設計・製造コストと機能のトレードオフは、工業製品としてはあたりまえ。
170デフォルトの名無しさん:2006/11/12(日) 21:16:18
宿題クル?
171デフォルトの名無しさん:2006/11/13(月) 01:52:20
m|||-_|||m<キットクル〜
172デフォルトの名無しさん:2006/11/13(月) 09:19:40
VerilogHDLを用いてMINIPSを作成しています。
この状態から命令・それに伴う回路を最低ひとつ分加えて、どんなプログラムでもいいので
この状態で流すより実行サイクル数が短くて済めばそれで正解という課題です。
左2ビットシフトが楽と言われたのですが、
命令の組み込み方やそれを有効に使えるプログラムが分かりません。
2bit sifterやALUといった各モジュールは既に用意されています。

命令表、この空いている所を使って命令を割り当てます
http://www.za.ztv.ne.jp/yosi-h/v6010004fffaf0.jpg

回路図
http://www.za.ztv.ne.jp/yosi-h/v6010007fffaf0.jpg
173デフォルトの名無しさん:2006/11/13(月) 11:59:30
こっちじゃねーの?
暇だからVHDLでも書こうかな@プログラム
http://pc8.2ch.net/test/read.cgi/tech/1043858153/l50

あと
【FPGA/CPLDスレ】 XILINX/ALTERA/Lattice/Actel 03@電気・電子
http://science3.2ch.net/test/read.cgi/denki/1119984464/l50

【Verilog】記述言語で論理設計 Project4【VHDL】
http://science4.2ch.net/test/read.cgi/denki/1143016023/
174デフォルトの名無しさん:2006/11/13(月) 16:10:16
>>173
失礼しました。誘導ありがとうございます。
175デフォルトの名無しさん:2006/11/15(水) 22:35:17
定数(75と37)を確保しその輪をGR1その差をGR2に算出せよって問題わかりますか?
176デフォルトの名無しさん:2006/11/15(水) 23:17:15
75と37の輪?
177デフォルトの名無しさん:2006/11/15(水) 23:20:05
和の間違いでした
178デフォルトの名無しさん:2006/11/15(水) 23:24:35
>>175
data1 db 75
data2 db 37
GR1 ds 1
GR2 ds 1
entry:
mov [data1], [GR1]
add [data2], [GR1]
mov [data1], [GR2]
sub [data2], [GR2]
end
脳内アセンブラだから汎用性ないけどね。
179デフォルトの名無しさん:2006/11/15(水) 23:26:57
>>175
    LD    GR1,A
    ADDL  GR1,B
    LD    GR2,B
    XOR   GR2,=-1
    LAD   GR2,1,GR2
    ADDA  GR2,A
    RET
A   DC   75
B   DC   37
180175:2006/11/16(木) 00:02:06
ありがとうございます!
181デフォルトの名無しさん:2006/11/17(金) 23:42:48
R2<-0
R2<-R2+15
R2<-R2+15
R3<-0
R3<-1
R1<-0
R4<-0
R6<-0
R6<-R3 AND 0x1
if R6=1 go to PC+3
R4<-R3+3
R1<-R1+R4
R1<-R1+R4
R3<-R3+1
R2<-R2-1
if R2!=0 go to PC-8
これだけでこのプログラムが何をやってるかわかりますか?
182デフォルトの名無しさん:2006/11/18(土) 02:05:16
R2 ← 15
R1 ← 0
R4 ← R2 + 3
R4 ← R2 + R4
R1 ← R1 + R4
R1 ← R1 + R4
R2 ← R2 - 1
if R2 != 0 go to PC-6
183デフォルトの名無しさん:2006/11/18(土) 02:40:27
>>182
dです、すみません
自己解決しました
184デフォルトの名無しさん:2006/11/18(土) 17:14:07
問題:キーボードから整数5個を入力して1次元整数配列aにセットし、次にサブルーチンrecuv_add_arrayで配列aの全要素を加算し、結果コーラー側で出力せよ。ただし、サブルーチンは再起型 パラメータは『先頭要素a[m]のアドレス』と『加算すべき要素数』とする。
お願いします。

授業ではttp://www.k.hosei.ac.jp/~i05r4102/までやりました
8
185デフォルトの名無しさん:2006/11/18(土) 17:33:21
何が分からないのか分からない。
186デフォルトの名無しさん:2006/11/18(土) 19:54:00
187デフォルトの名無しさん:2006/11/21(火) 21:31:00
ハンドアセンブルっておもしろいな。ちゃんとプログラムが動いたときの
快感度は他の言語の比にならないぜ。
188デフォルトの名無しさん:2006/11/22(水) 00:41:49
んじゃ、一生やってれば?
でもそれ、ちゃんと動いていると思ってるの自分だけかもよ。
189デフォルトの名無しさん:2006/11/22(水) 00:49:13
ご一緒にポテトはいかがですか?
190デフォルトの名無しさん:2006/11/22(水) 11:11:59
>186
げー、VC2005必須かよ…
191デフォルトの名無しさん:2006/11/23(木) 11:24:17
Express Editionて、Freeで配ってる(配ってた?)だろ?
192デフォルトの名無しさん:2006/11/23(木) 12:35:20
でもアセンブラの為にVC++入れるのアホらしくね?
193デフォルトの名無しさん:2006/11/23(木) 14:47:37
手動で解凍したらFL_ml.exeが出てきたが、
これって使えるん?
194デフォルトの名無しさん:2006/11/24(金) 00:43:01
.pos0x100
irmovl$15,%ebx
rrmovl%ebx,%ecx
loop:
rmmovl%ecx,-3(%ebx)
addl%ebx,%ecx
jmploop

このアセンブリプログラムをアセンブルすると、どんなバイト列が出てくるか。
y86シミュレータ
195デフォルトの名無しさん:2006/11/24(金) 01:11:53
質問はなんですか?
196デフォルトの名無しさん:2006/11/24(金) 01:45:20
なんかもうアセンブラがどうこう以前に日本語でおk、な質問が多いな
197デフォルトの名無しさん:2006/11/24(金) 02:00:36
>>193
ml.exe にリネームすれば普通に使える。
ただしそれだけじゃリンカもライブラリもないから
本当に「アセンブル出来るだけ」になるがな。
198デフォルトの名無しさん:2006/11/25(土) 15:06:41
>>197
d。後で遊んでみる。
199デフォルトの名無しさん:2006/11/30(木) 13:52:24
前回は私の回答に答えて頂きありがとうございました。
今回もまた質問させてください。

mov edi, offset var1(もしくはvar2)
mov al, '-'
mov ecx, lengthof var1(もしくはvar2)
cld
repne scasb
jz(もしくはjnz)

と、言う上のコードを使って、C++などでは
□if(var1 < 0)
□□if(var2 < 0)
□□else
□else
□□if(var2 < 0)
□□else
と現すifelse文を作りたいのですが、どうjzやjnzを使えば良いのか思い浮かびません。
上のifelse文使って、ASCIIで入力された数字の足し算をしたいのですが、
正数同士の足し算はできるのですが、負数同士、もしくは片方が負数でもちゃんと答えが出るようにしたいのです。
取りあえずはifelse文を作りたいです。

助けて頂けるとありがたいです。
200デフォルトの名無しさん:2006/11/30(木) 16:46:50
手元にあるIA-32インテルアーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル中巻と
にらめっこして考えてくれ。

REPNE SCASBで終了する時の条件は2つ。
ECX=0になった時かZF(ゼロフラグ)が立った時。
ALの内容が見つかればZF=1、見つからなければZF=0になるんだろう?

REPNE SCASB
JNZ L1
見つかったときの処理
JMP LE
L1:
見つからなかったときの処理
LE:

ここまででif〜elseは表せると思うけど。
68系とその派生系の石しか扱わないから間違ってるかもだけど。
201199:2006/12/01(金) 10:18:51
ありがとうございました。
何とかIfelse文は出来ました。
ですが、現在は片方が負数の足し算に悩んでいます。

正数同士なら
   mov bh, 0
   mov ecx, 70
   mov esi, 69
   mov edi, 70
addition:
   mov ah, 0
   mov al, var1[esi]
   add al, bh
   aaa
   mov bh, ah
   or bh, 30h
   add al, var2[esi]
   aaa
   or bh, ah
   or bh, 30h
   or al, 30h
   mov sum[edi],al
   dec esi
   dec edi
   loop addition
   mov sum[edi], bh
と書けたのですが、片方が負数の時のも物が書けません。
もしvar1の値が負の数だったら、一度正数に直してvar2 - var1の形に直そうとしたのですが、
aasの使い方が分かりません。

助けて頂けると幸いです。
202デフォルトの名無しさん:2006/12/01(金) 14:40:56
AAA - アンパックBCDの加算結果ALを補正する。繰り上がりが発生するとAH <- AH + 1 CF=1 AF=1
AAS - アンパックBCDの減算結果ALを補正する。繰り下がりが発生するとAH <- AH - 1 CF=1 AF=1

ADDの時みたいに下桁からSUBしてってAASで補正してけばいいんじゃない?
203199:2006/12/01(金) 15:14:05
その方法で試してみたのですが、Var1の値を正数に直して、Var1>=Var2ならば正常な答えが出ました。
ですが、Var1<Var2の場合は答えがおかしくなります。
CMP、jmp、などを使って別の所に飛んでから別の計算式を書いた方が良いのでしょうか…。
204デフォルトの名無しさん:2006/12/06(水) 18:58:54
宿題です!

どのようなc言語プログラムをコンパイルすると、ここで示したアセンブラ言語のプログラムになるか
示せ。また、c言語プログラムとアセンブリ言語の対応関係を示せ。

と言う宿題を出されました。どなたか教えてください!
かなり初歩的なのかもしれませんが;
205デフォルトの名無しさん:2006/12/06(水) 19:00:30
>>204の続きです

fibo:
subu$sp,$sp,40
sw$31,32($sp)
sw$fp,28($sp)
sw$16,24($sp)
move$fp,$sp
sw$4,40($fp)
lw$2,40($fp)
beq$2,$0,$L3
lw$2,40($fp)
li$3,0x00000001# 1
beq$2,$3,$L3
j$L2
$L3:
lw$2,40($fp)
j$L1
j$L4
206デフォルトの名無しさん:2006/12/06(水) 19:01:16
>>205の続きです
$L2:
lw$3,40($fp)
subu$2,$3,1
move$4,$2
jalfibo
move$16,$2
lw$3,40($fp)
subu$2,$3,2
move$4,$2
jalfibo
addu$3,$16,$2
sw$3,16($fp)
lw$2,16($fp)
j$L1
$L4:
$L1:
move$sp,$fp
lw$31,32($sp)
lw$fp,28($sp)
lw$16,24($sp)
addu$sp,$sp,40
j$31
207デフォルトの名無しさん:2006/12/07(木) 00:44:02
質問はなんですか?
208デフォルトの名無しさん:2006/12/07(木) 10:40:36
今CASLの授業をやっているんですがメインルーチン?が自力で作れません。よかったら電卓のプログラムなんですが作っていただけますか!?
画面から3桁以内(符号なしビット)の2つの数字と、1つの演算子を入力して四則演算を行い、結果を画面に表示するプログラムです。
演算子は+, -, *, /を使います。

よろしくお願いします。
209デフォルトの名無しさん:2006/12/07(木) 10:49:26
質問はなんですか?
210デフォルトの名無しさん:2006/12/07(木) 11:05:04
208です。
どうやって作ればいいのかがわからないんですが。
例えば、GR1に何を入力したかをチェックするやりかたとかです。
CAP GR1、MOJI
JZE TADASII

正しいときにジャンプする
正しくなければ通過とかの部分です。
わかりにくくてすいません。
211C++プログラマ:2006/12/07(木) 21:28:30
ターゲット:Pentium4 2.7GHz
コンパイラ VS2005
現在オセロのプログラムを製作しているのですが
アセンブリ言語レベルの事で疑問がでたので教えてください
白石:-1,黒石:1としたとき配列の添字を得るために白石:0,黒石:1
と言う数字を得たいのです
ここでxを石に対応する数字が格納させた変数だとして
(1+x)/2
という計算を行わせて数字を得るのと
if(x == 1){}else{}
で条件分岐させるのではどちらの方が高速なのでしょうか?
あと現在の打ち手を保持している変数を反転させるために(白石を-1としているのはこのためです)
turn *= -1
としているのですがimul命令は遅いとかいう話を聞きました
これはif文で条件分岐させて代入した方がいいのでしょうか?
212それ以前にスレ違いなんだけどね:2006/12/07(木) 21:58:55
>>211
小手先の愚作を労せず、最適化はコンパイラに任せなさい。
上の条件なら例えばif (x > 0) {...; } else {...;}とすれば適当なコードを出してくれるだろうし、
下の処理ならturn *= -1と書かずにturn = -turnすればよかろう。
尤も、その程度の内容だとどのように書いたところで処理速度が問題になるとも思えないが。
#もし本当に処理速度が問題になるのなら、プロファイリングとアセンブラ出力を読む作業は必須だ。
213211:2006/12/07(木) 22:05:41
ありがとうございます、最適化はコンパイラに任せます
アセンブラのコードは読めないので、これから勉強してみます
スレ違いすいませんm(_ _)m
214デフォルトの名無しさん:2006/12/07(木) 23:04:15
ビットフィールド使って、最初から白=0、黒=1を得られるようにしとけばいいんじゃない?
MSXとかCPUが極度に貧弱なマシンでもないかぎり、気にするような事じゃ無いとは思うけど。
215211:2006/12/08(金) 00:13:37
ビットフィールドははじめて知りました
書き換えてみます
ありがとうございます
216デフォルトの名無しさん:2006/12/08(金) 14:49:09
ラベルってプログラムのはじめから数える番地なの?
それとも0から数える番地なの?
↓のソース見るとラベルを参照するときラベルに現在地を足してるみたいなんだけど・・・
ttp://wiki.osdev.info/index.php?%BE%A1%BC%EA%A4%CB%CF%A2%BA%DC%2F16BitOS%BA%EE%A4%EA%2F1#content_1_10
217デフォルトの名無しさん:2006/12/08(金) 18:27:51
どの部分?
218デフォルトの名無しさん:2006/12/08(金) 18:39:19
>>216
質問は日本語で頼むよ。
マジメな話、あんた自分が書いたその文章、自分以外の他人が読んで意味がわかると思うか?

エスパーを期待しても無駄だよ。
ここはムーの投書欄じゃねえからな。
219たくや ◆TakUyA81FM :2006/12/08(金) 18:42:53
db 0eah;
dw process
dw 60h
とか
mov ax,60h
mov ds,ax
mov si,mes
processとかmesのアドレス指定で0600h分足されてる気がするんだけど・・・
もしかして勘違い?
220デフォルトの名無しさん:2006/12/08(金) 19:01:00
何がわからんのかわからんが、ひょっとして開始アドレスが0000:0000だと思ってるのか?
221デフォルトの名無しさん:2006/12/08(金) 19:05:34
なんで0600h分足されてるのかがわからないです
222デフォルトの名無しさん:2006/12/08(金) 19:08:24
だからお前の日本語の方がわからんてw
223デフォルトの名無しさん:2006/12/08(金) 19:15:41
>>221
どういう処理を行ってる(と思う)のか、ソースを順に説明してみてくれないか?
とりあえず、おまえさんがどこで思い違いをしているのか理解できんとエスパーでも無い限り誰も回答できんと思うよ
224デフォルトの名無しさん:2006/12/08(金) 19:31:50
割り込み禁止にして
DFをクリアして
スタックを使えるように07c00hにポインタを置いて
siに7c00hを入れて
dsとesを0にして
割り込み許可

07c00hから256バイト分、00600hに転送

0600h:processにジャンプ ←ここの0600hが何で必要なのかがわからない

dsに0600hを入れる
siにmesのアドレスを入れる

ds:siの1バイト分の内容をalに入れる
siのアドレスを1バイト分ずらす

alが0なら終了

siの内容をスタックに入れる
バイオスコールでディスプレイにalの文字を表示
スタックから取り出したデータをsiに入れる
225デフォルトの名無しさん:2006/12/08(金) 19:36:20
ds:siの1バイト分の内容をalに入れる に戻る
226デフォルトの名無しさん:2006/12/08(金) 19:41:53
訂正

0060h:processにジャンプ ←ここの0060hが何で必要なのかがわからない

dsに0060hを入れる
227デフォルトの名無しさん:2006/12/08(金) 20:10:36
わからんな。farジャンプがわからんわけでも無さそうだし、コピーしてるのは理解してるようだし。何がわからんのかわからん。
コピーやジャンプ自体が不要とかいうんだったらまだ質問の意図が理解できるんだが。

>←ここの0060hが何で必要なのかがわからない
何で不要だと思うんだ?
それを無くしたらどうなると思う?
228デフォルトの名無しさん:2006/12/08(金) 20:31:52
無くしたらどうなるのかわからないです
jmp processじゃあだめなんですか?
229デフォルトの名無しさん:2006/12/08(金) 20:40:51
>07c00hから256バイト分、00600hに転送
これが何をコピーしているか具体的にわかってるよね?
230デフォルトの名無しさん:2006/12/08(金) 20:44:31
このソース全部をコピーしているんですよね?
231デフォルトの名無しさん:2006/12/08(金) 20:58:44
BIOSがフロッピーのプログラムをメモリの07c00hに置いて
次に読み込むプログラムをメモリの07c00hに置くために
メモリの00600hに位置を変えるんですよね?

processとかの位置も変わるんですよね?
でも、jmp processじゃあprocessには飛べないんですか?
232デフォルトの名無しさん:2006/12/08(金) 21:14:23
0060h:mesもなんで0060hが必要なのかわからないです
233デフォルトの名無しさん:2006/12/08(金) 21:28:31
>このソース全部をコピーしているんですよね?
ソースというかコンパイル後のバイナリね。

>BIOSがフロッピーのプログラムをメモリの07c00hに置いて
>次に読み込むプログラムをメモリの07c00hに置くために
>メモリの00600hに位置を変えるんですよね?
そう。

>processとかの位置も変わるんですよね?
>でも、jmp processじゃあprocessには飛べないんですか?
>0060h:mesもなんで0060hが必要なのかわからないです

jmp processだとCS:processにジャンプする事になるぞ。
コピー先(0060:process)に移動するにはfarジャンプじゃないと。
このコードはprocess以前は07c00以降、process以前は直前にコピーされた00600以降のアドレスで動く(far Jumpするからね)。
ラベルの位置は先頭を0としたオフセットになるから先頭を0060:0000にしないとmesの位置とかがずれてくる。
234デフォルトの名無しさん:2006/12/08(金) 21:53:54
ttp://www5c.biglobe.ne.jp/~ecb/assembler/assembler00.html
↑でソースを見ながらニーモニックの意味を調べてちょっと勉強してたんですけど
jmpのセグメントってCSなんですかぁ
ラベルの位置もよくわかっていませんでした
CSの動きについてもあまりよくわかってないんでちょっと勉強してきます・・・
ありがとうございました
235デフォルトの名無しさん:2006/12/08(金) 22:41:23
もしかして86系の石ってリロケータブルなコード書けない?
・・・んなわけないよなぁ。
236デフォルトの名無しさん:2006/12/10(日) 00:26:17
>>235
完全にとは云わないが、書ける筈だけど。
セグメント・レジスタも有ることだし。

jump命令は、普通セグメント内ジャンプしか
使わないだろ。
237デフォルトの名無しさん:2006/12/13(水) 21:32:51
C言語でインラインアセンブラを使って動作中のプログラムの
グローバル変数やstatic変数が格納されてる定数領域の
開始アドレスとサイズを取得したいんだけど、可能ですか?
どなたか知恵をお貸しください。

ちなみにスタック領域のアドレスとサイズの取得は
以下のコードでできました。
NT_TIB* getTIB(void) {
NT_TIB* pTib;
__asm {
mov eax, dword ptr FS:[18H];
mov pTib, eax;
}
return pTib;
}
238デフォルトの名無しさん:2006/12/13(水) 22:18:47
>>237
C言語つーのはgccのってことでいいんかい?
239237:2006/12/13(水) 22:27:30
>>238
はいそうです
240237:2006/12/13(水) 22:49:56
連投すんません。
gccでもVCでもWindows上で動作するんであればおkです。
241デフォルトの名無しさん:2006/12/14(木) 21:13:48
超低レベルな質問です
同じ内容の数値計算をさせた場合Fortranとアセンブラじゃどちらが速いですか?
242241:2006/12/14(木) 21:15:02
アセンブラじゃなくてアセンブルですね・・・
243デフォルトの名無しさん:2006/12/14(木) 21:19:56
アセンブリ:アセンブル:アセンブラ
=プログラミング言語:コンパイル:コンパイラ
244デフォルトの名無しさん:2006/12/14(木) 21:28:47
>>241
本質的にはアセンブラが負けることはないが、
実際にはそうもいかないのが難しいところ。
結局はコードを書く人の能力による。
245デフォルトの名無しさん:2006/12/14(木) 21:36:14
つーかアセンブラで数値計算なんてやりたくねーな
246デフォルトの名無しさん:2006/12/14(木) 21:39:36
アセンブラの宿題質問スレ
コンパイラの宿題質問スレ
247デフォルトの名無しさん:2006/12/14(木) 21:42:13
このスレ見直したらやっぱ誤用が多いね。
248デフォルトの名無しさん:2006/12/14(木) 21:44:40
言っとくが、スレタイのアセンブラは
アセンブリ言語のことだからな。
249デフォルトの名無しさん:2006/12/15(金) 00:14:46
事務計算だとアセンブリ言語使った方がマシだったりすることもあるよな。
石によるけどさ。
250デフォルトの名無しさん:2006/12/15(金) 11:19:28
宿題がサッパリ分からないのでお願いします。CPUはARMです。

digitsDCB"1024",0
のように0で終わっている数字だけの文字列を見て、それで表される10進法の数値と
同じになるデータを作ってbinary番地に入れるプログラムを書け。今の例ではそのデータは2進数としては
100 0000 0000
である。このような変換は10進2進変換と呼ばれる。そのプログラムを使って
digitsDCB"123456789",0
のときにbinary番地に入る値を16進表示で答えよ。
(ヒント)"1024" = '1', '0', '2', '4' = 0x31, 0x30, 0x32, 0x34
であるから文字'1'から数値1を得るためには、その文字のコードと0x0fのandをとればよい。また、
1024 = 1*103+0*102+2*10+4 = ((1*10 + 0)*10 + 2)*10 +4
であるから、1文字を読むたびに、その文字コードから数値を作り、
それまでに計算しておいた値(上記の最後の式の括弧内の値)を10倍したものに加えればよい。
int result = 0; int index = 0;
while ( (byte b = digits[index++]) != 0 ){
result = result*10 + (b & 0x0f);
}
binary = result;
251デフォルトの名無しさん:2006/12/15(金) 19:59:32
わからないってどういう事?
ヒントの所に回答そのものが日本語で書いてあるのに。
252CASL:2006/12/15(金) 22:18:59
253デフォルトの名無しさん:2006/12/16(土) 01:37:40
>>237
ifで使われているptr_SE[i].Characteristicsのフラグについては↓に書いてある
ttp://www.geocities.jp/winapi_database2/special/2001_10_11/page7.html
あと、const宣言は.rdata、static宣言は.data(初期値あり)、.bss(初期値なし)に配置されたと思う‥‥
って、全然アセンブリ言語じゃないや。

#include <stdio.h>
#include <windows.h>

int main(int argc,char *argv[])
{
 PIMAGE_DOS_HEADER ptr_MZ;
 PIMAGE_NT_HEADERS ptr_PE;
 PIMAGE_SECTION_HEADER ptr_SE;
 int i;

 ptr_MZ = (void*)GetModuleHandle(0);
 ptr_PE = (void*)ptr_MZ + ptr_MZ->e_lfanew;
 ptr_SE = (void*)ptr_PE + sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER) + ptr_PE->FileHeader.SizeOfOptionalHeader;

 for(i = 0 ; i < ptr_PE->FileHeader.NumberOfSections ; i++) {
  if(!(ptr_SE[i].Characteristics & IMAGE_SCN_MEM_WRITE)) {
   printf("Address: %p\n",ptr_MZ + ptr_SE[i].VirtualAddress);
   printf("Size: %d\n",ptr_SE[i].Misc.VirtualSize);
  }
 }
 return 0;
}
254237:2006/12/16(土) 14:10:03
>>253
レスありがとうございます。
まさにコレのようです。

当方の環境(Visual Studio 6.0)ではエラーがでるので、
修正しつつ参考にさせて頂きたいと思います。

数日間探しても見つからなかったのでとても助かりました。
ありがとうございます。
255250:2006/12/18(月) 23:55:11
>>251
それをプログラムでどう書けばいいのか分からないんです・・・
256デフォルトの名無しさん:2006/12/19(火) 22:23:32
MASM32を入れて、アセンブラの勉強もしてみようとおもったのですが
良い入門書は無いですか?
高級言語プログラマのためのアセンブラ入門と
http://www5c.biglobe.ne.jp/~ecb/assembler/assembler00.htmlのページを
見ながら勉強しようと思ったのですが、高級言語プログラマのためのアセンブラ入門は
なんか辞典みたいな感じで、アセンブラのページを読むと
なんとなくわかるにはわかるけど、なんでセグメント全部同じ名前にしてんだろ
とか、21hみたいな命令の意味とか、よくわからないのがやっぱ多いです。
で、やっぱり入門書を買おうと思うのですが、お勧めを教えてください。
CPUはIntel(R)Celeron(R)Mです。
257デフォルトの名無しさん:2006/12/20(水) 00:38:54
>>256
>なんでセグメント全部同じ名前にしてんだろ
EXEファイルでは無くて、COMファイル作る為?
>21hみたいな命令
「int 21h」これは、MS-DOSのシステム・コールを
呼出す為だと思う。
258デフォルトの名無しさん:2006/12/20(水) 19:38:40
     LD    GR2,A
LOOP SUBA  GR2,B
     LAD   GR1,1,GR1
     CPA   GR2,B
     JPL   LOOP
     RET
A    DC   200
B    DC   10

caslで上みたいな割り算をした時、割り切れる場合
GR1が19までいくと終了してしまうんですがどうすればいいでしょうか?
金種計算みたなのを作りたいんです
259デフォルトの名無しさん:2006/12/21(木) 00:39:00
>>258
 「JPL LOOP」の「JPL」が悪いみたいだけど。
 JPLって、Jump largeの意味?
 「JPLE LOOP」とすべきでは。
 JPLEは、Jump large or equal。
260258:2006/12/21(木) 01:04:18
JPLEって言う命令は無いみたいなんですが…
エラーが出てきます
261デフォルトの名無しさん:2006/12/22(金) 00:19:46
>>258
ゴメン、一応考え方として書いただけで、
CASLはやった事がない。
無い場合は、その命令と等価となるような
処理に作り換えるとか。
262デフォルトの名無しさん:2006/12/31(日) 23:33:16
宿題でなくてすみませんが、質問です。

とりあえずi386以降のニーモニックは分かるのですが、MASMの擬似命令とか
宣言の使い方を例題で詳しく説明したサイトや本のお勧めはありますか?

セグメントがどうこうとか考えずにNASMで楽してたので、MASMは全然分かりません。
263デフォルトの名無しさん:2006/12/31(日) 23:46:41
264デフォルトの名無しさん:2006/12/31(日) 23:51:18
>>263 サンクス

265デフォルトの名無しさん:2007/01/02(火) 20:21:24
今累乗のプログラムを作成しようとしているのですが,うまく動作しません.
具体的にはx^nをやろうとするとx^2の結果しか返ってきません.
以下のアセンブリコードなのですが,どこか間違っているでしょうか?
SPARCを使用しています.
よろしくおねがいします.(3^4をやろうとしているが,9が帰ってきてしまう)
mov 3,%l0
mov 4,%l1
mov %l0,%o0
mov %l0,%o1
loop:
call .umul,0
nop
dec %l1
cmp %l1, 0
bne loop
nop
266デフォルトの名無しさん:2007/01/02(火) 21:25:20
>>265
Sparc 知らんから間違いの指摘はできないけど、
デバッガでステップ実行してみればいいんじゃないか?
267デフォルトの名無しさん:2007/01/02(火) 22:48:06
>>265
.umulが%o0 * %o1の結果を、%o0 %o1のどちらかに代入してると思うのだが、
もう一方も何かしらの値が代入されているということはないかい?

あと、それだとxにxをy回掛けることになって、x^(y+1)になると思うのだが?
268265:2007/01/02(火) 23:55:07
>>267
どうもアドバイスありがとうございます.
指摘された通り%o1が.umulを実行した後に0になっていたのが原因でした.
かける回数も直せました.
本当にありがとうございました.
269デフォルトの名無しさん:2007/01/03(水) 22:03:30
以下のURLにうpったプログラムが動作しませんorz
SPIMでシュミレーションしてるのですが…
解決策があればご伝授ください。

プログラムソース: http://www.uploda.org/uporg641230.asm
270デフォルトの名無しさん:2007/01/03(水) 22:39:34
どう動かないんだよ。
271デフォルトの名無しさん:2007/01/03(水) 23:45:22
とりあえずダウンしてみたけど
漏れには必要無いことが分かったので消した
272デフォルトの名無しさん:2007/01/04(木) 01:26:18
>>269
俺ならば、「addi」みたいな命令は、registerを初期化してから
使用するけど。
273269:2007/01/04(木) 02:01:06
ありがとうございます。

なんか__startに異常があるみたいなメッセージが出てくるのですがそれがよくわかりません。
loadすら出来ないです。
274デフォルトの名無しさん:2007/01/04(木) 03:48:38
じゃあそのメッセージをここに貼るとかそういうことを思いつきませんか
275デフォルトの名無しさん:2007/01/04(木) 05:19:40
標準のトラップハンドラを読み込んでるからだな。
トラップハンドラを読み込まないか、
__startではなくmainにすれば良いと思うよ。
276269:2007/01/05(金) 03:30:24
>>274-275
ありがとうございます。
無事に実行できました。

ものすごく低レベルな質問をしているのかもしれませんが、
プログラムのmain以下14行目の

lw $t4, 0($a2)で、

その上のaddの行実行前に$t8に00000000、$gpに10008000が入ってる状態です。
addにより$a2にはその和の10008000が入るというのは理解できるのですが、
その後のlwの行の操作で
$t4に00000063が代入されるのが何故か分かりません。

どうかご教授ください。よろしくお願いします。
(プログラム >>277-278)
277269:2007/01/05(金) 03:32:24
プログラム前半部分
.data0x10008000
.word100
.word99
.word98

(以下.word 0まで続きます)

.text
.globl__start
__start:
addi$t0, $zero,0
addi$t2, $zero,100
addi$t7, $zero,4
addi$t9, $zero,1
sub$t0, $t2, $t9
loopi:
slt$t3, $t0,$zero
bne$t3, $zero,progend
addi$t1, $zero,0
278269:2007/01/05(金) 03:32:53
後半部分
loopj:
slt$t3, $t1,$t0
beq$t3, $zero,loopiend
mult$t1, $t7
mflo$t8
add$a2, $gp, $t8
lw$t4, 0($a2)
add$a3, $a2,$t7
lw$t5, 0($a3)
slt$t6, $t5, $t4
beq$t6, $zero,loopjend
sw$t4, 0($a3)
sw$t5, 0($a2)
loopjend:
addi$t1, $t1, 1
jloopj
loopiend:
sub$t0, $t0, $t9
jloopi
progend:
279デフォルトの名無しさん:2007/01/05(金) 03:39:05
これだろ

.data0x10008000
.word100
.word99
280269:2007/01/05(金) 03:53:20
>>279
申し訳ないです。。さっぱり…
なぜ63が出てくるのかという点から掴めませんorz

加えて、質問箇所の下のadd $a3. $a2, $t7では
$a2に10008000, $t7に4が入ってるので$a3は10008004になったのですが
その下のlwで$t5に何故63が入るのでしょう…?
281デフォルトの名無しさん:2007/01/05(金) 09:35:28
その63って16進数だろ、10進数に直せば99だ。
282269:2007/01/07(日) 07:15:25
何度もすみません。。
10008000の内容は64(100)だと思うのですが、
何故63が入るのでしょう…?
283デフォルトの名無しさん:2007/01/07(日) 07:37:14
>>282
1008004の内容が63(99)だから。

sw$t5, 0($a3)
$a2じゃないぞ、$a3だぞ?
284デフォルトの名無しさん:2007/01/07(日) 07:37:59
0が一個抜けたorz
285デフォルトの名無しさん:2007/01/08(月) 02:25:48
lw $t4, 0($a2)で、

その上のaddの行実行前に$t8に00000000、$gpに10008000が入ってる状態です。
addにより$a2にはその和の10008000が入るというのは理解できるのですが、
その後のlwの行の操作で
$t4に00000063が代入されるのが何故か分かりません。
286デフォルトの名無しさん:2007/01/08(月) 02:35:27
$t4に00000063が代入されたとき、10008000はいくつになってる?
287ふぃb:2007/01/11(木) 20:48:30
ご教授願いますm(_ _)m
MacOSでアセンブラを勉強し始めたのですが、再帰関数のところで
フィボナッチ数列の実装ができません・・・
CPUの名前がよくわからないのですが、↓こういう アセンブラです

.text
.align 2
.globl _fact
_fact:
# linkage area
mflr r0
stw r0, 8(r1)
mfcr r0
stw r0, 4(r1)
# create stack frame
stwu r1, -64(r1)
# action
cmpi cr7,r3,1
bgt cr7,CALL
li r3,1
b RET
CALL:
stw r3, 88(r1)
subi r3,r3,1
.....................
288デフォルトの名無しさん:2007/01/11(木) 21:19:27
CPUが分からないって?
???
289デフォルトの名無しさん:2007/01/11(木) 22:00:41
>287
PCの機種名でもアセンブラの名前でも良いから書いてみそ
290デフォルトの名無しさん:2007/01/12(金) 00:11:27
マック使いってみんなこんなレベルなんだろうか。
自分が使ってるマシンのMPUもわからないなんて・・・。
291デフォルトの名無しさん:2007/01/12(金) 00:27:58
機種名モデル名購入日OS名その他知らない香具師もかなりいる
292デフォルトの名無しさん:2007/01/12(金) 10:21:56
MacOSでのスタックフレーム処理を理解する or 再帰を諦めてループを使って実装する
どっちか好きな方を選んでくれ。
293ふぃb:2007/01/12(金) 13:45:18
>298
すみません。アセンブラはgccです。

>292
スタックフレーム勉強します><
294デフォルトの名無しさん:2007/01/12(金) 18:10:41
つーか自分の機種すら分からないのは開発やる人間として大問題
295デフォルトの名無しさん:2007/01/12(金) 18:24:56
PowerPCか何かかな?
296デフォルトの名無しさん:2007/01/12(金) 18:29:29
NASM
297ふぃb:2007/01/15(月) 13:08:49
自己解決しました。
すいません
298デフォルトの名無しさん:2007/01/18(木) 14:48:39
15-1 再帰的に階乗を計算するサブルーチンを作れ。(注: 階乗F(n) はF(n) = n × F(n − 1) で計算する。)
15-2 自分の作ったサブルーチンで計算できる最大のn を求められるようプログラムを改良し、n を求めよ。

FLOAT1 START
LD GR0,F
CALL EXT
ST GR2,SIGN
ST GR3,EXP
ST GR1,SIG
RET
EXT LD GR1,GR0
(1-1)
(1-2)
LD GR2,GR1
LD GR1,GR0
299続き:2007/01/18(木) 14:49:26
(2-1)
(2-2)
(2-3)
LD GR3,GR1
LD GR1,GR0
(3)
RET
F DC #7C00
SIGN DS 1
EXP DS 1
SIG DS 1
END
16-1 (1-1),(1-2) を埋めよ。
16-2 (2-1),(2-2),(2-3) を埋めよ。
16-3 (3) を埋めよ。


初心者です。よろしくおながいします。
300デフォルトの名無しさん:2007/01/18(木) 17:52:20
>>298
初心者でも何でもいいけど、処理系(CPU,アセンブラ)くらい書かないとエスパーしか答えられないよ。
301デフォルトの名無しさん:2007/01/18(木) 21:06:16
これは多分CASLだな。
問16は問題文が欠けてないか?
せめて何を目的にしたプログラムかは書くべきだと思うんだが。
302デフォルトの名無しさん:2007/01/19(金) 02:27:35
F CPL GR1,=2 ;階乗サブルーチン15-1 引数:GR1 戻値:GR0
JMI FRET1 ;入力が0または1ならば、1を返す
SUBL GR1,=1
CALL F ;再帰呼び出しでF(n-1)を求める
ADDL GR1,=1
PUSH 0,GR1 ;GR1とGR2を待避
PUSH 0,GR2
LD GR2,GR0
FMUL SUBL GR1,=1 ;乗算ループ
CPL GR1,=0
JZE FEND
ADDL GR0,GR2
JUMP FMUL
FEND POP GR2 ;GR1とGR2を復帰
POP GR1
RET
FRET1 LD GR0,=1
RET
303ゆー:2007/01/21(日) 18:21:22
ARMアセンブラについて質問です。

CMNは符号を反転させて比較するものですよね?
たとえば r0番地に3、r1番地に-5 があるとします。
そして

CMN r0,r1

と書いたらどっちの符号が反転されるんですか?
両方されたら意味ないですよね?
お願いします!!!
304デフォルトの名無しさん:2007/01/21(日) 18:35:32
>>303
ヒント:ステータスレジスタ
305ゆー:2007/01/21(日) 18:40:29
N Z C V
のことですか?あまり詳しくないのでよくわかりません・・・
306デフォルトの名無しさん:2007/01/21(日) 19:50:47
ARMアーキテクチャリファレンスマニュアルが無料で配られてるから
それをもらってきてよく読むように。

まず、CMPとCMNは比較命令だから、オペランドに指定したレジスタの内容は変化しない。
そして、CMNでも2番目のオペランドは符号反転しない。
CMPが1番目から2番目を減算した結果で条件コードフラグを変化させる命令なら
CMNは1番目に2番目を加算した結果で条件コードフラグを変化させる命令。
CMP基準でみると動作が「1番目から符号反転させた2番目を減算させた結果で変化してる」ように見えるだけ。
307ゆー:2007/01/21(日) 19:59:32
どこで配られてるんですか?
そういうことですか!
ありがとうございます。
308デフォルトの名無しさん:2007/01/21(日) 20:09:05
309ゆー:2007/01/21(日) 21:11:22
ダウンロードしました!!!
ありがとうございます。
310ゆー:2007/01/21(日) 22:58:25
すみません。
MOVとMOVSの違いがいまいちわかりません。
マニュアル見てもよくわかりません↓
お願いします><
311デフォルトの名無しさん:2007/01/22(月) 01:41:39
Sの有無はステータスレジスタを更新するかどうか。
今アーキテクチャリファレンスマニュアルひけないんで代わりのポインタ張っとく。
ttp://www.bomber.co.jp/chaola/docs/ARM/inst_ARM.html#5.1

MOVはシフト代わりに使えるから、その用途で使ったとき一緒に
ステータスレジスタを更新して欲しい場合がある。そのときMOVSを使う。
312デフォルトの名無しさん:2007/02/12(月) 16:42:41
アセンブラの条件分岐命令で
BLEとBGTの意味がわかりません。
どういう意味でしょうか?
313デフォルトの名無しさん:2007/02/12(月) 16:57:12
>>312
ニモニックセット依存。
恐らくは、前者はbranch if (register) less than or equal to (operand)の意で
後者はbranch if (regster) greater than (operand)の意だろう。
314デフォルトの名無しさん:2007/02/12(月) 17:12:27
ありがとさん
315デフォルトの名無しさん:2007/02/15(木) 15:09:01
SEP-3についての質問です。
C言語のprintf()は、printf("10\n")ともprintf("%d\n#",10)とも書くことが
できる。つまり、引数の数はいくつあってもよい。このようなサブルーチン
を実現するには、サブルーチンprintfをどのように記述し、どのようにして
呼び出せばよいだろうかっていう問題です。
よくわかりません。
316デフォルトの名無しさん:2007/02/15(木) 15:29:46
#include <stdarg.h>

int vprintf(const char *format, va_list ap);
int vfprintf(FILE *stream, const char *format, va_list ap);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
317デフォルトの名無しさん:2007/02/15(木) 15:51:24
315追記です
アセンブラ言語でどのように書けばよいかっていう問題です。
318デフォルトの名無しさん:2007/02/15(木) 16:11:42
スタックに積まれている情報を変換子(%何とか)に対応させてアクセスするんでしょ。
vsprintf(wk,format,int1,int2,int3) なら、後ろからpush5回、call だから、スタックポインタの
すぐ後は復帰アドレス、その次からwkのポインタ、formatのポインタ。format解析の中で
%何とかに出会うたびにSP+2ワード+nワードをアクセスすればいい。
319デフォルトの名無しさん:2007/02/15(木) 16:49:57
#もう〜
#つまんなすぎっ!
320デフォルトの名無しさん:2007/02/19(月) 11:40:14
お願いします。

68HC11で8BIT、MPUなのですが、
逆アセンブラがありません。
ダウンロードサイトに、DOS環境で動くものはあるのですが、
使い方がわかりません、
アセンブルする方法教えてください、初心者ですみません
321デフォルトの名無しさん:2007/02/19(月) 12:34:45
>>320
初心者だから知らなくても仕方ないが、逆アセンブラがなくてもアセンブラがあればアセンブルすることは可能だ
322デフォルトの名無しさん:2007/02/19(月) 13:40:24
>>321
レスありがとうございます

プログラムが16進数で書いてあり、読める形にしたいのですが
どうしたら、ふるいMPUなのでコード表もありません、
ウインドウズ環境で動く逆アセンブラのソフトないですかね?
323デフォルトの名無しさん:2007/02/19(月) 14:21:22
ベクターにこのようなソフトありますが
使い方わかりません
http://www.vector.co.jp/soft/dos/prog/se358557.html

お願いします
324デフォルトの名無しさん:2007/02/19(月) 20:16:15
>>322
> どうしたら、ふるいMPUなのでコード表もありません、
英語でいいならフリースケール・セミコンダクタの英語サイトに行けば無料配布してるぞ。
ProduntsからHC11ってのを選べばいろいろ出てくる。
325デフォルトの名無しさん:2007/02/19(月) 20:17:10
Productsな。cが横にこけた。
326デフォルトの名無しさん:2007/02/20(火) 04:56:38
実行コードしか残ってないソフトを逆アセンブルして修整したい、とかそういう事情?
8bitのソフトなんてちっちゃいんだから、作っちゃったほうが手間要らないのでは?
327デフォルトの名無しさん:2007/02/20(火) 06:22:06
6809の正常進化版? 6809用だったら古いフロッピーに一式入っているんだが。
問題は、今時5.25"を読める環境がないことだなw

勉強がてら、自分で作るのお勧め。
なーに、バイナリモジュールを16進ダンプかHEXフォーマットかSフォーマットにしてやって、
それを入力に使えばスクリプト形言語でちょちょいのぱーだよ。
328デフォルトの名無しさん:2007/02/20(火) 13:47:34
>>326
>>327
ご指導ありがとうございます
初心者すぎて、ちょっと無理みたいです、
データアップロードしますので、どなたかお願いします
329デフォルトの名無しさん:2007/02/20(火) 18:57:41
まて、今時初心者が何で6811なんか触る?
330デフォルトの名無しさん:2007/02/21(水) 03:11:50
>>328
アップロードします
http://up.kabubu.net/cgi/up2/upload.php
ファイル名 ”68hc11バイナリ
よろしくお願いします。
331デフォルトの名無しさん:2007/02/21(水) 03:15:42
すいません
ファイル名”バイナリーファイル68hc11”でした
332デフォルトの名無しさん:2007/02/21(水) 20:36:21
Disassembler拾ってきて試してみたが
これってプログラムじゃなくて何かのデータなんじゃ・・・?
333デフォルトの名無しさん:2007/02/22(木) 00:19:17
確かに、3/4はデータっぽいね。
334デフォルトの名無しさん:2007/02/22(木) 02:57:35
>>332
>>333
どこかにアップしてもらえませんか?
よろしくお願いします。
335333:2007/02/22(木) 06:43:42
アップも何も、私ゃダンプ眺めただけだがね。
32KBのうち、オフセット0x1d1cから0xffが集中して入っているし、
オフセット0x20e0からは3バイト+1-2バイトのタグ型データ構造に見えるし、
他にもいかにもデータって感じでバイト列が並んでいるがね。
336デフォルトの名無しさん:2007/02/22(木) 13:59:22
一応RTSを中心にしてその前後を見て回ったけど、意味のあるコードが見つからなかった。
全部Bxxとかの条件分岐だけで飛んでたりしたら嫌だなぁ。
眺めてるとだんだん無圧縮のスプライトパターンデータとかに見えてくる。
これの出所ってどこ?
337デフォルトの名無しさん:2007/02/23(金) 02:33:30
>>336
ボッシュの8ビットCPUです。
なんとかなりませんか?
338デフォルトの名無しさん:2007/02/23(金) 02:36:33
経緯も何も判らんでなんとかなりませんか言われても、なんともなりませんがな。
339デフォルトの名無しさん:2007/02/23(金) 03:00:02
ECUのROMか?
340デフォルトの名無しさん:2007/02/23(金) 03:29:25
ECU?車のコンピュータみたいですが。
エンジンコントロール用みたいです、
341デフォルトの名無しさん:2007/02/23(金) 09:22:12
だとしたら暗号化ぐらいされてるかもよ。ROMから逆アセンブルされることも想定して。
もしそうなら暗号化キーがなきゃお手上げ。
342デフォルトの名無しさん:2007/02/23(金) 12:29:26
っていうか、昔から勘違いしてる奴が多いけど(PC-8001の例の事件の影響だろうけど)
逆アセンブルしたソースを人が読める形に修正する、なんて殆どの場合不可能だよw

可能な場合なんてむしろ例外的。
それは人的資源の質や量の問題と無関係に、ね。
343デフォルトの名無しさん:2007/02/23(金) 12:53:31
いや寧ろ、逆アセンブルしたものが読めるようになってもハード構成やOSの仕様などが判らんとお手上げなケースが多いわけで。

>>337
エンジンコントロール用と言ったって、アクセル開度制御しかしないのと空燃比から加給器の制御までするのとでは全然違うわけだが。
少なくとも可読文字で数字が並んでたりするので、自分でダンプくらい眺めなさいよ。
344デフォルトの名無しさん:2007/02/23(金) 13:03:09
こことかどうよ

【チューン】ECUって難しいの?【仕上げ】
http://hobby9.2ch.net/test/read.cgi/car/1161445315/l50
345デフォルトの名無しさん:2007/02/24(土) 03:47:57
>>341
暗号キーは無いみたいです、

土日でイロイロ調べてみます、
お世話になるかもしれませんがよろしくお願いします
346デフォルトの名無しさん:2007/02/24(土) 18:09:35
犯罪の手助けをしろと言うのですね。
347デフォルトの名無しさん:2007/02/25(日) 05:15:02
経過報告します。
ハンドアセンブルしようとデータシート探しても見つからず、、、、


348デフォルトの名無しさん:2007/02/25(日) 17:33:23
>>346
何の罪になると言うんだ?
349デフォルトの名無しさん:2007/02/25(日) 18:54:54
>>348
逆アセ自体を禁止しているものであれば、、ということだろう。
350デフォルトの名無しさん:2007/02/25(日) 20:49:28
まあ普通契約で禁止されてるな。
少なくとも「是非やってください」と言うところはない。
351デフォルトの名無しさん:2007/02/26(月) 08:27:27
契約で禁止されてたって、契約違反にはなっても犯罪にはならないでしょ。
法律で禁止されてるのを破るのが犯罪。
352デフォルトの名無しさん:2007/02/26(月) 21:32:32
すごい斬新な発想だなw
353デフォルトの名無しさん:2007/02/26(月) 23:27:06
>>351
間違ってますよ、その認識。
354デフォルトの名無しさん:2007/02/27(火) 10:08:41
>>353
よければ詳しく。
355デフォルトの名無しさん:2007/02/27(火) 13:18:38
>>352,353が認識している犯罪の定義を知りたい。
356デフォルトの名無しさん:2007/02/27(火) 16:23:38
MIPSアセンブリを使って $f12にあるfloat型のインプットをASCII ストリングに変換する
関数を書きたいです。 $a0に変換されたストリングを保管するアドレスが渡されるという前提です。
357デフォルトの名無しさん:2007/02/27(火) 16:24:24
関数の名前はitofです
358デフォルトの名無しさん:2007/02/27(火) 18:08:50
逆アセンブラて、してはいけないのですか?
アセンブラの勉強のために、質問してただけなんですけど。
大丈夫ですよね、、、、、

で、結果報告です、
ハンドアセンブラしようとデータシート探しましたが見つからず
おまけに、68hc11ではなくて、6803?の疑問が浮上しました
1993年に68hc11発売されていましたか?教えてください
359デフォルトの名無しさん:2007/02/27(火) 18:42:22
>>358
1984年発表。
360デフォルトの名無しさん:2007/02/27(火) 23:17:56
問題
a=b+cを実現するためのアセンブラを示し、その横にマシン語を示すこと
ただし、aは100h番地、bは10h番地、cは20h番地に割り当てられているとする(hは16進数の表現の意味)

おねがいします
361デフォルトの名無しさん:2007/02/27(火) 23:26:29
>>355
まったく・・・
犯罪:罪を犯すこと。また、犯した罪。
罪:法律的・道徳的・宗教的な規範に反する行為。など
つまり、違法かどうかと犯罪とは必ずしも対ではない。
362デフォルトの名無しさん:2007/02/28(水) 00:11:29
おいおいアホだろw

激しくスレ違いだけど、契約って行為そのものが法律行為だから
これを履行しないことは違法性を構成するに決まってるじゃんw

っていうか、法的拘束力のない契約にそもそも何の意味があるんだよw
363デフォルトの名無しさん:2007/02/28(水) 00:38:19
>>362
契約は、必ずしも法律行為ではないよ。
364デフォルトの名無しさん:2007/02/28(水) 04:19:47
エンジニアが逆アセンブルするのは必然だが
素人が趣味で解析したがるのは迷惑。
自分のマニアっぷりを自慢するために解析結果を公開したりするし。
365デフォルトの名無しさん:2007/02/28(水) 04:23:00
>>358
心配ならメーカに問い合わせたら?
つーか、アセンブラの勉強のためなら逆アセンブルするのは無意味だよ。
前から何人も書いているけどコード部とデータ部の区別やら環境やらが判らんと意味を為さないし。
そんなことよりも、アセンブラの勉強のためなら素直にアセンブラで書かれたソースを読めばいいじゃない。
366デフォルトの名無しさん:2007/02/28(水) 05:45:41
>>360  こんなんでいいの?
;  a=b+cを実現するためのアセンブラを示し、その横にマシン語を示すこと
;  ただし、aは100h番地、bは10h番地、cは20h番地に割り当てられているとする
            CSEG
0000 2A1000    lhld    010h   ; b
0003 EB       xchg
0004 2A2000    lhld    020h   ; c
0007 19       dad    D
0008 220001    shld    0100h  ; a=b+c
000B         END
367デフォルトの名無しさん:2007/02/28(水) 15:07:48
>>366
ありがとうございます!

とても助かりましたー
368デフォルトの名無しさん:2007/03/02(金) 19:32:51
68hc11のコード表 激希望
アップロードお願い
369デフォルトの名無しさん:2007/03/02(金) 20:04:42
検索しろよ
370デフォルトの名無しさん:2007/03/03(土) 02:29:30
>>368
オペコードマップ
ttp://home.earthlink.net/~tdickens/68hc11/68hc11_opcode_map.html

命令表
ttp://home.earthlink.net/~tdickens/68hc11/68hc11_opcode_map.html

どっちも英語ではあるけど、表だから問題なく読めるよね。
371デフォルトの名無しさん:2007/03/03(土) 04:35:10
どっちもオペコードマップになっている希ガスw
ってことで、ここからオペコードマップにも命令リストにもアクセスできる。
ttp://home.earthlink.net/~tdickens/68hc11/docs_references.html
372デフォルトの名無しさん:2007/03/03(土) 13:34:21
>>370
>>371
ありがとうございます、今週は進むと思います
373デフォルトの名無しさん:2007/03/04(日) 23:58:34
>>372です
今週は少し進みましたが、、、、、
逆アセンブラソフトほしいn

こういうソフト見つけましたが使えますかねー?
http://down.upsdn.net/html/1/1.html
374デフォルトの名無しさん:2007/03/05(月) 10:51:16
ウザ
375デフォルトの名無しさん:2007/03/05(月) 10:52:01
勉強が目的なのに楽ばかり考えてどうすんだ?
逆アスくらい自力でできるだろうよ。

って、元辿って読んだらリバースエンジニアリング目的かよ。
376デフォルトの名無しさん:2007/03/05(月) 10:56:37
最終的には、俺たちにチューンしてくれと泣きついてな
377デフォルトの名無しさん:2007/03/07(水) 03:41:12
6×10の計算なんですがどうしても答えがでません。
修正お願いします。。
(3回目のLOOPでゼロフラグが立たない理由もお願いします)    

ORG 8000H
XOR A
LD B,06H
LD C,0AH

LOOP: LD D,A
LD A,C
AND 01H
JP Z,SKIP
LD A,D
ADD A,B
LD D,A

SKIP: SLA B
SRA C
JP NZ,LOOP
LD A,D
LD (8200H),A
JP 0000H
     END
378デフォルトの名無しさん:2007/03/07(水) 04:04:51
実行してないけど、多分こうじゃない?
LOOP: LD D,A
LD A,C

LD D,A
LOOP: LD A,C

JP Z,SKIPでZが立ってる時って、A=0だろ。そのままJP NZ,LOOP → LD D,A(D=0) になってるように思う。

あとSRA Cって10→5→2→1→0
379デフォルトの名無しさん:2007/03/07(水) 06:06:59
素直にCをB回足せばいいのに
380デフォルトの名無しさん:2007/03/07(水) 06:17:37
↑馬鹿
381デフォルトの名無しさん:2007/03/07(水) 11:38:13
先生からもらった関数が動かないんですが・・・
382デフォルトの名無しさん:2007/03/07(水) 11:49:44
>>381
で、宿題は?
383デフォルトの名無しさん:2007/03/07(水) 16:41:43
>>380 だって6×8ならそのほうがクロック少ないじゃん(w
384デフォルトの名無しさん:2007/03/07(水) 22:12:52
訂正されたのを実行しましたがやっぱり答えがあいません。
ちなみに答えは12+24+48=84になってしまいます。
24を足しているのがおかしいのです。
3周目のAND 01Hで0010Hと0001HをANDした結果Zフラグが立って
スキップにいけば問題解決なんですが、スキップに飛びません。
Aレジスタの中身を見てみるとちゃんと0000HなのですがZフラグが
立ちません。今みてみるとHフラグは立っていました。
なぜZフラグが立たないのでしょうか
385デフォルトの名無しさん:2007/03/07(水) 22:46:27
そりゃぁあんた、ZフラグはANDなんかじゃ勃たないだろよ。
386デフォルトの名無しさん:2007/03/07(水) 23:28:04
>>384
CPU壊れてるんじゃね?
387デフォルトの名無しさん:2007/03/07(水) 23:28:19
そもそも何のニーモニックなのか最初にはっきり言えよw
Z80?

>>385
A=0で立たないフラグはもはやゼロフラグじゃないだろw
388デフォルトの名無しさん:2007/03/08(木) 04:19:40
ANDなんかじゃダメなんだ。もっと奮い立つようなものじゃないとw
389デフォルトの名無しさん:2007/03/08(木) 05:23:49
>>384
アセンブルしたコードを貼って味噌。HEX出力でもバイナリダンプでもいいから。
#つーか、なんでjr使わないでjp使っているんだろ。
390デフォルトの名無しさん:2007/03/08(木) 07:25:45
8085じゃないの?
391デフォルトの名無しさん:2007/03/08(木) 07:34:53
Zilogニモニックで8080/8085はないだろうよ。
#8080は互換性あるけど、8085は(8085で追加されたインストラクションが)互換性ないし。
392390:2007/03/08(木) 07:59:33
ニモニックはZ80らしいですね。Hフラグってハーフキャリーフラグのことかな?
lstをそのまま貼ると崩れちゃうんで、スペースを全角に直して貼ってみます。
         ORG 8000H 
8000 AF     XOR A 
8001 0606    LD B,06H 
8003 0E0A    LD C,0AH 

8005 57  LOOP: LD D,A 
8006 79     LD A,C 
8007 E601    AND 01H 
8009 CA0F80   JP Z,SKIP 
800C 7A     LD A,D 
800D 80     ADD A,B 
800E 57     LD D,A 
               
800F CB20 SKIP: SLA B 
8011 CB29    SRA C 
8013 C20580   JP NZ,LOOP 
8016 7A     LD A,D 
8017 320082   LD (8200H),A 
801A C30000   JP 0000H 
801D       END
393390:2007/03/08(木) 08:22:45
論理の流れはよさげですけどねえ・・・
LOOP:時点での
     D   C   B    足し算
1回目 0   1010 000110 足さない
2    0   0101 001100 足す
3    0Ch 0010 011000 足さない
4    0Ch 0001 110000 足す
足したあと、Cregを右シフトで0になるから
     3Ch 0000 1100000 
こういう展開を期待してるわけですよね?
394デフォルトの名無しさん:2007/03/08(木) 08:39:56
元質以外が貼って何の意味があるんだよ。
395デフォルトの名無しさん:2007/03/09(金) 04:37:18
元質の人はパニクっててそれどこじゃないかと思って。元質の人の参考になるかどうか
判らないけど、同じ8bitの掛け算で8085のclibに使われてるコードを貼っときますね。
レジスタ使い・8回loopするとかが違ってるけど、こちらはサイズ優先の工夫がされてるみたい。
MULAB:  ;   A*B-->A(8bit)
00F0 E5    push hl
00F1 67    mov h,a
00F2 AF    xra a
00F3 0E08   mvi c,8
00F5 87    add a
00F6 29    dad h
00F7 D2FB00 jnc 00FB
00FA 80    inr b
00FB 0D    dcr c
00FC C2F500 jnz 00F5
00FF E1    pop hl
0100 C9    ret
396デフォルトの名無しさん:2007/03/09(金) 22:18:38
みなさんありがとうございます!!
やりたいことは>>393 さんの通りです。
正直どう修正すればいいのか分からずじまいでした。
手直しまでしてもらいましてありがとうございます!
今から参考にして直してみます
397デフォルトの名無しさん:2007/03/10(土) 06:45:46
判ったら結果書いてね♪
398デフォルトの名無しさん:2007/03/11(日) 15:19:35
リテラルについての質問なんですが、
たとえば、論理加算で、

ADDL GR1,=100  これはできますよね?

ADDL GR1,=#FFFF こんなように16進数を使うことはできるんですか?
399デフォルトの名無しさん:2007/03/11(日) 15:28:55
だからさあ、何のニーモニックかぐらい書けよ
俺様がやってることが世界の全てとでも思ってるのか?w
400デフォルトの名無しさん:2007/03/11(日) 17:29:57
16進のリテラルは0ABCDhのように頭ゼロ、末尾にhをつけて書くことが多いですよ。
頭のゼロで「数値リテラルであってラベルでない」とアセンブラが認識できるから。
cみたいに0xで始まる書き方も許せばいいのにと個人的には思うけど、あまり見かけません。
401デフォルトの名無しさん:2007/03/11(日) 17:39:43
>>400
>0xで始まる書き方も許せばいい
これは逆に、c で0Ahや10bという書き方を許さないのが疑問なんだが。
402デフォルトの名無しさん:2007/03/11(日) 17:44:04
だからアセにもcにいろいろあるんだよ。
自分の身近な物が世の中の全てだと思う奴のことを「セカイ系」って言うらしいけど
最近確かにこういうセカイ系タイプって増えてるな。

リテラルの書き方なんてアセのメーカーによってマチマチじゃん。
マイコン系ならcでもビットワイズのリテラルを許すものもあるし。
403デフォルトの名無しさん:2007/03/11(日) 17:55:43
>>402
ここでいってるcはANSIだろう。
asmはいろいろだが。
404デフォルトの名無しさん:2007/03/11(日) 18:15:52
>>398
まあ、エスパーの漏れ様が答えてやると、
 仕 様 く ら い 読 め
ってことだな。

2.5 機械語命令
adr
アドレスは,10 進定数,16 進定数,アドレス定数又はリテラルで指定する。
リテラルは,一つの10 進定数,16 進定数又は文字定数の前に等号(=)を付けて
記述する。CASLUは,等号の後の定数をオペランドとするDC 命令を生成し,そ
のアドレスをadr の値とする。
405デフォルトの名無しさん:2007/03/11(日) 23:24:05
まあ、アセンブラ=CASLとかアセンブラ=x86とか思ってる馬鹿には来て欲しくないね。
406デフォルトの名無しさん:2007/03/11(日) 23:29:04
アセンブラ=6809
407デフォルトの名無しさん:2007/03/12(月) 00:53:05
アセンブラ=プライスレス
408デフォルトの名無しさん:2007/03/13(火) 19:20:14
俺なんか、[]つけるのか#つけるのかHつけるのか0xつけるのか$つけるのか
ソースとデスティネーションが右左のどっちか、
リテラルとメモリのラベル、オフセットなどの区別の仕方はどうなってるのか、
そういうのは必ずマニュアルを見て確認してるぞ。
たまにアセンブラのマニュアル忘れてくれる営業さんがいるんだが、
インラインアセンブラとか使うときにどーしろっつーんじゃい。

アセンブラを勉強するなら、環境によってみんな文法が違うってことをまずはじめに覚えろ。
それができたら質問してよろしい。
簡単に言うと、「まず、どのCPUを使うのかを書け!わからなかったらアセンブラに手を出すな!!」
409デフォルトの名無しさん:2007/03/14(水) 05:12:06
>>396はどうなったのかな?
410デフォルトの名無しさん:2007/03/14(水) 08:13:35
アセンブリ言語の標準規格って全然ないのかな。
dest/src の順番すらアセンブラによってまちまちだし。
411デフォルトの名無しさん:2007/03/14(水) 14:46:23
アセンブラどころか命令によってまちまちだったりするぞ
412デフォルトの名無しさん:2007/03/14(水) 15:22:06
まま、それがASMのいいところ・・・
413デフォルトの名無しさん:2007/03/14(水) 18:21:20
へたに標準規格作られてもさぁ、gas使う時みたいな違和感を感じるだけなんじゃないかね?
個人的にはソース・デストの順が好き。
414デフォルトの名無しさん:2007/03/15(木) 04:40:28
IBMが←だったので、当時の互換機はそれを真似したが、
その後マイコンの時代になると→がメジャーになってきたね。
415デフォルトの名無しさん:2007/03/15(木) 07:58:03
mov 系と LD/ST系があってだな
416デフォルトの名無しさん:2007/03/15(木) 10:18:39
load reg, mem
store reg, mem
の類は同じニモニックセットでも矢印の向きが変わる典型って訳だな。
417デフォルトの名無しさん:2007/03/16(金) 18:43:47
レジスタとアドレスを要求するOPでは
左レジスタの方が感覚に合うなあ
418デフォルトの名無しさん:2007/03/16(金) 20:31:12
左レジスタって意味わかんないだろw
419デフォルトの名無しさん:2007/03/17(土) 22:15:52
お前だけだろ。

「右」「左」が区別できる奴なら普通わかると思うが。

一般的な言い回しとは思わないけど。
420デフォルトの名無しさん:2007/03/17(土) 22:18:58
そんなことないでしょ。分かるのは恐らくエスパだけ。もちろんこれ逆説的表現ね。
左srcとか左destなら話も分かるが、左レジスタって一体何だよw
421デフォルトの名無しさん:2007/03/17(土) 23:06:57
>>419
    /::::i::::、:::ヽ、:::::\:ヽ:\::::::ヽ:::、::ヽ::、:',
    /::i|::l::ト、ヽ::、:::ヽ:、::::::\::ヽ::::l::::ヽ::i:::i:::!
   /:/:!:::!:|::ヽ:\ヽ::::、:\::::ヽ:::ヽ!::::::i::|:::!::!
   !ハ::|::::i::l:|心、:ヽ::\:ヽ_\、\:::ヽ:::|!::|:|i 駄目だ こいつ・・・
    i、:!:|:、N{、ヒjヽゝ\ヾイ ヒj >、ヽi:、|!:|:l
     ヽ:!::トヽ ̄ l! `  ` ̄´ |::l::|:|j:,!:!  早くなんとかしないと・・・
      ト、::! u         j |::/lj:::!リ
        ヾ、  丶 -    u リイ:|リ
        リヽ ‐、ー- 、_   /イ:::i
       rー'"ト:l゙、   ̄   ./  , |::!
      / ヘ ヾ ヽ、 _,. '   / |:
422デフォルトの名無しさん:2007/03/18(日) 07:01:49
左・・・レジスタ・・・?
たぶんCASLだろうけど、あれは気持ち悪い。
左src右destが一番美しい。
423デフォルトの名無しさん:2007/03/18(日) 14:05:44
>>418=>>420=>422
思考の柔軟性がなさそうだから、アセンブラなんて変態的なものは
あきらめることをお勧めする。
424デフォルトの名無しさん:2007/03/18(日) 14:39:45
いや僭越ながら「思考の柔軟性」とやらは持ってるつもり。
持ってないのはESP能力ねw
425デフォルトの名無しさん:2007/03/18(日) 21:49:16
× 持ってないのはESP能力ね
○ 持ってないのは常識 + 話の流れを読む力

まあ、日本語が理解できないようだから ESP に頼る必要があるのかもしれないけど。 (w
426デフォルトの名無しさん:2007/03/19(月) 01:04:42
アセンブラが変態なのではなく
特定の石が腐ってるだけ。

なんでそれがわからない?
427デフォルトの名無しさん:2007/03/19(月) 07:37:01
src/dstの並び順はgasでもアーキテクチャによってまちまちですよ。
428デフォルトの名無しさん:2007/03/19(月) 07:46:40
話をまとめると、
mov 系の命令は 移動方向は同じ
mov src,dst と mov dst,src が混在する事はあまりない(絶対にないとはいえないが)

LD/ST系は、src/dstではなく、レジスタ/アドレッシング が固定。多くは左にレジスタ、右にアドレッシング
レジスタが1個や2個しかない場合は、
LDA STA のように命令にレジスタが含まれるものもある


ただ mov系とLD/ST系が混在する場合はありえるかも
429デフォルトの名無しさん:2007/03/19(月) 07:51:37
という話に  >>415-416でなってる所に、 417がLD/ST型で左にレジスタ書くスタイルが好きだと発言
それに418が mov系の話と勘違いしてツッコミ中
430デフォルトの名無しさん:2007/03/19(月) 07:57:16
>>426
石が腐っているのではなく、適切に利用出来ないだけだろ。
PICでキャリーフラグが無くて辛かったり
高性能なDSPなのにインデックス修飾が出来なくて辛かったり、
そりゃコレくらい用意しとけよと思う事は山のようにあるけどな
431デフォルトの名無しさん:2007/03/22(木) 11:55:09
アセンブラの質問?なんですけど
「PCエンジンのCPUの方がメガドライブの奴より高速だとゲーム製作会社の人間が言っていた。
だからCPUの速度も性能も6502(21MHz相当) > 68000(8MHz)。68000は8ビットCPUより遅いゴミ。」
と言い張る人がいるんですがこれって本当なんですか?
432デフォルトの名無しさん:2007/03/22(木) 12:12:17
そりゃクロックあたりの命令実行数でも 6502が高いのに
クロックが違うんだから、
ゲームに使う話なら高速な方がありがたいだろう

でも68000は内部32bitだから、使い易さは段違い。
433デフォルトの名無しさん:2007/03/22(木) 13:27:11
レゲー板の論争はレゲー板で処理しろよ。
434デフォルトの名無しさん:2007/03/22(木) 14:59:07
>>431
その理屈で行くと、8086(クロック5MHz)も当然ゴミなんだろうな。
435デフォルトの名無しさん:2007/03/25(日) 03:16:16
石とかクロックなんて、「こういうソフトを作る」と決めてからそれに合わせて選ぶだけだから、
それ自体で良い悪いを語ることはナンセンスでしょ。3MHzの8085でもいまだに現役ですよ。
436デフォルトの名無しさん:2007/03/25(日) 03:32:54
え?まだ生産終了してなかったの?
437デフォルトの名無しさん:2007/03/25(日) 05:38:33
箱作るたびに、アキバで買い漁ってます(w
438デフォルトの名無しさん:2007/03/25(日) 22:08:24
6502ってハーバードアーキテクチャ的な奴だっけ?
だったら(昔の)ゲームとか単純な制御には68kなんかより圧倒的に有利だろうね。
439デフォルトの名無しさん:2007/03/25(日) 22:26:40
知ったか乙。

ハーバードアーキテクチャがどういうものか調べてこいよ。
440デフォルトの名無しさん:2007/03/25(日) 22:45:19
>>439
なんでもいいけどどうせ反論するなら具体的にやってみたら?
いや、できないなら無理することないよw

ちなみに俺は仕事で8052互換コアのコード書いてるから
ハーバードアーキテクチャの利点も欠点もある程度分かってるつもりだけどね。
441デフォルトの名無しさん:2007/03/26(月) 00:20:13
御託はいいから、6502 のどの辺がハーバードアーキテクチャ的か語ってくれよ。(w
442デフォルトの名無しさん:2007/03/26(月) 03:32:59
俺も聞いてみたいな。

頑張って電波出してくれ>>438 >>440
443デフォルトの名無しさん:2007/03/26(月) 11:58:41
ゼロページ、いやいやメモリマップドI/Oの事だったり・・・
まさかな。
444デフォルトの名無しさん:2007/03/27(火) 11:05:25
6502と8052を間違えてるんじゃね?
445デフォルトの名無しさん:2007/03/27(火) 11:24:09
それだっー!
446デフォルトの名無しさん:2007/03/27(火) 12:07:55
6502は当時多くの命令を2クロックサイクルで1命令を実行出来るというクロックあたりの実行性能で他を凌駕していた。
シンプルな命令体形でパイプライン処理を導入したおかげだろう
ただ、Accが1個しかなく(まあゼロページ全部がレジスタとも言えるが)
AddWithCF しか無い等、命令数は他のCPUより若干増え気味だが
ソコに色々工夫の余地があった
447デフォルトの名無しさん:2007/03/27(火) 12:26:59
ハーバードアーキテクチャは、1チップマイコンでよく利用される
4ビットマイコンとか PICのように命令ビット幅がデータビット幅より大きいものは、こうするしかない事情もある
8051のように両方同じビットサイズのものは逆に珍しい

DSPの多くで採用されるのは、速度的な問題から
DSPは積和を高速に実行する為、
命令と掛算のソース2つで3つに別けたり
積和は繰り返すので、
命令そのものはキャッシュに入るとして acc += 命令*データが出来るようにしたものが多い
こうする事で、2倍の速度が得られるわけだ
448デフォルトの名無しさん:2007/03/27(火) 12:39:04
>>444-445
仮定法という言葉を知らないにしても、小学生未満の読解力だなw
449デフォルトの名無しさん:2007/03/27(火) 13:48:23
ディスレキシア?
450デフォルトの名無しさん:2007/03/30(金) 18:28:58
>>448
どこに仮定法の要素が有るんだw
451デフォルトの名無しさん:2007/04/11(水) 00:25:42
今日はじめたばかりでまださっぱり意味がわかりませんが
CMP DWORD PTR DS:[EAX-C],1

の意味がわかりません。

EAXからCを引く???

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

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

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

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

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

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

乗算自体は難しいことはないんだが。
468デフォルトの名無しさん:2007/04/17(火) 01:23:22
つーか8085てシフト命令ないのかよ...
469デフォルトの名無しさん:2007/04/17(火) 01:29:16
習い始めの宿題なら足し算+ループでいいじゃん。
470464: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
471デフォルトの名無しさん: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

しかし、「プログラミングを作りなさい」って……
472デフォルトの名無しさん:2007/04/17(火) 03:14:16
16bit加算があれば楽だけどって思ってたんだが、あったんだな・・・
てっきりないと思って苦労してたorz
473デフォルトの名無しさん: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  ; 答
474473:2007/04/17(火) 05:35:57
解説:シフトしながら1が立っているときだけ足すのが掛け算の常套手段なのね。
8bitの数の場合最初の8回は足し算が起こらないからムダだけど、16bit同士の掛け算にも
そのまま応用できる。aをb回足す手法と比べて、bが10hより大きいときループ回数の点で
有利、という利点がある。これは実際に8085のclibに使われている手法です。
475デフォルトの名無しさん:2007/04/17(火) 10:36:22
石自体なくなってるのに、何に使うんだろう? 専門学校の課題、っていうだけ?
476デフォルトの名無しさん:2007/04/17(火) 12:42:42
こんな流行らないこと教える専門学校ってある?
工業高校か高専ってとこじゃない?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

だから出来ないよ。

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

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

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

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


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

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

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

call routine
ret



jmp routine

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

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

みたいなのを作りたいぉ。
534デフォルトの名無しさん:2007/04/20(金) 16:30:35
末尾再帰だからそのままループにすれば? と思うが

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

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

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

N: equ 80H
とすると80(16進法)番地にNという整数が用意されることは分かりましたが
どうやって値を設定するかが分かりません。
これが分かればあとはBccで分岐させるやりかたが分かればいいのですが。
540デフォルトの名無しさん:2007/04/20(金) 19:55:40
すいません
http://upc.ice.ous.ac.jp/~uejima/kue2-webasm/
ここにウェブアセンブラがあります。
もしよかったら使ってください
541デフォルトの名無しさん: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 が入るんじゃないの?
542デフォルトの名無しさん:2007/04/20(金) 20:18:25
080hてなんですか?

あと、分岐の実験中ですが
ld acc, 0
lp1: add acc, 1
cmp acc, xxx
bn lp1
end
このプログラムがxxx=100の時は動くのにxxx=150の時は動きません。
どうしてですかね
543デフォルトの名無しさん:2007/04/20(金) 20:43:41
>080hてなんですか?
16進数の80ってことだろ。たとえばcbhと書いたら16進数字か識別子か区別が
つきにくくなるから、先頭に0を書くこともある。

>このプログラムがxxx=100の時は動くのにxxx=150の時は動きません。
2の補数表現って知ってるか?
8ビットだと10進数で127までは正の数だが、128以上だと負の数扱いになる。
544デフォルトの名無しさん:2007/04/20(金) 20:49:24
学校の宿題は自力でやらなアカンやろ。
つーか、チミには相談できる友達はいないのかい
545デフォルトの名無しさん:2007/04/20(金) 20:52:11
>>543
なるほど。

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

ld acc, (j)

はどう違いますか?
たぶんですが、[]はその番地にある値、()はその値そのもの
という解釈でよろしいでしょうか?
つまり()は即値代入、[]は、絶対アドレス代入ということで。
548デフォルトの名無しさん:2007/04/20(金) 23:37:21
>>547
まあとりあえず、落ち着いて>>1をよく読もうぜ。
549デフォルトの名無しさん:2007/04/20(金) 23:37:30
違うかも・・・やべえ
550デフォルトの名無しさん:2007/04/21(土) 06:31:22
http://www.ark.is.kit.ac.jp/public/KUE/about/asem.html
コレだろ?
[d] 絶対アドレス(プログラム領域)
(d) 絶対アドレス(データ領域)
[IX+d] インデックス修飾アドレス(プログラム領域)
(IX+d) インデックス修飾アドレス(データ領域)
551デフォルトの名無しさん:2007/04/21(土) 10:58:03
oh thnx
552デフォルトの名無しさん:2007/04/21(土) 11:36:13
不親切なアセンブラだな 定数dを定義する時に DATA/CODE を修飾しておくとかさ
DATA[d]
CODE[d]
みたいにかけた方が判りやすいだろうに
553デフォルトの名無しさん:2007/04/21(土) 11:41:43
教育用なので。
しかし挿入ソート、どう考えてもレジスタが足りない・・
554デフォルトの名無しさん:2007/04/21(土) 11:54:17
メモリに適当に退避するしかないでしょ

しかしAcc1個にIX1個、CALLもRETもPC操作命令もないんだね
555デフォルトの名無しさん:2007/04/21(土) 12:30:25
ふぅ、せめてレジスタが3つあればかなり楽なんですけどね。
いちいちメモリに退避ldやstを繰り返してうんざりです。
挿入ソートどうやら書けました。
負数や同じ数にも対応、朝から飯食ってませんよ・・・
もうこの言語にはうんざりです

54321の並びかえに
195 steps, 896 clocks

ふつうのソートよりはずいぶん早いけど・・・微ですね
556デフォルトの名無しさん:2007/04/21(土) 12:49:31
a0: equ 80H
a1: equ 81H
a2: equ 82H
a3: equ 83H
a4: equ 84H
*個数
n: equ 85H

i: equ 86H
j: equ 87H
*基本的にx->accにld
x: equ 88H

*初期条件
ld acc, -96
st acc, [a0]
ld acc, 48
st acc, [a1]
ld acc, -80
st acc, [a2]
ld acc, 96
st acc, [a3]
ld acc, 96
st acc, [a4]
ld acc, 5
st acc, [n]

lp0: ld ix, 0
st ix, [i]
557デフォルトの名無しさん:2007/04/21(土) 12:50:14
lp1: ld ix, [i]
st ix, [j]
ld ix, [j]
ld acc, [ix+a0+1]
st acc, [x]

lp2: ld acc, [x]
ld ix, [j]
ld ix, [ix+a0]
cmp acc, ix
*xの保存
*st acc, [x]
bzp lp4
*a[j+1]=a[j]のphase
ld ix, [j]
ld acc, [ix+a0]
st acc, [ix+a0+1]

lp3: ld ix, [j]
sub ix, 1
st ix, [j]
bzp lp2

lp4: ld acc, [x]
ld ix, [j]
st acc, [ix+a0+1]
558デフォルトの名無しさん:2007/04/21(土) 12:51:13
lp5: ld ix, [i]
add ix, 1
st ix, [i]
ld acc, [n]
sub acc, 1
cmp ix, acc
bnz lp1

end

a0=-2, a2= -1くらいだと正常に動くのですが
-96, -80だと動きません。オーバーフローですか?
どこをどうすりゃいいんだろ・・・
559デフォルトの名無しさん:2007/04/21(土) 13:06:36
dataという擬似命令が使えるようだけど org に相当するのがわからんから巧く使えんね
560デフォルトの名無しさん:2007/04/21(土) 13:18:16
bge(=greater or equal)
を起用したらなぜか通った。やはりoverflawか・・・
イミフ
561デフォルトの名無しさん:2007/04/21(土) 13:31:14
引き算で計算してるから
-64-65 = -129 だけど 16進で書くと $7F =127 になってしまう
だからaccの符号だけみて判定するとミスする事になる
562デフォルトの名無しさん:2007/04/21(土) 13:34:56
overflowってなんですか?ueでoverflawとかいってるけどまさしく今のおれですね・・・
overflowとcarryの違いが分からない
563デフォルトの名無しさん:2007/04/21(土) 13:55:22
演算結果の符合が正しくない状態がoverflow

具体的にはプラスとプラスを足した結果がマイナスだったり、
マイナスとマイナスを足した結果がプラスになった場合をoverflowという。

っていうか、これ宿題以前に持ってないとマズい知識のような気がするけど。。
564デフォルトの名無しさん:2007/04/21(土) 14:15:32
ここでは、
overflow : 桁あふれ
carry : 桁あふれなどの結果の識別子
じゃないか。
565デフォルトの名無しさん:2007/04/21(土) 14:23:56
ココもアソコもない話だと思いますが。。
566デフォルトの名無しさん:2007/04/21(土) 14:37:16
>>565
プログラム板の外では、桁あふれ、とは取ってくれないってことね。
567デフォルトの名無しさん:2007/04/21(土) 17:03:02
先生が
overflowがでてもcarryがでない場合がある(うーん逆かも)
とか言ってた気がする。
負数がどうとか、他の班員は理解してたけどおれは????でした。
苦手なんだけどこの分野に進みたいんだよね・・・いらない子になりそう
568デフォルトの名無しさん:2007/04/21(土) 17:11:24
255に1を足したら キャリーも出てオーバーフローも立つ
-100に-1を足したらキャリーは出るがオーバーフローはたたない
569デフォルトの名無しさん:2007/04/21(土) 17:32:37
128から1を引いたらオーバーフローは出るがキャリーはたたない
570デフォルトの名無しさん:2007/04/21(土) 17:37:04
なんとなく把握した。
演算上、異常な事態がoverflowで、ふつうだけど表示不可な時がcarry
でおk?
571デフォルトの名無しさん:2007/04/21(土) 17:38:37
キャリーは符号無しで加算した時のオーバーフローってのでどうだ?
572デフォルトの名無しさん:2007/04/21(土) 19:13:15
>>570
なんとなくじゃなくてテキスト読めよw
学生なら教科書ぐらい持ってるだろ。

っていうか、キャリーは文字通り桁上がりだよ。
機械語の世界では便宜上桁借りもキャリーに含める場合があることには注意がいるけど。

数学苦手なら10進数の世界に置き換えて考えればいいんだよ。
算数できない子がお金の勘定に置き換えて理解するように。

10の位までの計算しかできないアホの子(=CPU)がいるとする。
この場合1 + 99や1 - 2がキャリー(やボロー)になるわけだ。

ところで、5 + 99 = 4だから、このアホの子の世界では99を足すことは1を引くことに
等しいとみなせる。(5 + 99 = 5 - 1)
同様に98は-2とみなせ、97は-3とみなせ、96は-4とみなせ……

これが補数による負の数の表現方法の考え方の基本だよ。

二進数の世界だって一緒だ。
8ビットの世界なら0x01に0xFF足したら0x00になるから、0xFFは-1と等価とみなせる、というわけだ。

もちろん上の例えを「0xFFに0x01を足すと0x00になる」と変形すると0x01を-255ともみなせるわけだが
それだと話が複雑になるので普通は0x80を堺に、それ未満の数を正とみなし以上の数を負とみなすようにする。
こうすると最上位ビットが符号を表すことになっていろいろ都合がいい。

このように補数による負の数の表現方法を決めたときに、>>563みたいに
演算結果の符合が正しくなくなった場合がオーバーフローだよ。
具体的には0x50(= 80) + 0x50 = 0xA0(= -76)みたいな場合だな。
プラスとプラスを足したのに答えがマイナスになってるのはおかしいでしょ。
573デフォルトの名無しさん:2007/04/21(土) 19:55:51
>>572
非常にわかりやすかった。俺にとってお前は神。
574デフォルトの名無しさん:2007/04/21(土) 20:43:09
>>573
貧乏神? それとも厄病神?
575デフォルトの名無しさん:2007/04/25(水) 05:06:52
H8/2000シリーズでeepmovという命令があります。マニュアル見ると、R4の転送バイト数が
ゼロのときは転送しないように書かれていますが、ゼロだと「最大」(バイトなら256、ワード
なら65536)の転送するんじゃないか、って気がするんです。 誰か試した人いませんか?
576デフォルトの名無しさん:2007/04/25(水) 05:16:20
島根県のみなさん、パチンコをするなら、

  優良パチンコ店 エイト○ン

に行こう! 遠隔(※1)をやっていないパチンコ店は「エ○トワン」だけ!
違法ロム(※2)を使っていないパチンコ店も「エ○○○ン」だけ!
人通りの多い時間帯、店の入り口付近の席でドル箱つんだサクラが座ってないのも「エ○○○ン」だけ!

詳しい方はご存知の通り、どんなにパチンコの遊戯人口が変動しても、その市場規模は変わりません(※3)。
要するに、客が減っても、残った客から絞り盗る量を増やして調整しているのです。
しかし、何故それが可能なのか?…ご理解頂けると思いますが、9割以上の店が確実に遠隔等を行ってます。
1万店以上のパチンコ店の中で、遠隔も違法ロムも確実にやってないのは「エ○○○ン」ただ1店です!

※1…遠隔とは
 「お、あの客は新顔だな。勝たせて味を占めさせるか。遠隔操作で設定変更しよ」
 「客が減ってきたな。ま、設定を絞めて(違法)、1人あたりから搾る量を増やせばいいか」
 「あのオヤジ負け続けてるからそろそろ辞めるかもな。今日は勝たせてやるか」

※2…違法ロムとは
 「うちのアタリ確率は、もちろん他と同じ『○○○分の1』ですよ!(ロムいじってるからウソだけど)」

※3       市場規模   遊戯人口
 平成06年 30兆4,780億円 2,930万人
 平成08年 30兆0,630億円 2,760万人
 平成10年 28兆0,570億円 1,980万人
 平成12年 28兆6,970億円 2,020万人
 平成14年 29兆2,250億円 2,170万人
 平成16年 29兆4,860億円 1,790万人
577デフォルトの名無しさん:2007/04/25(水) 08:15:28
コピペ君って馬鹿だな、まで読んだ。
578デフォルトの名無しさん:2007/04/25(水) 12:40:57
逆アセはスレ違い?だれか誘導してくれるとうれしい
579デフォルトの名無しさん:2007/04/25(水) 13:10:58
逆アセはスレ違い以前に板違いかも
580デフォルトの名無しさん:2007/04/25(水) 13:58:55
エヴァンゲリオンだと文字数が合わないよなぁ?と思った。
581デフォルトの名無しさん:2007/04/25(水) 23:28:26




582お願いします:2007/04/26(木) 20:43:03
アセンブラ言語を使ったPICにプログラムをしたいんですが、SW1を変化させるとLEDの点灯を変えるというものなんですがBTFSSをつかってやりたいんですがBTFSSの使い方を教えて下さい
おねがいします
583デフォルトの名無しさん:2007/04/26(木) 22:26:08
http://www.microchip.co.jp/document.htm#japanese
ここから使うPICのマニュアルを落とす
もし同じ型番が無いなら
http://ww1.microchip.com/downloads/en/DeviceDoc/30430cj2.pdf

BTFSS f,b
は  fのbビットが0なら次の命令が実行され、 でなければスキップする

 BTFSS GPIO , SW1のポート番号
 goto LED_ON
 BCF GPIO, LEDのポート番号
 goto skip1
LED_ON:
 BSF GPIO, LEDのポート番号
skip1:
584お願いします:2007/04/26(木) 23:28:31
SW1のポート番号とは例えばどんなものがありますか
あとGPIOとはなんですか? 
585デフォルトの名無しさん:2007/04/27(金) 13:05:41
マニュアルを読む手間くらいは人任せにしない方が身につきますよ
586デフォルトの名無しさん:2007/04/27(金) 14:06:48
>>584
ピン数によって GPIO一つしかなかったり PORTA PORTBがあったりする
SW1のポート番号は、どのポートを使ったかって事

RB1 なら GPIOの所は PORTB で ポート番号のところは1になる
587デフォルトの名無しさん:2007/04/28(土) 01:39:34
>>585
別に身につかなくてもいいんです
結果さえ得られれば
588デフォルトの名無しさん:2007/05/02(水) 20:21:06
初めまして、最近、アセンブラ言語を始めたものなんですが、
基礎からできるお勧めのアセンブラの本とかないでしょうか?
command operatorの多さにびっくりで、まずは最初にそれに慣れるなければいけ
ません。簡単なcommand の使い方がから徐々にステップアップできる本を
探してます。心当たりのある人、レスをお持ちしてます。
589デフォルトの名無しさん:2007/05/02(水) 22:07:32
>>588
まずはZ80でも覚えなさい。基本的な考えとかはそんなに変わりゃしないから。
590デフォルトの名無しさん:2007/05/02(水) 22:26:24
68000 プログラマーズ・ハンドブック 技術評論社

Z80みたいな酷い石をいまさら学ぶ必要なんか無いよ。
591デフォルトの名無しさん:2007/05/02(水) 22:58:10
酷いってことは全然ないだろ。8bit CPU だから超シンプルで覚えやすいから
勉強に最適だと思うし、確か、Z80 とその互換CPUは世界でもっとも使われて
いるCPUじゃなかったか?
592デフォルトの名無しさん:2007/05/02(水) 23:06:28
世界で最も使われてるのは、たぶん4ビットCPUだろうけど
その中で一位は統計が無い
4ビットはリモコン、時計、電気ポットと、Z80なんかに比べたら数だけは凄いぞ
593デフォルトの名無しさん:2007/05/02(水) 23:17:52
4bitはトータルでは勝てるだろうが品種が多すぎる。
一昔前なら6502だろ。なんといってもファミコンで世界6千万台。ブッチギリ
ただ PS1が1億台代以上売ったから塗り替えられたかもな
594デフォルトの名無しさん:2007/05/02(水) 23:40:30
>>591
Z80は変な制限が多いしオペコードマップが汚すぎる。
8bitでもいまさらZ80なんかを選ぶ理由はない。
32bitだけど68000でもやった方がマシ。ずっと素直だしね。
595デフォルトの名無しさん:2007/05/02(水) 23:42:45
>>594
Z80 は組み込み系で現物を使う機会が僅かながらにあると思うんだが、68000 はどうなんだ?
596デフォルトの名無しさん:2007/05/02(水) 23:46:55
x86
597デフォルトの名無しさん:2007/05/02(水) 23:47:04
68k の方がどっちかいうと現役だろ
http://www.atmarkit.co.jp/news/200704/24/freescale.html

8bitは 小さいのはPIC、少し大きいのは8051(EZUSBとかPSoC)とか
どうしてもハーバードアーキテクチャの方が優勢だろ
598デフォルトの名無しさん:2007/05/02(水) 23:52:17
>>597
MSXエミュレータを忘れもらっちゃ困るw
599デフォルトの名無しさん:2007/05/03(木) 00:01:22
x86 CPUの累計出荷数は2003年に10億 2007年までにさらに10億で20億の予定だそうだ

ただ、x86はアセンブラで書く事は殆どないだろう。
一部高速化の為に使うか、コンパイラ製作者が使うだけだ
600デフォルトの名無しさん:2007/05/03(木) 00:20:31
1bitCPUが超シンプルだろ
601デフォルトの名無しさん:2007/05/03(木) 01:11:31
別に 1bit CPU だからって、命令が極端に少ないわけじゃないので、
簡単と言えば簡単だけと、「超シンプル」とまでは言えないと思う。

例) MC14500 => 16命令 (つーか、これ以外に 1bit CPU ってあるのか?)
http://www.st.rim.or.jp/~nkomatsu/motorola/MC14500.html
602デフォルトの名無しさん:2007/05/03(木) 01:40:39
MC6800の子孫は車載用途だけで年間1億個だそうだ
http://www.freescale.co.jp/pressrelease/article.php?id=139
603デフォルトの名無しさん:2007/05/03(木) 01:58:36
おまえらPICとAVRを忘れてるぞ
604デフォルトの名無しさん:2007/05/03(木) 06:14:44
それなに?
バンク切り替えて命令の後半が置いてきぼりになったり
うっかりヒューズ切って二度と書き込めなくなったりしない
のなら知ってるけど。
605デフォルトの名無しさん:2007/05/03(木) 07:55:18
68000は16ビットCPUだろよ。レジスタ豊富だし、オペコードの直交性が高いからアセンブラで書くのは楽でいいよ。
606デフォルトの名無しさん:2007/05/03(木) 08:31:41
32bitを見据えた16bitなアーキテクチャ。
プログラマから見たときはほぼ32bitとして見ていい。
あと、CPUとか言わない。ちゃんとMPUって言うべき。
607デフォルトの名無しさん:2007/05/03(木) 08:46:05
そういう綺麗なCPUは、コンパイラも綺麗なコード出して来るんで、
アセンブラの出番はあんまり無い事になる。
直交性が無い、使い難い方が、アセンブラの出番があるという事になる
608デフォルトの名無しさん:2007/05/03(木) 09:46:47
x86のMASMのASSUME擬似命令を実際のニーモニックで書いてみたいんですけど、
擬似命令とニーモニックの対応表のようなものってどこかにありませんか?
609・∀・)っ-○◎●:2007/05/03(木) 09:56:14
ASSUMEの意味を考えましょう
DDも擬似命令だけど、対応するニーモニックは無いよね

確認したいなら、いっぺんEXE吐いて逆アセンブルしてみたら良いかと
610デフォルトの名無しさん:2007/05/03(木) 10:10:18
直交性もあり、使いにくいとは思わないし、コンパイラも頑張ってはくれるけどそれでも
アセンブラの知識がないとセル(のSPEの効率を上げるため)のプログラミングは難しい。
611607:2007/05/03(木) 10:21:49
>>609
DEBUGコマンドでオフセットアドレスの0000番地から逆アセンブルしてみたんですが
確かにオフセットアドレスをCSとかDSとかに代入してるようなのはないんですね
OSからセグメントアドレスはプログラムが実行される前に各レジスタに与えられてるってことですか
612608:2007/05/03(木) 10:23:09
すいません>>611は608でした
613608:2007/05/03(木) 10:24:41
>>611の二行目オフセットじゃなくてセグメントアドレスでしたorz
614デフォルトの名無しさん:2007/05/03(木) 12:07:54
よく言う「オペコードの直行性」って何なの?
いまいちイメージがつかめん
615デフォルトの名無しさん:2007/05/03(木) 12:19:15
基本的に、LD/ST あるいは mov 命令のアドレッシングが  どの組み合わせも出来る事だね

CISCではレジスタとメモリの間も演算出来るから、その組み合わせの事も言うかな
616デフォルトの名無しさん:2007/05/03(木) 12:46:45
オペコードのビットパターンを覚えておけば、アセンブラがなくてもデバッグできるのが直交性(ぉぃ
617608:2007/05/03(木) 13:12:31
マクロアセンブラがない頃はどうやってセグメント指定していたんですか?
618デフォルトの名無しさん:2007/05/03(木) 13:13:06
しかし、なんでこういう性質を直交性がよい、と呼ぶのかいまいちよくわからないなあ。

直交っていうのは数学(線形代数?)の用語だと思うんだけど。
二次元の世界だと、要はナイセキ(←IMEって糞だな。こんな基本的な言葉も変換できない)
が0で同じ方向の成分を持たないって意味でしょ、もともとは
619デフォルトの名無しさん:2007/05/03(木) 13:22:43
>>617
マクロアセンブラが無い時代ってのは無かったと思うのだが

>>618
ようするに mov だと2つのオペランド、SRC,DSTがあるでしょ?
SRCとDSTが好きな組み合わせが可能 = SRCとDSTが独立している = 直行
620デフォルトの名無しさん:2007/05/03(木) 13:25:35
なるほど「同じ成分を持たない」を「独立している」に読み替えるわけか
621608:2007/05/03(木) 13:38:47
>>619
あ、なかったんですね
さっきCOM用のコードのASSUME命令(ASSUME CS:CODE,DS:CODEってなってました)
を消したり、中身が空のセグメント作ってそれを割り当てたりしてみると
どっちも見た目正常に動いたのですが、COM型だからでしょうか?
622デフォルトの名無しさん:2007/05/03(木) 13:46:58
ASSUMEが無ければ CS: DS: とかのプレフィックスが付かないだけ
623608:2007/05/03(木) 14:28:40
>>622
セグメントオーバーライドプレフィックスっていうやつですか
COMだとASSUMEは必要ないんですね、本には書くようになってるんですが、慣習付ける為ですかね
まだEXEを扱えるようになってないので出直して来ます
624デフォルトの名無しさん:2007/05/03(木) 14:48:45
COMだとDS= ES= SS= CS だから まあ必要無いといえば無い
625デフォルトの名無しさん:2007/05/03(木) 15:11:38
.model tiny
とかしてるからでそ?
626デフォルトの名無しさん:2007/05/10(木) 03:05:41
セグメントディスクリプタキャッシュってレジスタの一種なの?
627質問:2007/05/10(木) 15:32:43
↓の[eax]kernelですけど、これは何を表わしているのでしょうか?
  配列のArray[]はわかりますが、[eax]kernelって...
  eaxはレジスタですよね?
__asm
{
/* kernel._run->spSaved = esp;*/
mov [edx]task_t.spSaved, esp
/* kernel.run = kernel._ready;*/
mov [eax]kernel._run, ecx
/* esp = kernel._run->spSaved;*/
mov esp, [ecx]task_t.spSaved
ret
}

628質問(補足):2007/05/10(木) 15:35:20
/*::::::::::::type::::::::::::::::::::::::::::::::::::::::::::::::::*/

typedef struct
{
reg_t eflags;
reg_t ebp;
reg_t ebx;
reg_t edi;
reg_t esi;
reg_t edx;
reg_t ecx;
reg_t eax;
reg_t eip;
reg_t eipBack;
} taskStack_t;

typedef struct _tcb_
{
struct _tcb_* fw;
struct _tcb_* bw;
char* name;
taskStack_t* spSaved; /* Stack value */
} tcb_t;

typedef struct _dlq_ /* Double link */
{
struct _dlq_* fw;
struct _dlq_* bw;
} dlq_t;

629質問(補足2):2007/05/10(木) 15:36:23
typedef struct
{
dlq_t _ready; /* Ready queue */
tcb_t* _run; /* Running task */
(略)
} kcb_t;

/* Task Type*/
typedef tcb_t* task_t;

/*:::::::: D A T A :::::::::::::::::::::::::::::::::::::::::::::::::::*/
static kcb_t kernel; /* Kernel Control Block */

/*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/

CPU:Intel Core 2 CPU
使用環境:Visual Studio C++ 2005 Express Edition
630デフォルトの名無しさん:2007/05/10(木) 16:13:01
質問なんですが、
市販のCPUを実際に自分でいじれるて、
実際に確認できるものとかないんですか?
例えば、電気がながれた
ほら、ここの0が1にかわって
こうなってこうなってだから結果がこうなるんだ
みたいなのがいいです
631デフォルトの名無しさん:2007/05/10(木) 16:29:06
>>630
大昔のパソコン(?)にはデータバスやアドレスバスにLEDがついて
動いてるのが視覚的にわかったもんじゃ。
デバッガでレジスタの内容見るとかじゃだめかね?

というか0/1で動作の仕組みを理解って論理回路レベルだ。
君はハード屋さんを目指したほうがいいかもだぞ。
632デフォルトの名無しさん:2007/05/10(木) 16:38:59
>>631
回答ありがとうございます。
論理回路は授業で少ししました。
電流がこう流れて、だからこうなって
みたいなのが知りたいのです。
そういうのってやっぱり企業に入らないとわからないんですかね?
特に自分で遊びながら確認できるものがいいんですが・・・
633デフォルトの名無しさん:2007/05/10(木) 16:45:44
すいません抜けてました
>デバッガでレジスタ
とありますけど、自分は実際に電流を流してみて、
その反応がしりたいんです。
どこかに電流がながれてだからここがこう変わってみたい感じです
634デフォルトの名無しさん:2007/05/10(木) 16:46:16
メイドさん表紙のあの本を片手に部品を集めてやってみるというのはどうだ。
635デフォルトの名無しさん:2007/05/10(木) 16:47:53
その本図書館で見ましたw
あの本も電流がここに流れて・・・
みたいなことが書かれてなかったような気がします
636デフォルトの名無しさん:2007/05/10(木) 16:56:18
もっと基本を知りたいってことか?
ブレッドボードにTTLとLEDで適当に論理回路組んでみるとか。

どちらにせよ板違いっぽいな。http://science6.2ch.net/denki/ こっち探してみ。
637デフォルトの名無しさん:2007/05/10(木) 16:57:08
>>636
誘導ありがとうございます
さっそく質問してきます
638デフォルトの名無しさん:2007/05/10(木) 16:59:03
最近はその手の動作が見えるというかバスが見えるようなトレーニングキットがあんまりない。
なんせ1チップにメモリからADCから全部入ってる時代だから。

これくらいかな
http://www.adwin.com/elec/nextstage/note_01.html


ソフトシミュレータなら復活!TK‐80 というのがあって、
http://www.amazon.co.jp/%E5%BE%A9%E6%B4%BB-TK%E2%80%9080-%E6%A6%8A-%E6%AD%A3%E6%86%B2/dp/4756134017/ref=sr_1_1/250-0492448-1389050?ie=UTF8&s=books&qid=1178783477&sr=1-1

これなら値段はお手ごろ 
639デフォルトの名無しさん:2007/05/10(木) 17:02:41
>>638
ありがとうございます。
参考にさせていただきます。
640デフォルトの名無しさん:2007/05/11(金) 00:12:49
つーか、今のCPUに一体どれだけトランジスタが作りこまれていると思っているんだか。
641デフォルトの名無しさん:2007/05/11(金) 00:23:40
計算したことがあるが値は忘れた。
億くらいだったかな
642デフォルトの名無しさん:2007/05/11(金) 00:24:21
んなわけねーなWWWWWWWWWWWWW
確か、東京ドームをもとにして計算したんだけど。
643デフォルトの名無しさん:2007/05/11(金) 14:10:50
>>641-642
Core2Duoあたりだと確か3億弱くらいだっけ。
ちなみにZ80やそれ以前のものだと数千程度らしいが。

ところで、なにをどうやって東京ドームをもとに計算するんだ?
644デフォルトの名無しさん:2007/05/11(金) 16:21:55
東京ドームに座布団が何枚敷けるか、から類推したとか・・・
645デフォルトの名無しさん:2007/05/11(金) 17:23:03
小錦何人分?
646デフォルトの名無しさん:2007/05/12(土) 00:11:11
うーん忘れたがとても多いということだけ覚えている。
またPS3のCPUがひとつ動いてない、なんか歩どまりがどうとかそういうのも覚えている。
他はうーん、ブースのアルゴリズム、これは忘れた。
647デフォルトの名無しさん:2007/05/12(土) 01:07:16
JTAG使えばええやん
648デフォルトの名無しさん:2007/05/12(土) 04:06:53
8085で、BIN-->ASCIIのコードの一部です。
  A<---Binの値
  RAR
  RAR
  RAR
  RAR
  ANI  0FH  ;MSBだけの値にして
  CPI  0AH  ;9以下かA以上か切り分け
  ORI  30H  ;'0'〜'9'に変換
  JC  $+5 ;'9'以下ならジャンプ
  ADI  7    ;A〜Fに変換
H8系だとこのアルゴリズムで動くのですが、8085だとA〜Fが「:;<=>?」になります。
それはなぜでしょうか?
649デフォルトの名無しさん:2007/05/12(土) 07:58:46
フラグの動きが違うんだろうな。
ZかCかどっちか。
650デフォルトの名無しさん:2007/05/12(土) 08:04:46
>>648
キャリーはクリアされるよ。
651649:2007/05/12(土) 08:19:44
久しぶりだな、こんなところにくるのは。
帰巣本能みたいな感じ。
652デフォルトの名無しさん:2007/05/12(土) 10:56:44
>>648
ORI を先にやって CPI 3AH にしてみたら?
653デフォルトの名無しさん:2007/05/12(土) 11:02:38
  A<---Binの値
  RRA
  RRA
  RRA
  RRA
  AND  A,0FH  ;MSBだけの値にして
  OR   A,30H  ;'0'〜'9'に変換
  CP   A,0AH  ;9以下かA以上か切り分け
  JR   C,$+5  ;'9'以下ならジャンプ
  ADD  A,7    ;A〜Fに変換

か。

ニモニック変換しないと分からんな。
654デフォルトの名無しさん:2007/05/12(土) 11:11:25
CP   A,03AH では?
655デフォルトの名無しさん:2007/05/12(土) 11:25:40
ついでに言えば、jr c, $+2だな。
656デフォルトの名無しさん:2007/05/12(土) 11:29:17
あ、そうかも。

CPI 3AH (CP A,3AH)だ。

$+4では?(JMP3バイト、JR2バイト)

657デフォルトの名無しさん:2007/05/12(土) 12:47:22
いや、$は現在のPCの値だから、jr命令をフェッチした段階では次の命令を指している。
尤も、アセンブラが敢えてjr命令自身を指すように作られていれば別だが。
658デフォルトの名無しさん:2007/05/12(土) 13:00:54
変な仕様ですね。
659デフォルトの名無しさん:2007/05/12(土) 13:17:15
JMP $
とかいうコードを良く使うから、$はその命令のアドレスの事じゃないかな?
だから、まあラベル使っとけと
660デフォルトの名無しさん:2007/05/12(土) 13:21:16
>>658
普通の(単純な)CPUは、命令をフェッチした段階でプログラムカウンタをインクリメントするものだけど。
でないと、次の命令フェッチに間に合わせられなくなってしまう。
ついでに言えば、プログラムカウンタが次の命令を指してないとサブルーチンコールが激しく面倒な訳だが。
661デフォルトの名無しさん:2007/05/12(土) 18:11:10
>JMP $
>とかいうコードを良く使うから

NOPの替わり?
662デフォルトの名無しさん:2007/05/12(土) 18:18:50
$はフェッチしたときのアドレスではなくて、「アセンブル時のその命令のロケーションカウンタ」
ですよ。だからZ8ニーモニックなら$+4で正解、85ニーモニックなら$+5で正解です。
JMP $は−3の相対アドレスを持ちます。 JR $は−2の相対アドレス。
663デフォルトの名無しさん:2007/05/12(土) 18:21:59
MASMでは $ は現在のアドレスのオフセット値
664 ◆0uxK91AxII :2007/05/12(土) 18:25:42
>>661
それは、所謂無限loop。
x86だとjmp $+2で、pipelineをclearする意味合いがあるらしい。
665デフォルトの名無しさん:2007/05/12(土) 22:05:05
なんで、わざわざハードの動きを得意げに説明する奴が出てくるんだろうか...。
666 ◆0uxK91AxII :2007/05/13(日) 00:07:44
あまりにもthreadの趣旨から外れた投稿を行う>>665は滅ぶべきだね。
667デフォルトの名無しさん:2007/05/13(日) 01:18:16
>>664
んなこと誰も訊いていない
668デフォルトの名無しさん:2007/05/13(日) 01:40:16
669デフォルトの名無しさん:2007/05/13(日) 09:10:57
$が何を指すかは処理系依存
無駄
670デフォルトの名無しさん:2007/05/13(日) 09:34:05
>>666
自演乙
671671:2007/05/13(日) 18:09:35
Visual Studio C++ 2005 Express Editionで逆アセンブルすると

 mov ecx, [eax]kernel._ready
 mov edx, [eax]kernel._run
       ↓
 mov ecx,dword ptr [eax]
 mov edx,dword ptr [eax+8]
となりました。

ここで、[eax]は、ポインタである、という意味ですか?

CPUは、Core2 OSは、Windows Vistaです。
672デフォルトの名無しさん:2007/05/13(日) 18:12:34
eaxがポインタか。
終わったな、MS。
673デフォルトの名無しさん:2007/05/13(日) 18:38:41
dword ptr [eax] = EAXの指すアドレス(オフセット)にあるDouble Wordの値
674デフォルトの名無しさん:2007/05/13(日) 18:41:57
常識的にebx使うだろ。
eaxだと1バイト長い。
675671:2007/05/13(日) 18:48:19
>>673
そういうことですか。
どうも、ありがとうございました。
676デフォルトの名無しさん:2007/05/13(日) 18:51:19
逆アセンブルするとMSがアフォだった。
677デフォルトの名無しさん:2007/05/13(日) 18:59:38
今時1バイトくらいけちけちすんなよ
678デフォルトの名無しさん:2007/05/13(日) 19:03:50
MSはかなりいい加減だな。
ゴミコンパイラ発覚。
679デフォルトの名無しさん:2007/05/13(日) 19:08:40
はいはいゴミゴミ
680デフォルトの名無しさん:2007/05/13(日) 19:09:25
コンパイラじゃないだろ。 アセンブラで書いたのを逆アセンブルしたんだろ?
681デフォルトの名無しさん:2007/05/13(日) 19:10:50
初心者大爆発(W
682 ◆0uxK91AxII :2007/05/13(日) 19:15:18
>>627-629
>Express Edition
683デフォルトの名無しさん:2007/05/13(日) 19:19:31
Express Editionがどうこう以前にインラインアセンブラで書いてるじゃん >>627
684 ◆0uxK91AxII :2007/05/13(日) 20:13:33
流れから、compileをExpress Editionで行ったと解釈。
違うならスルーで。
685デフォルトの名無しさん:2007/05/13(日) 22:20:27
> mov ecx, [eax]kernel._ready
> mov edx, [eax]kernel._run
>       ↓
> mov ecx,dword ptr [eax]
> mov edx,dword ptr [eax+8]
>となりました。

コンパイラ(アセンブラ)の仕事はラベルのアドレス解消しかないわな。
686デフォルトの名無しさん:2007/05/14(月) 18:33:10
↓関数を終了し終わると、レジスタeipのアドレスの関数が実行されます。
 popをしていってリターンすると、eipに書かれているアドレスの関数が
 実行されるけど、これって呼び出し側に戻らないのはおかしくないですか?
 

static voidfunc (void)
{    __asm
    {

(略)

        mov        esp, [ecx]task_t.spParam(■)
        popfd
        pop        ebp
        pop        ebx
        pop        edi
        pop        esi

        pop        edx
        pop        ecx
        pop        eax
        ret /* リターン後、task_Aを実行 */
    }
}

687デフォルトの名無しさん:2007/05/14(月) 18:33:54
■task_t.spParamの中身です。
-kernel._run->spParam
|------eflags
|------ebp
|------ebx
|------edi
|------esi
|------edx
|------ecx
|------eax
|------eip=0x00412550(task_A)
+------eipBack
688デフォルトの名無しさん:2007/05/14(月) 18:37:42
質問の意味が判らん。
スタックを切り替えてるって事はコルーチンとかスレッド切り替えをやってるんだろ?
その部分で呼び出し元に戻らないのは当然で、
再度コールチンの切り替えが呼ばれたら、そこで再度ESPが戻されて元に戻るわけだ
689デフォルトの名無しさん:2007/05/14(月) 19:32:00
>>688
スタックポインタをあまりよくわかっていませんでした。
汎用データ・レジスタをすべてpopすると、
eip(ステータスレジスタ)に書かれているアドレスに分岐されるんですね。
たまたま、↑の場合はSPを切り替えたため、
eipが、funcの呼出しもとでなかったために
task_Aが実行されたんですね。
わかりました。
690デフォルトの名無しさん:2007/05/14(月) 22:38:12
>>689
> eip(ステータスレジスタ)

もっとちゃんと仕様書を読む癖つけた方がいいぞ。
691デフォルトの名無しさん:2007/05/15(火) 09:18:13
eipレジスタとステイタスレジスタって何が違うの?
692デフォルトの名無しさん:2007/05/15(火) 09:23:30
pushfd で保存してるのがステイタスレジスタで
call で保存されてるのが
693ゆとりか?:2007/05/16(水) 00:32:47
>>691
>> 仕様書を読む癖つけた方がいいぞ。
694デフォルトの名無しさん:2007/05/24(木) 09:57:32
はじめまして
とても困っています

キーボードより入力した文字列(少なくとも2文字以上)を
逆順に並べ替え、一括して出力するプログラム
例:「abc」と入力して、「cba」と出力する

ってどうしたらいいんですか?教えてください
POPとPUSHを使うみたいなのですが・・・
695デフォルトの名無しさん:2007/05/24(木) 10:41:57
キーボードより入力する部分は誰が書くの?
696デフォルトの名無しさん:2007/05/24(木) 10:45:40
誰がってどういうことですか?
とんでもなく初心者なのでよくわかりません・・・

INを使うってことですか?
697デフォルトの名無しさん:2007/05/24(木) 10:59:34
俺はアセンブラよくしらねーけどさ
普通にpushしてpopすれば逆になるんじゃなかったっけ?
698694:2007/05/24(木) 11:19:41
プログラムの書き方がほとんどわからないんです
STARTで始まってENDで終わるということぐらいしかほとんどわかりません

よかったらソースを御願いしますm(__)m
699デフォルトの名無しさん:2007/05/24(木) 11:36:55
>>698
CASLUか?
700694:2007/05/24(木) 11:46:25
CASLUです
御願いします
701デフォルトの名無しさん:2007/05/24(木) 12:04:50
>>696
IN マクロ1回で全部の文字が入るわけ?
それともターミネータが既定されてて、その文字まで1文字づつINで入力してゆくの?
702694:2007/05/24(木) 12:10:58
ターミネータとはなんですか?

一回で「abc」と入れたのが
「cba」と出てくればそれで
大丈夫だと思うのですが
703デフォルトの名無しさん:2007/05/24(木) 13:59:07
INで1回に読めるのは8bitでしょ。それがASCIIの<CR>(0Dhね)なら文字列の終わりと認識して
並べ替えに入る。それまでは入力した順にpushしてく、という書き方すべきじゃね?
あと、popしながら戻ってくるときに「終わり」を知るためには、最初に何か特別なコードを
pushしとかないと。
704デフォルトの名無しさん:2007/05/24(木) 14:41:48
おまえあたまいいな
705694:2007/05/24(木) 15:08:45
難しくてよくわかりません・・・すみません。

教科書のINとOUTのプログラムの例はこんな感じです。

MACR START
TOP IN AREA,LL
LD GR1,LL
JZE FIN
OUT AREA,LL
JUMP TOP
FIN RET
AREA DS 256
LL DS 1
END

これの入れたものが逆に出てくるバージョンが知りたいです
706694:2007/05/24(木) 15:15:03
すみません、見づらかったです。

MACR START
TOP IN AREA,LL
LD GR1,LL
JZE FIN
OUT AREA,LL
JUMP TOP
FIN RET
AREA DS 256
LL DS 1
END
707694:2007/05/24(木) 15:16:30
連続投稿すみませんでした

スペースたくさん入れても一つになってしまいますね
708デフォルトの名無しさん:2007/05/24(木) 15:27:34
VB厨の俺がCASLII仕様書片手に暇つぶしにやってみた。

REV START
RPUSH
IN IBUF,LEN ;IBUFへ入力, 入力された文字数はLENに格納される。
SUB GR1,GR1 ;指標レジスタ兼ループカウンタを初期化。
REV1 LD GR0,IBUF,GR1 ;IBUF先頭から数えてGR1番目の文字を、
PUSH 0,GR0 ;スタックに積む。
LAD GR1,1,GR1 ;ループカウンタをインクリメント。
CPA GR1,LEN ;入力された文字数分だけスタックに積んだか?
JNZ REV1 ;まだならREV1へループする。
SUB GR1, GR1 ;ループカウンタを0にリセット。
REV2 POP GR0 ;スタックから1文字とってきて、
ST GR0,OBUF,GR1 ;OBUF先頭から数えてGR1番目へ置く。
LAD GR1,1,GR1 ;ループカウンタをインクリメント。
CPA GR1,LEN ;文字数分だけ処理したか?
JNZ REV2 ;まだならREV2へループする。
OUT OBUF,LEN ;処理した文字列を出力する。
RPOP
RET
END
IBUF DS 256
OBUF DS 256
LEN DS 1
709デフォルトの名無しさん:2007/05/24(木) 15:28:39
>>705
厄介だねえ IN 命令では何バイト読まれるか判らないのか
A 1バイト又は終了なら0バイト
B Nバイトが一気に読まれる
 なら比較的楽なんだけどなあ
710気まぐれアナスイ:2007/05/24(木) 15:37:37
私の計算では。
『((++) != (\/n)a) == 1』
711デフォルトの名無しさん:2007/05/24(木) 15:40:04
>>708
げ、バグがある。やっぱ無しっつうことで。
712デフォルトの名無しさん:2007/05/24(木) 16:23:48
これで動くかな?

REV START
RPUSH
IN IBUF,LEN
SUB GR1,GR1
CPA GR1,LEN ;追加
JZE REVE ;追加
REV1 LD GR0,IBUF,GR1
PUSH 0,GR0
LAD GR1,1,GR1
CPA GR1,LEN
JNZ REV1
SUB GR1, GR1
REV2 POP GR0
ST GR0,OBUF,GR1
LAD GR1,1,GR1
CPA GR1,LEN
JNZ REV2
OUT OBUF,LEN
REVE RPOP ;変更
RET
END
IBUF DS 256
OBUF DS 256
LEN DS 1
713694:2007/05/24(木) 16:41:09
>>709

よくわかりませんが、INのところの教科書の説明では

あらかじめ割り当てられた入力装置から、ラベル1で指定した入力領域
に文字データが入力され、ラベル2で指定した領域に文字データ長が、2進
データの形でセットされます。
 C言語などでは、ハードディスクやキーボードから入力する場合、OPEN
命令などで入力装置の割り当て(指定)を行いますが、CASLUではこの割
り当ては前もってなされていると仮定しています。
 入力領域は256語長(256文字分)の作業域のラベル名として、この領域
に1文字を1語として対応させ、順次入力します。1語は2字分の大きさ
をもちますが、ここでは1語に1文字しか入らないので注意してください。
 ようするに入力される文字は、DC命令の文字定数と同じように、各語
の上位8ビットには0のビットが入り、下位8ビットには
JIS X0201のコードが入っています。
 なお、キーボード入力の復帰符号などのような区切符号は入力されません。
 また、入力データが256文字をこえる場合には、以降の文字は無視する
ことになります。256文字に満たない場合は、入力領域の残りの部分は実行
前のデータを保持します。
 ラベル2で指定された領域には、普通は入力されたデータ長がセットさ
れていますが、ファイルの終わり(end of file)が検出した場合(読み込む
データがなくなったとき)は−1がセットされます。

となっています。
言ってることは全然意味がわかりませんが・・・

>>708
そんな感じだとは思うのですが、エラーが出ていても
どこが間違っているのかも全然わからない素人なのです(汗
714694:2007/05/24(木) 16:52:05
>>712ありがとうございます。でもエラーが5つ出てきました。ちなみに、エラーはこんな感じでした。
Address Object-Code Label Mnemonic Gr, Op, Xr
-------------------------------------------------------------
0000 REV START
0002 RPUSH
0004 IN IBUF,LEN
0006 SUB GR1,GR1
ニーモニック
0008 4010 0228 CPA GR1,LEN
000A 6300 0000 JZE REVE
オペランドのラベルが見つからない
000C 1001 0028 REV1 LD GR0,IBUF,GR1
000E 7000 0000 PUSH 0,GR0
<XR>レジスタ
0010 1211 0001 LAD GR1,1,GR1
0012 4010 0228 CPA GR1,LEN
0014 6200 000C JNZ REV1
0016 SUB GR1,GR1
ニーモニック
0018 7100 REV2 POP GR0
0019 1101 0128 ST GR0,OBUF,GR1
001B 1211 0001 LAD GR1,1,GR1
001D 4010 0228 CPA GR1,LEN
001F 6200 0018 JNZ REV2
0021 OUT OBUF,LEN
0023 REVE RPOP
ニーモニック
0025 8100 RET
0026 END
0028 0000 IBUF DS 256
0128 0000 OBUF DS 256
0228 0000 LEN DS 1
715694:2007/05/24(木) 17:28:41
大変迷惑かけました。いろいろな人に聞きまくったところ、データの残っている先輩からデータをもらうことができました。
ちなみにこんなかんじでした

MOVE START
IN RE,LE
LAD GR1,0
LD GR2,LE
LAD GR2,-1,GR2
LD GR3,LE
SRA GR3,1
LP JZE LIST
LD GR0,RE,GR1
LD GR4,RE,GR2
ST GR4,RE,GR1
ST GR0,RE,GR2
LAD GR1,1,GR1
LAD GR2,-1,GR2
SUBA GR3,C1
JUMP LP
LIST OUT RE,LE
RET
LE DS 1
RE DS 30
C1 DC 1
END
716デフォルトの名無しさん:2007/05/24(木) 17:51:49
とほほ。
SUBをSUBAに、R0をGR2にして、余分な空白は消さないと動かないね。
ENDの位置も間違ってる。
717モンキーJ:2007/05/24(木) 17:57:09
はじめまして。すいません,MIPSなのですがこのプログラムの問題点を指摘せよとゆう
課題なのですが問題あるでしょうか?ご教授お願いします。

add $v0, $0, $0
slt $t0, $a0, $0
beq $t0, $0, loop
sub $a0, $0, $a0
loop:
add $v0, $v0, $a1
addi $a0, $a0, -1
bne $a0, $0, loop
beq $t0, $0, end
sub $v0, $0, $v0
end:

よろしくお願いします。
718デフォルトの名無しさん:2007/05/24(木) 21:25:59
問題があるとすれば、それはその課題の出題者の頭がだな。
719デフォルトの名無しさん:2007/05/24(木) 21:39:45
>>715
スタック使ってないやん…
720デフォルトの名無しさん:2007/05/26(土) 03:21:48
使わずに済むならそれにこしたこたねんだ
721デフォルトの名無しさん:2007/05/26(土) 03:27:12
>>717
MIPSのアセンブラって皆こうなん?
$とかすごく入力しにくいぞ
722デフォルトの名無しさん:2007/05/26(土) 11:08:09
そうでもないよ
723デフォルトの名無しさん:2007/05/27(日) 00:12:29
$ が入力しにくいってどんな環境なんだ?
724・∀・)っ-○◎●:2007/05/27(日) 00:48:17
shift+4って日本語でも英語でも同じだよな
725デフォルトの名無しさん:2007/05/27(日) 02:09:03
まさかケータイからとか?
726デフォルトの名無しさん:2007/05/27(日) 23:22:21
>>717
誰も答えないようなので一応答えてみる。
勝手に想像をめぐらすと変数aとbのかけ算の結果を返すソースコード
と思われる(C言語風にかくなら int mul(int a, int b);)ので、
その前提で問題点を指摘する。

問題点は2つ。
1. 変数$a0(int aに対応)が負の場合に符号反転して最後に再度反転するコードだが、
問題ではそうなっていない。

対策として3行目 beq $t0, $0, loopをbne $t0, $0, loopに変更すべき。

2. 変数$a0に0が入っている場合、結果$v0=0になるべきだが、1回だけループを通過
してしまうために、$v0=$a1(return b;)が返ってしまう。

対策として下記のような$a0の0チェックコードを1行目と2行目の間に挿入する。
beq $a0, 0, end

前提が間違っている可能性もあるので、そこは自分で検討してみてくれ。
727デフォルトの名無しさん:2007/05/29(火) 13:45:39
この宿題スレはSAL、MAL、TALの宿題でもおkですか?
728webmaster@気まぐれアナスイ:2007/05/29(火) 15:14:19
!(Φ_Φ+)
全てclear.出来る筈です…
729デフォルトの名無しさん:2007/05/30(水) 21:20:42
CASLIIです。
期限が明日に迫っていて間に合いそうにありません。
図がズレる可能性もあったのでtxtであげました。
http://www.csync.net/service/file/view.cgi?id=1180527442

よろしくお願いします。
730デフォルトの名無しさん:2007/05/30(水) 21:45:13
CASLIIいじると頭が発狂しそうになるのって俺だけ?
731デフォルトの名無しさん:2007/05/30(水) 23:31:19
頭が発狂ってなんかおかしくね?
732デフォルトの名無しさん:2007/05/30(水) 23:46:41
頭痛が痛い
733デフォルトの名無しさん:2007/05/31(木) 00:02:03
頭の頭痛が痛い
734デフォルトの名無しさん:2007/05/31(木) 08:47:16
>>729
12時までには終わらせるから待っとけ。
735デフォルトの名無しさん:2007/05/31(木) 10:22:47
>>729
とりあえずやってみた。
コメントの形式がこれじゃダメな場合は、自分で書き直してくれ。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4116.txt
736デフォルトの名無しさん:2007/05/31(木) 11:14:23
>>735
ありがとうございます!
コメント形式も完璧で本当に助かりました。
737デフォルトの名無しさん:2007/05/31(木) 11:17:36
A君とB君の家は20mの距離があって、A君は一秒間に2mのスピードで動いてB君は一秒間に2.5mのスピードで動く。
二人が同時に家から出て互いに向かって走ってったら同じ場所になるのは何秒後?
738デフォルトの名無しさん:2007/05/31(木) 11:47:48
二人の距離は1秒で4.5mずつ縮まる
20/4.5=4.44444444・・・・秒後

A君は自分の家から8.88888888・・・・mの場所
B君は自分の家から11.1111111・・・・mの場所

両方の距離を足すと19.99999999・・・・m

検算でもだいたい合ってるのでこれでいいでしょう

739デフォルトの名無しさん:2007/05/31(木) 11:50:43
>>738
ありがとう
本当に助かった
740デフォルトの名無しさん:2007/05/31(木) 11:52:05
それのどこがアセンブラの宿題?
741デフォルトの名無しさん:2007/05/31(木) 12:31:31
2進数で20/4.5を計算すると循環小数にならないっていう話なのかな
742デフォルトの名無しさん:2007/05/31(木) 12:40:11
100.0111 000111 000111 000111 ・・・・

循環しますが

743デフォルトの名無しさん:2007/05/31(木) 21:53:30
ワンボードマイコンのSuperAKI-80でAポートのみ出力に設定し、
接続したLEDの点灯パターンで表示される2進数値を
1ずつ1秒毎にカウントアップするプログラムを組めという課題が出たんですが

ORG 8000H ;8000番地から始める
LD A,8BH        ;Aに8Bを入れる
OUT (33H),A ;33番地にAの値を入れる
XOR A ;Aの内容をクリアする
LD B,255        ;Bに255を入れる
LD C,40
LOOP1: INC A ;Aに1を加える
OUT(30H),A ;30番地に出力する
LOOP2: LD DE,24576 ;HLに24576を入れる
LOOP3: DEC DE ;HLから1引く
JP NZ,LOOP3 ;0でなければLOOP3に戻る
DEC C ;Cから1引く
JP NZ,LOOP2      ;0でなければLOOP2へ戻る
DEC B ;Bから1引く
JP NZ,LOOP1 ;0でないとループ1に戻る
JP 1000H
END

このように組んでも思ったように動作してくれません。
どこがどうおかしいのか教えてください。
CPUのクロック周波数は9.8304MHzです。
744デフォルトの名無しさん:2007/05/31(木) 22:02:27
コメントの書き方がヘタレだな、なぜこうしたかという意思表示が伝わってこん。
そういう1命令ごとのミクロの視点じゃなくて、もう少し大局的なコメントを書いてくれ。
例:どうやって1秒間の時間稼ぎをするのか、とか。

添削はそれから。
745743:2007/05/31(木) 22:29:23
>>744
ORG 8000H ;8000番地から始める
LD A,8BH ;Aに8Bを入れる
OUT (33H),A ;33番地にAの値を入れる
XOR A ;Aの内容をクリアする
LD B,255 ;Bに255を入れる
LD C,40 ;Cに40入れる
LOOP1: INC A ;Aに1を加える
OUT(30H),A ;30番地に出力する

;以下時間稼ぎ
;9830400=24576×40×10(JPの所要クロックサイクル)

LOOP2: LD DE,24576 ;HLに24576を入れる
LOOP3: DEC DE ;HLから1引く
JP NZ,LOOP3 ;0でなければLOOP3に戻る
DEC C ;Cから1引く
JP NZ,LOOP2 ;0でなければLOOP2へ戻る

;時間稼ぎ終わり

DEC B ;Bから1引く
JP NZ,LOOP1 ;0でないとループ1に戻る
JP 1000H
END

このコメントの書き方でよろしいでしょうか
746デフォルトの名無しさん:2007/05/31(木) 23:10:28
>LOOP3: DEC DE ;HLから1引く
>JP NZ,LOOP3 ;0でなければLOOP3に戻る
無意味無駄無様なコメントだな。

で、dec deはいつからフラグに影響するようになったのかね。
747デフォルトの名無しさん:2007/05/31(木) 23:11:35
DEC DEとか16bitのINC/DECではフラグ変化しないハズ
748デフォルトの名無しさん:2007/05/31(木) 23:30:25
>XOR A ;Aの内容をクリアする

こういうところは妙にテクってたりするw
749デフォルトの名無しさん:2007/05/31(木) 23:38:12
LD C,40 ;Cに40入れる

これは時間稼ぎループの中に入れないとまずい。
それにしてもループで時間稼ぎとは前時代的だなw
750デフォルトの名無しさん:2007/06/01(金) 05:15:19
大麻とか使えるようになるのはもっと後でしょ。
8000Hから始めて、終わったら1000Hへ行っちゃうのはいいの?
Bを255回のカウンタに使っているけど、DEC B してるとこで INC A ってやれば
Aだけで回せるんじゃない?・・・と思ったが、DEC DE の後でDとEの検査するのにAを
使うね。B=0から始めて、OUT (30H),Aの前でLD A,B 、 最後の判定の所 INC B でやれば
元のアイデアが生かせてpush/popも要らないかと。
751デフォルトの名無しさん:2007/06/01(金) 09:17:45
命令を理解しているかどうかを確かめるために
1行ずつ命令の動作をそのままコメントに書かせる奴はいる。
752デフォルトの名無しさん:2007/06/02(土) 13:10:39
Spimでオーバーフロー時の処理ルーチンって何のことだかわかりますか?
753デフォルトの名無しさん:2007/06/02(土) 15:53:10
オーバーフロー時の処理ルーチンのことだろ
754デフォルトの名無しさん:2007/06/03(日) 10:55:41
どんな命令与えるの?
755デフォルトの名無しさん:2007/06/03(日) 13:27:19
オーバーフローが起きたときは処理系によりレジスタの内容が「最大」になるとか不定になるとか
ゼロになるとかいろいろあると思う。計算の途中なら先を続けないとか、数値として編集するなら
「計算できません」的な表示を作るとか、要するに「正しい答以外の場合」の後始末が必要でしょ
756デフォルトの名無しさん:2007/06/03(日) 17:25:43
本とかで調べるとmfc0命令でレジスタにコピーし、ジャンプレジスタ命令で例外が起きたコードに戻す。ってあったんで頭を抱えていたのですが、
なんだか難しく考えすぎていたようです。>>755 ありがとうございました。
757デフォルトの名無しさん:2007/06/04(月) 05:35:34
>>745はどうなったのかな?
758デフォルトの名無しさん:2007/06/07(木) 23:35:21
データラベル DB
の組み合わせはデータラベルを識別子とする変数や配列を定義してるようなものだと思えばいいんでしょうか?
759デフォルトの名無しさん:2007/06/08(金) 01:53:30
グローバル変数限定なら、まあ。
760デフォルトの名無しさん:2007/06/08(金) 02:00:17
>>758
hoge DB "hanage",0
はC言語でいうところの
char* hoge = "hanage";
かなぁ。
761デフォルトの名無しさん:2007/06/08(金) 03:57:59
正確には、char hoge[7]="hanage"; の訳が>>758
>>760は hoge: DW peke
      peke: DB "hanage",0 になる。
762758:2007/06/08(金) 06:47:33
>>759-761
ありがとうございます、そういう感覚で覚えておきます
763デフォルトの名無しさん:2007/06/16(土) 12:01:13
高級言語からアセンブリに落とす作業ってなんていう?
764デフォルトの名無しさん:2007/06/16(土) 12:04:20
sageわすれ
765デフォルトの名無しさん:2007/06/16(土) 13:20:14
コンパイル
766デフォルトの名無しさん:2007/06/17(日) 02:26:32
そのままアセンブリに落とすっていってるな

なんかいい名前かんがえようぜ
767デフォルトの名無しさん:2007/06/17(日) 05:32:01
>>766
組み立て作業(誰にでも出来る簡単なお仕事です!未経験者歓迎)
768デフォルトの名無しさん:2007/06/22(金) 00:14:10
よろしうお願いします。
問題文はうpしますた
ttp://bebe.run.buttobi.net/up/src/be_1192.txt
769デフォルトの名無しさん:2007/06/22(金) 04:52:34
その石のニモニックは知らないけど、アルゴリズムは以下で判るでしょ。
対応するニモニックに自分で直してね。
   LD  Areg,A ; 8bit
   LD  Breg,B ; 16bit 右詰め 左はゼロに
   商の16bitreg<--0
   カウンタ用のreg<--8
loop:     ; ループ本体は8回実行される
A(8bit)を右シフト
jnc  xx   ; キャリーが立ってなければ次の足し算をしない
商にBreg(16bit)を足す
xx: Breg(16bit)を左シフト
   カウンタregをdcr
jnz  loop
ST  商のreg,C
770デフォルトの名無しさん:2007/06/22(金) 05:00:40
ごめん、左のスペースが詰まっちゃうんだね。命令欄までずらしてみてね。
考え方:A  X   X   X   X   X   X   X   X
     B*128 B*64 B*32 B*16 B*8  B*4  B*2  B*1 ・・・の合計
Aの各桁が立っていたらその分左シフトしたBを商に足してゆく、という考え方です。
771デフォルトの名無しさん:2007/06/22(金) 14:16:13
専用ブラウザで見ると、スペースはちゃんと残るよ。
772デフォルトの名無しさん:2007/06/25(月) 14:35:58
MIPS RISCアーキテクチャのアセンブラで質問が。

文字列を入力させて、それをキューを使用して格納し、
順に出力するというプログラムを組んでいるのですが、
具体的にどのように書けばよいのでしょうか?

例えば、使用者が「PLAYSTATION」と入力した場合、
←|P|L|A|Y|S|T|A|T|I|O|N|←
となるので、Pから順に出力されていき、出力画面にはPLAYSTATIONと出力されます。
773デフォルトの名無しさん:2007/06/25(月) 15:18:51
MIPSとかキューとかどうでもよかった。

 読みこみ $t0,配列アドレス
ラベル1:
 戻れるジャンプ read_char
 アドレスに保存 $t0,$v0
 加算 $t0,1
 比較 $v0,キャリッジリターン
 同一じゃなければジャンプ ラベル1
 アドレスに保存 $t0,0
 読みこみ $t0,配列アドレス
 戻れるジャンプ print_string
774デフォルトの名無しさん:2007/06/25(月) 16:49:23
>>773
C言語の文字列処理のようなものでしょうか?
このような感じでしょうか?

#include <stdio.h>
int
main() {
char str[]="String"; /* 取り扱う文字列 */
int i=0; /* カウンタ */
char c; /* 文字コード保持用 */

while((c=str[i])!='\0') {
printf("str[%d]=%c(%x)\n",i,c,c); /* 文字(%c)と文字コードの16進(%x)表示 */
i++;
}
c=str[i];
printf("str[%d]=%c(%x)\n",i,c,c);

printf("str='%s'\n",str); /* 文字列として表示する%sを使う */
775772:2007/06/25(月) 19:17:21
すいません。
>>772のように動作するプログラムをMIPSアセンブリで組んだら
どのようになるのでしょうか?

ttp://www.cc.kyoto-su.ac.jp/~kbys/kiso/cpu/mips3.html
ここに書いてあるアセンブリ言語です。
776デフォルトの名無しさん:2007/06/25(月) 19:27:53
>>775
とりあえず>>773-774の情報をもとに自分で考えようと思わんのかな?
ハナから人任せじゃなかなか理解が進まないもんだよ。


ま、いいんだけどね。
777772:2007/06/25(月) 19:47:10
>>776
何度もやってみたのですが、うまくいかないもので・・・
自分で書いたコードです。

ttp://bebe.run.buttobi.net/up/src/be_1239.txt
778デフォルトの名無しさん:2007/06/25(月) 20:32:16
get命令とかputs命令ってなんなの?

貼られたURL(kyoto-su.ac.jp)によると、$v0レジスタにシステムコールの番号をロードして
syscall命令を使わないといけないみたいだけど。

get:
lw $v0, 8 # read_string
(その他パラメータを指定して)
syscall

puts:
lw $v0, 4 # print_string
(ここでパラメータ指定)
syscall
779デフォルトの名無しさん:2007/06/25(月) 20:37:57
どこにも宣言が無いけど、マクロのつもりじゃまいか。
780772:2007/06/25(月) 20:57:43
>>778
貼ったWebページをじっくり読んで、
使っているアセンブリ言語とはちょっと違うという事に気がつきましたorz
ご迷惑をおかけしました。

正確には、こちらで説明されているMIPS Assembly Languageのプログラムです。
ttp://www.cs.uaf.edu/~cs301/notes/Chapter8/node1.html
ttp://www.cs.uaf.edu/~cs301/notes/Chapter9/node1.html

puts命令はStringsを表示する時の命令です。
get命令は使用者が入力した文字、または数値を指定した変数に格納する役割をしています。
前まで、ttp://www.cs.uaf.edu/~cs301/notes/Chapter2/node1.html こちらにある
シンプルアブストラクト言語というのを使用していたのですが、MIPS Assembly Languageになると
より純粋なアセンブリ言語に近くなっているようで、データメンバを指定できなくなったり、配列が使えなくなったりしているようです。
781デフォルトの名無しさん:2007/06/26(火) 00:03:17
えーと?
spimに依存した話、って事でいいのかな?
782772:2007/06/26(火) 02:51:50
>>781
でOKです。
783772:2007/06/26(火) 18:20:52
課題の主旨を勘違いしていたようです。
キューではなくスタックを2度使い、普通に表示されるようにしなければならないのですが、
スタックを2回使った場合、どうやればいいのか検討もつかないので、>>773さんのような感じで
どなたかヒントを戴けないでしょうか?

>>772の場合だと、 playstation と入力し、それを1番目のスタックに保存します。
1番目のスタック:noitatsyalp それを2番目のスタックに保存しなおし、 playstation となった物を
出力したいです。
784デフォルトの名無しさん:2007/06/27(水) 06:32:02
最初にスタックポインタ覚えておけばいいんじゃない?
文字をget
それをpush
「末尾」文字なら次へ、そうでなければ前へジャンプ
次:覚えておいたスタックポインタからpushと同じやり方で
文字を取り出して表示、「末尾」ならおしまい。
785772:2007/06/27(水) 12:18:30
>>784
レスありがとうございます。
スタック二つ目を作ってみたのですがエラーが出てしまいます。

ttp://bebe.run.buttobi.net/up/src/be_1276.txt

何か悪い点があるならご指摘お願いします。
786772:2007/06/27(水) 12:21:07
>>784
>「末尾」文字なら次へ、そうでなければ前へジャンプ

とは、どうやれば良いのでしょうか?
787デフォルトの名無しさん:2007/06/27(水) 12:32:54
>>786
君さ。今までに出された物を理解しようとしてるか?
また使おうとしてる言語の仕様は把握してるか?

人から貰った回答をそのまま提出しても自分の身に付かないぞ。
788デフォルトの名無しさん:2007/06/27(水) 13:17:43
いやいや、理解してたらここに質問にはこないだろ。
わからない部分の模範解答を見て覚えるというのは初心者には身になる事だよ。
789772:2007/06/27(水) 13:22:15
>>787
すいません。理解しようとしているのですが、
一番最初のメモリアドレスをスタックポイントに保存させて、
スタックの状態が「noitatsyalp」になるまでpushする、というのは分かったのですが、

次:覚えておいたスタックポインタからpushと同じやり方で
文字を取り出して表示、「末尾」ならおしまい。

の意味がやり方が分かりません。「noitatsyalp」となっている状態で、
スタックポイントに保存している状態だと、pの方から文字を取得できるのでしょうか?

こんな感じかと作ってみたのですが、文字を入力した瞬間、エラーが出てしまいます。
ttp://bebe.run.buttobi.net/up/src/be_1279.txt
790784:2007/06/27(水) 13:40:32
スタックに積むといいながら、789見てみるとスタックじゃなくて配列に入れてるように見える。
俺はこの石のASMはいじったことないが、add $10, 1 の後、bneってのは変だと思う。
何かとコンペアして、beかbneでなきゃおかしいでしょ。 で、その比較するものは、
「今格納した文字が特定の何かの文字か?」と判定するんじゃないの?'n'だったら終わり、
っていうんじゃあまりにもプログラムらしくないでしょ。"hellow"を入れたら動かないことになる。
ふつうは復帰(0Dh)か改行(0Ah)を入れたら1行分の文字列の終わり、と認識するもんだ。
791つづき:2007/06/27(水) 13:48:53
この石に他の大部分と同じアーキテクチャのスタック機能があると仮定しての話だけど、
789はpush/popの概念解ってる? スタックポインタ(SP)という特定のレジスタがあって、自分で
初期化する場合もあるし、789が書くプログラムにきたときに特定の値にそれが初期化されてる
こともある。それは処理系依存。
push-->SPの指すメモリにレジスタの1語を書き込み、SPを1語分減らす、
pop -->SPの指すメモリから1語レジスタに読み出し、SPを1語分増やす、 君の処理系でもそう?
792デフォルトの名無しさん:2007/06/27(水) 13:53:34
bne $12,$11,push #$12(取得した文字)と$11(改行文字)を比較して、同じでないならpushへ飛ぶ。
分岐命令と比較命令が一つになってるだけだから、これ自体は別におかしくはないと思うけど。

スタックは使ってないように見えるね。
1.配列は下位アドレスから上位アドレスへ向かって使うが、スタックは上位から下位へ使う。
2.スタックポインタは$29(別名:$sp)で操作できる。
3.残念ながらスタック操作専用命令はないので、$spは自分でやる必要がある。
こんな感じで。

push操作
addi $sp,$sp,-4
sw $12,0($sp)

pop操作
lw $12,0($sp)
addi $sp,$sp,4
793784:2007/06/27(水) 14:04:18
今言語のとこ見てた。push/popが無いのね。補足ありがと。>>792
789のやり方なら、最初に$10にarのアドレスを入れるところで、$10に$SPをコピーしておく。
で、newlineを識別したところでは$SPは何語分か減っているが、最初のコピー$10の指す
メモリから順に取り出せば入力した順に文字が取り出せる、というわけ
794772:2007/06/27(水) 15:00:14
>>792,793さん
書いてくださった事を元に、今書き直しています。
795772:2007/06/27(水) 15:15:44
>>792
教科書には、

push操作
sw $12,0($sp)
addi $sp,$sp,-4


pop操作
addi $sp,$sp,-4
lw $12,0($sp)

とあるのですが、どちらが正しいのでしょうか…
796デフォルトの名無しさん:2007/06/27(水) 15:22:58
>>795
普通は、スタック操作は>795の方でいい。つまり、spは「次に値を格納する場所」を指すことになる。
797772:2007/06/27(水) 15:26:54
>>796
つまり、この場合、playstationを後ろからpushしていき、
pからpopするという事でしょうか?
798772:2007/06/27(水) 16:13:06
スタックポインターがある場合、スタック用に配列は指定しなくて良いのでしょうか?
先生がサンプルのプログラムをWebにアップロードすると言って音信不通(メールを送ってもすべて無視)になり、
教科書にもデータストラクチャの分野はさわりしか書いてない状態で、インターネットで情報を補完しているのですが、
参考にして組んだプログラムもまったく動かず、八方塞状態です。orz

ttp://bebe.run.buttobi.net/up/src/be_1280.txt
799デフォルトの名無しさん:2007/06/27(水) 16:32:54
la $10, $29
800772:2007/06/27(水) 16:40:17
>>799
???

ttp://www.cs.uaf.edu/~cs301/notes/Chapter8/node9.html

このWebページを参考にして普通に出力されるように書いているのですが、
見た目はスタックのように見えるのですが、これはただ配列を参照しているだけでしょうか?
801デフォルトの名無しさん:2007/06/27(水) 16:49:37
データ構造からみると、配列をスタック的に使っていると言える。
けど、マシンそのものがスタックを提供してるんだから、配列でスタックを実装する意味なんかないよね。
802772:2007/06/27(水) 17:02:28
>>801
>>792さんのコードを参考にして、
ttp://bebe.run.buttobi.net/up/src/be_1281.txt
このようにPushとPopを逆にしてみたのですが、まったく動作しません…

いったいどのようにやれば、このような構造でplaystationと入力した場合、
playstationと普通に表示されるのでしょうか…
803デフォルトの名無しさん:2007/06/27(水) 17:59:35
>>802
逆順には表示されたの?
804772:2007/06/27(水) 18:10:24
>>803
逆順には表示されました。

後、課題が表示されているWebページを見たら別にスタックでなくても良いらしく、
>>773さんの手順で書いてみたのですが、それでもエラーを吐いてきますorz
ttp://bebe.run.buttobi.net/up/src/be_1282.txt
805772:2007/06/27(水) 18:46:05
もう無理です… 逝ってきますorz
806デフォルトの名無しさん:2007/06/27(水) 19:06:38
そこまでできているなら後ちょっとじゃん。
>802をベースに、
printの前で$8を別のレジスタに保存、$8を0に再セット。
$8を1引く代わりに↑のレジスタを1引く。
putcした後に$8を1足して、bgtzで較べるレジスタを↑のレジスタに変更。
807デフォルトの名無しさん:2007/06/27(水) 19:18:12
>>806
文字で説明しても混乱するだけだろうから、コード書いてやった方がいいんじゃね
808デフォルトの名無しさん:2007/06/27(水) 20:05:00
わからん・・・。何がやりたかったのか、わからん。
はじめはキューでやらなければいけないと言い、
次にスタックを2回つかわなければならないと言い、
最後にはスタックは使わなくてもいいと言う。

からかわれてただけなのか?
809806:2007/06/27(水) 20:11:08
>>807
>808の懸念があるから敢えて書くの止めた。
810772:2007/06/27(水) 20:18:57
とりあえずカップ麺食べてきました。

>>806
ありがとうございます。ご指導の通り作ったら、playstationの最初の1文字だけは表示されるようになりましたorz
書いたコードですが、どこが>>806さんの手順に沿ってないのでしょうか?
ttp://bebe.run.buttobi.net/up/src/be_1283.txt

>>808
最初課題が出されたときはキューでやれ、だったのですが
クラスメートの誰かがキューとスタックを勘違いし、スタックで作って
それがリバースオーダーの段階までいっていたので、スタックに急遽変更(その時点でキューでの提出者0)
になり、提出日が近づいてもクラスの3分の2が提出できなかったのでもう何でもいいから、
入力した文字をそのまま出力できれば良い、になっていました。
811デフォルトの名無しさん:2007/06/27(水) 20:23:26
指導者がバカだとこうなるって見本のような……
812772:2007/06/27(水) 20:40:48
>>811
大学院生がクラスを教えてるんですが、最近子供が産まれたとかで
質問のメールを送っても無視ですorz 返信がきたことありません。
オフィスにいるはずの時間も基本いなくて、授業の後に質問したら「メールで送れ」と言うだけで…
ただやってる研究が凄いらしく、大学側に文句を言っても何も起きません。、
研究者、技術者としては最高だと思われるのですが指導者としては最悪だと思いますorz
813デフォルトの名無しさん:2007/06/27(水) 20:44:36
 インデックスレジスタを0に初期化
入力ルーチン:
 1文字入力
 バッファ先頭+インデックスレジスタの位置に格納
 インデックスレジスタ+1
 入力された文字が改行でないなら入力ルーチンへループ
 インデックスレジスタを0に初期化
出力ルーチン:
 バッファ先頭+インデックスレジスタの位置から文字を取り出す
 取り出した1文字出力
 インデックスレジスタ+1
 出力した文字が改行でないなら出力ルーチンへループ
 終了

入力されたのが出力されりゃいいだけなら、こんな感じじゃあるまいか。
getsとputsを使って手抜きしてもいい気がする。
814772:2007/06/27(水) 21:09:49
エラーは出ますが、playstationと入力した時にplaystationと表示されるようにはなりました。

ttp://bebe.run.buttobi.net/up/src/be_1287.gif
ttp://bebe.run.buttobi.net/up/src/be_1286.txt
815デフォルトの名無しさん:2007/06/27(水) 21:14:18
>>812
いや、自分で考える習慣を付けさせてるんだから最高の教官だと思うが。
816772:2007/06/27(水) 21:29:35
>>815
まともな教官なら提出期限3時間前の時点で、未提出3分の2という状況はないと思いますorz
個人的にはプログラム板の人に講義をしてもらいたいところです。

>>814のコードですが、lb $9, A($8)がエラーを起こしているみたいです。
readで保存したsb $9, A($8)を呼び出しているだけだと思うのですが、
何がいけないのでしょうか?
817デフォルトの名無しさん:2007/06/27(水) 21:57:10
そんなときには1ステップづつ実行して、自分が想定した動きをしているか確かめよう。
デバッグ作業が勝利の鍵だ。
818デフォルトの名無しさん:2007/06/27(水) 21:58:17
>>816
そこは問題ない。814のコードは忘れて、810のコードに戻れ。
printの前で$8を別のレジスタに保存 が問題。
別のレジスタに$8が保存されてないからループが始まった瞬間、
0以下になりループから脱出するので一文字しか出力されない。
819772:2007/06/27(水) 22:05:38
>>817,818
動きました!早速提出してきます。
本当にありがとうございました!
820デフォルトの名無しさん:2007/06/27(水) 22:10:53
>>819
おめ。810の時点で物凄くコード書きたかったが、手淫しながら待っててよかった。
821デフォルトの名無しさん:2007/06/27(水) 22:33:31
.data
S1: .asciiz "Enter a string: "
S2: .asciiz "You Entered: "
A: .byte 0:80 # 80 character byte array
.text
__start:
puts S1 # prompt for input
li $8, 0 # array index, I
li $10, '\n' # newline character
read: getc $9 # read a character
sb $9, A($8) # store A[I]
add $8, 1 # I <- I + 1
bne $9, $10, read # check for newline
li $8, 0 # array index, I = 0
puts S2 # prompt for output
print: lb $9, A($8) # load A[I]
putc $9 # print A[I]
add $8, 1 # I <- I + 1
bne $9, $10, read # check for newline
done
こんなのFランク大学の学生でも、ハナクソほじりながら出来る気が。
これを2/3が提出出来ないって、ゆとりはすごいな。
822デフォルトの名無しさん:2007/06/27(水) 22:34:41
といいつつ、コピペ修正忘れてprintへ飛ぶところをreadのままにしてる
俺がゆとりだった罠。
823デフォルトの名無しさん:2007/06/28(木) 19:24:29
すごい・・・2chの親切な人が全てここに集まった気がする
824デフォルトの名無しさん:2007/06/28(木) 22:05:52
インテルのアセンブリ言語(たとえば加算、減算、ロード、ストア)の命令セッ
トの構成とMIPSの命令セットの構成の違いを教えていただきたいのですが、お
願いします。
825デフォルトの名無しさん:2007/06/28(木) 22:06:41
大学のレポートで、今日中に書かなきゃやばいです・・・
826デフォルトの名無しさん:2007/06/28(木) 22:32:26
マルチ良くないぜ、たけし君
827デフォルトの名無しさん:2007/06/28(木) 22:33:15
たけし?
大体マルチじゃないよ。
828デフォルトの名無しさん:2007/06/28(木) 22:48:44
86系命令セットで数TFLOPSを実現するらしい
829デフォルトの名無しさん:2007/06/28(木) 23:56:10
よくわからないけどありがとう・・・
質問を打ち切ります。
830デフォルトの名無しさん:2007/06/29(金) 00:17:07
ここで聞いたことを後で後悔するんだろうな
831先に後悔するなら大変だが:2007/06/29(金) 07:55:55
>>830
大丈夫、後で後悔するなら当たり前だから。
832デフォルトの名無しさん:2007/06/30(土) 09:33:24
MIPS/SPIMにて最初の20の二乗の合計を計算するプログラムを組みたいのですが、
どうやればいいのでしょうか?
833デフォルトの名無しさん:2007/07/01(日) 05:23:18
>最初の20の二乗の合計 ってなんか抜けてないか?
最初の20個の整数?素数?テーブルの中身? 何bitの情報?
834デフォルトの名無しさん:2007/07/01(日) 07:20:20
>>833
1から20までの数値の二乗を足していって、その結果を表示するプログラムです。
説明がわかりにくくて申し訳ありませんでした。
テーブルの中身、何bitの情報というのは説明されていないので分かりません。
とにかく、結果が表示されれば良いと思います。

ここまで作ってみたのですが、エラーを起こしてしまいます。
悪い点があればご教示お願いします。
ttp://doiob.net/doiob/uploader/src/up7205.txt
835834:2007/07/01(日) 07:22:50
836デフォルトの名無しさん:2007/07/01(日) 08:32:42
>>834
ニモニック知らないで指摘するけど。
・「エラーを起こす」とは?
・$0は何に使っている? その初期値は何?
・$5にロードしているらしい0x1001は適切? 仮にセグメンテーションフォルトならここで起きてない?
・結果は$2に入っていると思うのだけど、どうやって出力しているつもり?
・最後のsyscallはなに? プロセス終了か何か?
837834:2007/07/01(日) 08:57:45
>>836
・「エラーを起こす」とは?
SPIMを使ってコンパイルをしても何も表示されません。

・$0は何に使っている? その初期値は何?
レジスターに渡す時の数値の入れ子として使っています。初期値は常に0です。

・$5にロードしているらしい0x1001は適切?
ここでnumintsをロードしたいのですが、動作していないようです…

・結果は$2に入っていると思うのだけど、どうやって出力しているつもり?
addi $v0, $0, 4 #文字を出力 宣言
add $a0, $2, $0 #$2を出力
syscall

・最後のsyscallはなに?
プロセス終了です。
838デフォルトの名無しさん:2007/07/01(日) 09:10:31
なるほどなるほど。

>SPIMを使ってコンパイルをしても何も表示されません。
それはエラーじゃないな。確かに「誤り」ではあるけど普通そう言うと、
システム側が出力するエラーのことになる。

で、なんでnumintsが要るの?
1から20の数値を扱うならメモリ空間は必要ないわけだが。

>addi $v0, $0, 4 #文字を出力 宣言
>add $a0, $2, $0 #$2を出力
>syscall
どう見ても>835と違うわけだが。
839834:2007/07/01(日) 09:24:44
>>838
numints、分かりやすいようにと付けたんですが、
まったく必要ないですね…

addi $v0, $0, 4等の横のコメントは今付け加えました。

これを高水準言語でやると、

int count = 0;
int i = 1;

while(i<20){

count += i * i;
i++;

}
//出力count

となると思われるのですが、アセンブラだと思い通りにいかないですね。
840834:2007/07/01(日) 09:31:37
>>838
元となったプログラムです。
こちらの方は出力はされる事はされるのですが、数値ではなく
■が表示されます。おそらく、ASCIIテーブルの関係上、
そんな数値は存在しない、と返してくると思うのですが
どうやったらきちんとした数値が表示されるのでしょうか…

ttp://doiob.net/doiob/uploader/src/up7208.txt
841デフォルトの名無しさん:2007/07/01(日) 10:17:41
puts = put string(文字列)
put??= put ?????(整数)
842834:2007/07/01(日) 11:28:23
>>841
>>840のプログラムは♂が表示されるようになりました…。

見やすいようにコメントを付けてみました。
ttp://doiob.net/doiob/uploader/src/up7210.txt
実行すると、エラーは起きないのですが、結果が何も表示されません…。
843834:2007/07/01(日) 13:17:09
すいません。どなたか下記のコードをMIPSアセンブラで実行した際、
2870と表示されるサンプルコードを書いてはいただけないでしょうか?

int count = 0;
int i = 1;
while(i<20){
count += i * i;
i++;
}

ずっとやっているのですが、全然出来ません。
844デフォルトの名無しさん:2007/07/01(日) 14:00:52
>>842
>840にはputsってのがあるのに今度はまたそれがない。
putsで出力しているんじゃないの?
あんたへのレスに、ヒントになりそうなことは山ほどあるんだけど全然理解できてないだろ。
いい加減に行き当たりばったりで振り回さないでくれるかな。
845デフォルトの名無しさん:2007/07/01(日) 16:03:33
846あほかい:2007/07/01(日) 16:26:11
自演だとでも?
847デフォルトの名無しさん:2007/07/01(日) 21:32:40
とりあえずさ、わからないで答えてるやつは自重しようよ。
848デフォルトの名無しさん:2007/07/01(日) 22:49:43
# 1~20までの二乗の合計を求める (記述言語:MAL)
# 使用レジスタ
# $t0($8) : ループカウンタ
.text
.globl __start
__start:
li $t0,20 #ループカウンタ。初期値は20。
mtlo $zero #アキュームレータ下位を0に初期化。
while: beqz $t0,end #ループカウンタが0ならば、ループを抜ける。
madd $t0,$t0 #二乗をアキュームレータに加算。
addi $t0,-1 #ループカウンタをデクリメント。
b while #whileへループ
end: mflo $a0 #$a0 = アキュムーレータ下位 (=合計)
li $v0,1 #合計を出力。使うのは syscall print_int
syscall
li $v0,10 #syscall exit
syscall
849デフォルトの名無しさん:2007/07/02(月) 01:27:20
>>843
UC BerkleyのFreshmanか?似たような事を61Cでやった事がある。
どちらもプログラムのコードはOK。でも、それでは一文字しか出力されない。
ASCIIでバイアス調整する必要もあるし、出力を自分で導かないといけない。

こんな感じで書けばいいと思う。出力確認済み。
ttp://doiob.net/doiob/uploader/src/up7298.txt

>>844
この場合、文字列、整数じゃなくて文字だろ。
puts,putiじゃなくて使うのはputc。$v11。

>>848
理論はあってるけどそれでは無理。SPIMでは出力されない。
850834:2007/07/02(月) 06:09:57
>>849
完璧です!きちんと表示されました。ありがとうございました!
851834:2007/07/02(月) 06:13:03
あと、UC系列ですがUC Berkleyではありません。
852デフォルトの名無しさん:2007/07/02(月) 11:09:17
結局、丸投げに終わったわけだ。
853デフォルトの名無しさん:2007/07/02(月) 15:33:13
>>849
> >>848
> 理論はあってるけどそれでは無理。SPIMでは出力されない。
えぇと?spim ver. 7.3で出力を確認済みなんですが?
SPIMでは出力されないという根拠を聞かせてもらいたい。
854デフォルトの名無しさん:2007/07/02(月) 19:31:38
>>853
834のコードからしてspimsal使ってるんだろう。
spimsalだとそのコードでは0としか出力されない。
855デフォルトの名無しさん:2007/07/02(月) 21:09:38
spimsalでは0になる??
はて、何でじゃろか?madd使ってるせい?
856デフォルトの名無しさん:2007/07/04(水) 12:03:20
とりあえずmallを使わずにmulとadd使ったらちゃんと出力された。
print_intを使う事は何も問題がなさそう。
857デフォルトの名無しさん:2007/07/07(土) 14:21:30
CASLIIの超初歩問題らしいですがお願いします

レジスタ1の値をレジスタ2の値で割った余りをレジスタ1に格納して戻るプログラム
を作成してください

858デフォルトの名無しさん:2007/07/07(土) 19:03:46
simasita
859デフォルトの名無しさん:2007/07/07(土) 19:49:07
>>857
REMAIND SUBA   GR1,GR2
        JMI    LEND
        JUMP   REMAIND
LEND    ADDA   GR1,GR2
        RET
860デフォルトの名無しさん:2007/07/09(月) 06:57:00
RET
861デフォルトの名無しさん:2007/07/09(月) 12:08:25
アセンブラを使ってオセロソフトを作れという宿題がでました
サッパリわかりません

CPUはathlon64 3000+
メモリ1GB
VGA:Geforce6600GT
です
ヨロシクお願いします
862デフォルトの名無しさん:2007/07/09(月) 13:36:50
俺x86は分かるんだけどx64は分からないんだ
ごめんな
863デフォルトの名無しさん:2007/07/09(月) 13:51:42
>>862
取り敢えず、x86でいいから作ってみてよ。漏れがx64にコンバートするから。
864デフォルトの名無しさん:2007/07/09(月) 14:22:11
オセロって、コンピュータのアルゴリズムも発明しなきゃなの?
865デフォルトの名無しさん:2007/07/09(月) 14:27:09
>>864
「オセロ」って言う名前のコンピュータのアルゴリズムってなんだ?
866デフォルトの名無しさん:2007/07/10(火) 10:54:49
↑はネタだとしても、○投げにもほどがあるぞ。アルゴリズムぐぐるだけだって一仕事だ。
データ構造決めて、cならこんなコードになる、こんなルーチンが欲しい程度までバラしてから
ここで聞くなら解るが。
867デフォルトの名無しさん:2007/07/10(火) 22:18:29
CASLUの質問です。
縦横16ビットの2進数2値を使ったビットマップ表示を考える問題なんですが
全体で0のビット数より1のビット数が多い場合とそうでない場合とで条件分岐
させたいのですがどんな条件をつければいいのでしょうか?
説明下手ですみません…
868デフォルトの名無しさん:2007/07/11(水) 00:09:38
1のビット数を数えて、それが128より大きければ、0のビット数<1のビット数
869デフォルトの名無しさん:2007/07/11(水) 04:56:23
>>861
君の使用しているCPUではなく、授業で習っているアセンブラのCPU名を…
x86とか、MIPSとか。
870デフォルトの名無しさん:2007/07/11(水) 07:32:12
オセロだろ。
漫才のネタをランダムに出すようなのを作れば良いんじゃまいか。
871デフォルトの名無しさん:2007/07/11(水) 15:15:04
お前は何を訳の分からないことを言ってるんだ?
猿にキーボードを叩かせて戯曲ができるまで続けるシミュレーションソフトのことだぞ
872デフォルトの名無しさん:2007/07/12(木) 18:32:53
NUM番地から5語の領域に数字が格納されている。その数字が数として
どのような値になるか求め数値をVAL番地に格納する。

例)12345
NUM番地+(+1~+4)に'1','2','3','4','5'を格納してます。
JICコード見ると'1'は31、ここから'0'引いて'1'-'0'=1(数)
これを'5'まで繰り返す。最後は12345をVAL番地に格納します。

レジスタはGR0~7
出力が16進の3039(10進だと12345)になるっぽいです。
よろしくお願いします。

873デフォルトの名無しさん:2007/07/12(木) 19:32:01
>>872
自分の使っているアセンブラ以外にこの世にアセンブラはないと思ってるだろ?

         START    ENTRY
NUM      DC       '12345'
LEN      DC       5
VAL      DS       1
ENTRY    XOR      GR0,GR0
         LAD      GR1,NUM
         LD       GR2,LEN
LOOP     LD       GR3,GR0
         SLA      GR3,3
         SLA      GR0,1
         ADDA     GR0,GR3
         ADDA     GR0,0,GR1
         SUBA     GR0,='0'
         ADDL     GR1,=1
         SUBL     GR2,=1
         JNZ      LOOP
         ST       GR0,VAL
         RET
         END
874デフォルトの名無しさん:2007/07/12(木) 19:58:17
>>873 ありがとうございました。
書き方もいろいろあるみたいですね。
私は
     RET
NUM DC '1'
     DC    '2'
DC '3'
DC '4'
DC '5'
LEN DC 5
VAL DS 1
END
のような書き方なんですが、ENTRYはジャンプと考えていいですよね。
これで明日試してみます。<(_ _)>

875デフォルトの名無しさん:2007/07/12(木) 20:05:36
>>874
決められていなければデータをどこに置くかは好みとか気分次第だから
STARTの後のラベル名がついたアドレスは実行のエントリポイントを表す
ラベル名を指定しなければSTARTの次から実行が始まる
CASLIIの仕様書を見れ
876デフォルトの名無しさん:2007/07/12(木) 20:23:27
仕様書をみるとSTARTの前にもラベルを指定しなくちゃいけないみたいなんですけど・・・
仕様書読みました?
877デフォルトの名無しさん:2007/07/12(木) 23:20:59
>>876
命令行のラベルは無くてもいい(2.1(4))
2.2の表のほうが間違いじゃないか?
実際のところ本家のセンターのシミュレータはラベル無しSTARTを通す
ラベルありEND命令は通さないところを見ると省略可能にはあってはいけないの意味も含めるらしい
878デフォルトの名無しさん:2007/07/12(木) 23:51:19
A=B+E;
C=B+F;
なるCのコードについて以下の問に答えよ

(1) 上記のコードから生成されるMIPSのコードを示せ。
ただし各変数は次のようにメモリ上にあるものとする。
また計算途中で使用できるレジスタは$t0〜$t5とする($t:ベースレジスタ)とする。

↓$t0からのオフセット値
0  B
4  E
8  F
12 A
16 C

宜しくお願いします。
879デフォルトの名無しさん:2007/07/13(金) 14:21:23
それ質問じゃなくて丸投げ
880デフォルトの名無しさん:2007/07/13(金) 14:30:16
>>878
Cコンパイラを使ってコードを生成しろ。
以上。
881デフォルトの名無しさん:2007/07/14(土) 22:13:26
俺みたいなちょっとスクリプト覚えた奴と、このスレの神々が素人から見たら割と
同じように見えるっていうのが困る。俺も早く低いとこ触らないとな・・!(チラシの裏)
882デフォルトの名無しさん:2007/07/14(土) 22:26:06
アセンブラ使えるだけのニートも混ざってるから
あまり気にしなくてもいい気がする。
883デフォルトの名無しさん:2007/07/15(日) 02:19:03
神は自らに似せて創りたもうた
884デフォルトの名無しさん:2007/07/25(水) 21:12:23
誰もアセンブラの質問投げないのかよ・・・

っつーか、+αの給料欲しいならアセンブラの知識も必要だぜ?
ホラ吹き営業でも給料高いけど。

なんか、質問くれくれ厨みたいな俺。
885デフォルトの名無しさん:2007/07/26(木) 00:49:47
Trace/BPT/RangeErr/DivZero/Ovflow trap
のエラーの意味を教えてください
886デフォルトの名無しさん:2007/07/26(木) 00:55:23
>>885
CPUのマニュアル読め
せめて型式を提示すること
887デフォルトの名無しさん:2007/07/26(木) 01:26:06
それ以前にテンプレ>>1読め
888デフォルトの名無しさん:2007/07/26(木) 01:27:33
888
889デフォルトの名無しさん:2007/07/26(木) 21:40:16
>>885
CPU名とコンパイラを教えてくれないと・・。
4番目は割り算の除数が0という意味です。
3番目は、アドレス、レジスタなど入力したい対象に代入したい定数の範囲が超えたのでは?

っていうか、質問が欲しいとは言ったが、困ってるのかな?>>885
890デフォルトの名無しさん:2007/07/27(金) 00:11:40
質問させていただきます。環境はMIPSです。

問題文:
10000!(10000の階乗)の全桁を求めて表示するプログラムを作成せよ。

効率を良くするために、一桁ごとでなく四桁ごとに区切って計算するように考える。
つまり10進数の四桁を一桁として10000進数として表現し、
その各桁ごとに掛け算と繰り上げの処理を行う。
10000の階乗は結果として10進数で35660桁(10000進数で8915)桁
となるので、配列は32bit整数8915個で十分である。
配列領域の確保は、.word擬似命令を用いる

例:
62 2702 0800 × 14
= 868 37828 11200 = 868+3 7828+1 1200 = 871 7829 1200

また、提供されているputintでは途中の0が表示されないので、
それを解決するために、配列の要素を表示するときに
1・要素が999以下なら”0”をひとつ表示
2・要素が99以下なら”0”をひとつ表示
3・要素が9以下なら”0”をひとつ表示
4・putintを使って要素の値を表示
とする
891デフォルトの名無しさん:2007/07/27(金) 00:11:43
Cで記述した場合:
#include<stdio.h>
#define MAXKETA 10000

unsigned fact[MAXKETA];

int main(){
unsigned n = 10000;
unsigned kake;
unsigned agari;
unsigned top;
int i,j;

fact[0] = 2; top = 0;
for(kake = 3; kake <= n; kake++){
agari = 0;
for(i = 0; i <= top; i++){
j = fact[i] * kake;
j = j + agari;
agari = j / 10000;
fact[i] = j % 10000;
}
if(agari > 0){
top++;
if(top >= MAXKETA) exit(-1);
fact[top] = agari;
}
}
for(i = top; i >= 0; i--){
printf("%d",fact[i]);
}
}
892デフォルトの名無しさん:2007/07/27(金) 00:35:25
define
893デフォルトの名無しさん:2007/07/27(金) 04:06:20
>>890
実行環境は正確に。
単にMIPSと書いたらMIPS32であるとみなすからね。
894デフォルトの名無しさん:2007/07/27(金) 08:07:12
>>893
すみませんでした。
MIPSのバージョンとかがよく分からないんですが、
OSはLinuxで、アセンブラで記述した場合は
.text
.globl main
.ent main
main: subu $sp,16
sw $31,12($sp)

(ここが作成したプログラム)

move $2,$0
lw $31,12($sp)
addu $sp,16
j $31
.end main

といった感じになるものです
レジスタは$8〜15、$16〜23が使えます
895デフォルトの名無しさん:2007/07/27(金) 20:29:18
同じ大学でワロタ
つか解答貰ったでしょ?
896デフォルトの名無しさん:2007/07/27(金) 23:28:53
そんなもの貰ってません
だから多分違う大学ですね
897デフォルトの名無しさん:2007/07/27(金) 23:35:05
しかし問題文がほぼ同じなんだが・・・
J科じゃないのか
898デフォルトの名無しさん:2007/07/27(金) 23:53:37
>>896
なんでそんな冷たいのよwww
899デフォルトの名無しさん:2007/07/28(土) 01:49:49
つまり、
二人とも同じ非常勤講師のテストを受けてるんじゃないか?

あるいは
どっちかがパクったんじゃないか?

そしたら、まだ解答を渡されてない方は、解答を渡された方と同じプリントをもらえるよ。
よかったな!
900デフォルトの名無しさん:2007/07/28(土) 10:25:12
896がプリントをもらい忘れた、もしくはどこかにやってしまった可能性もある
とりあえず895がその答えとやらを書いてあげればいいじゃないか
901デフォルトの名無しさん:2007/07/28(土) 14:00:25
おまいら既に解答が存在してる問題は解きたくないのか・・・

頑張って解いて、リロードしたら解答が貼られていた、とか嫌だよな。。。
902デフォルトの名無しさん:2007/07/28(土) 14:24:19
896が何も反応しない限り895も解答出す気無いっぽいからなぁ
903デフォルトの名無しさん:2007/07/28(土) 22:33:42
配列領域を.wordで確保とかしたくねえなぁ。
.spaceじゃだめなのか?
904デフォルトの名無しさん:2007/07/30(月) 21:52:33
暇つぶしに10000!のやつを書いてみた。
が、素直に書きすぎたせいか実行速度が無茶苦茶遅いんだ。
なんとか高速化できないもんかね?
905デフォルトの名無しさん:2007/07/31(火) 02:51:15
夜遅くすいません

アセンブラなんですが
OUT命令で
文字を出力したんですが
そのあと
もうひとつ出力命令すると
改行されず連続で出力されてしまいます。
例えば
ワタシ
アナタ
と出力したいのに
ワタシアナタ
なってしまいます。
ご存知の方お願いしますm(_ _)m

906デフォルトの名無しさん:2007/07/31(火) 03:03:34
>>905
お使いの環境に関するマニュアルに、出力するポジションを指定する方法か
改行する方法についての記述はございませんでしょうか。
手前どもにはそちらさまのお使いのCPUも出力機器も皆目見当がつきませんので。
907デフォルトの名無しさん:2007/07/31(火) 03:05:57
>>906
申し訳ございませんでしたm(_ _)m
CASLです。
マニュアルは手元にございません。
908デフォルトの名無しさん:2007/07/31(火) 04:21:26
>>907
情報処理技術者試験センターのページからダウンロードしろ。
試験受けるならマニュアルくらいは手元に持ってろ。
改行コードくらい出したいときに自分で出力しろ。
COMETだけでなくどんな環境だろうと、いつ改行したら良いか機械は知らない。
909デフォルトの名無しさん:2007/07/31(火) 04:48:21
>>907
OUTは文字データを1レコードとして書き出すとしか規定されていないから、
CASLの処理系によっては改行を加えないものもあるかもしれない。
試験センターで配布されているやつは改行されたよ。
出力されない処理系なら>>908の言うように改行コードを自分でOUTするしかないね。
910909:2007/07/31(火) 04:57:26
「レコードの区切り符号(キーボード入力の復帰符号など)」ってあるね。
でも正確には定義されていないな。こんなにあやふやでいいのか?
仕様通りならレコード末尾のINで格納されない符号がOUTで付けられるはずだけど、
CASLの処理系って結構いい加減なものが多かったりするから。
911デフォルトの名無しさん:2007/07/31(火) 23:45:09
>>904
一回計算して、結果をディスクにぶち込む。

本番プログラムはそれを読み出すようにすれば桶。
912rikuu:2007/08/01(水) 11:56:28
アセンブラは、CASLUでお願いします。
入力された最大256桁の10進正整数について9の倍数か否かを判断し、結果を
出力するプログラムを作成せよ。とあるのですが、よろしくお願いします。
913rikuu:2007/08/01(水) 13:03:07
ヒントも載ってたので載せます。
1.入力を受け付ける。入力文字数が0なら終了。
2.各桁の2進数を求め、加算してゆき、合計を求める。
3.各桁の合計を9で割った剰余が0になるか調べる。
4.結果を出力する。
5.1.に戻る。
914rikuu:2007/08/01(水) 13:15:20
こんなヒントもありました。
COMETUには除算命令がないので、9での割り算は9(または9の倍数)を
引くことにより行う。何回か引いた結果、ちょうど0になれば9の倍数
である。最大256桁の整数であるから、最大256回引くことになる。
演算回数を減らす方法として、90を引いてゆき、0になれば9の倍数、
負になれば9を足していき、0になれば9の倍数、正になれば9の倍数
でないとして終了する方法があるらしいです。
915デフォルトの名無しさん:2007/08/01(水) 17:05:24
何が解らないのですか?
916デフォルトの名無しさん:2007/08/01(水) 18:53:17
まさか、全部コーディングして欲しいとか・・・
まさかな・・・
917デフォルトの名無しさん:2007/08/02(木) 02:01:36
>>918-
もうこのスレは宿題スレとして機能していないし、
真面目に勉強して自分の能力にみあった評価をしてもらった方がいいよ。
918896:2007/08/02(木) 09:39:51
>>897
確かに略称はJ科ですが…
昼間主と夜間主で違うとか?

もしよければその答えを書いていただけると助かります
参考にしてそこから自分なりのものを作りたいので
919デフォルトの名無しさん:2007/08/02(木) 18:17:59
よくないのでお断りいたします
920rikuu:2007/08/02(木) 20:47:04
お断りと言わず、お願いします。ヒントがあっても分からないんです。
921デフォルトの名無しさん:2007/08/02(木) 20:55:48
>>920
フローチャートは書けるんだろうな?
922デフォルトの名無しさん:2007/08/02(木) 21:50:47
>>920 ヒントがあっても分からないんです。

>>917 自分の能力にみあった評価をしてもらった方がいいよ。
923デフォルトの名無しさん:2007/08/02(木) 22:48:09
>>912rikuu
何が分からないんだ。
ヒントの1〜5のどれが分からないんだ。
CASLIIの入力仕様が分からないのか?
それとも、10進数を2進数に変換する方法が分からないのか?
剰余という言葉が分からないのか?
924923:2007/08/02(木) 23:32:24
>>912rikuu
これは知ってるか?ゆとり。

ある10進数の各桁を足した値が9の倍数なら、その10進数は9で割り切れる。
例)927・・・9+2+7・・・18 18÷9=2 余り(剰余) 0 即ち、927は9で割り切れる。
実際の計算)927÷9=103 剰余 0

つまり、rikuuは、ヒントの聞き方を間違っていたんだ。おk?
でなきゃ、256桁の10進数を9で除する問題なんて正攻法では難しすぎる。
925デフォルトの名無しさん:2007/08/03(金) 01:07:50
>>922
自分の能力にみあった評価をしてもらった方がいいよ。
926デフォルトの名無しさん:2007/08/03(金) 22:33:30
>>912
入力された数値が9の倍数ならYESに格納され、倍数じゃない場合はNOに格納される。
TOKETA01 START
  IN INBUF,INLENG
  LD GR1,A
LD GR2,A
LD GR3,A
CPA GR1,INLENG
LOOP01 JZE NEXT
LD GR1,INBUF,GR2
AND GR1,C000F
ADDA GR3,GR1
ADDA GR2,=1
CPA GR2,INLENG
JNZ LOOP01
LD GR4,A
LOOP02 LAD GR4,9,GR4
CPA GR3,GR4
JZE J1
JMI J2
JUMP LOOP02
J1 ST GR3,YES
JUMP NEXT
J2 ST GR3,NO
NEXT RET
A DC 0
INBUF DS 256
INLENG DS 1
C000F DC #000F
YES DS 1
NO DS 1
END
927デフォルトの名無しさん:2007/08/04(土) 00:33:37
>>925 の評価は最低ランクに決まりました
928デフォルトの名無しさん:2007/08/04(土) 00:52:23
>>927
自分の能力にみあった評価をしてもらった方がいいよ。
929デフォルトの名無しさん:2007/08/04(土) 08:03:41
あなたにしては、よくがんばった、80点。
930デフォルトの名無しさん:2007/08/04(土) 13:00:12
質問です。

アセンブリ言語の仕様として、
論理演算実行時にゼロフラグと符号フラグを0にリセットするような仕様は
非標準的ですか?

演習で出されたアセンブリ言語の仕様がそうなっていて、
もし非標準的なら文句を言おうと考えてますので参考までに。
931デフォルトの名無しさん:2007/08/04(土) 13:01:06
あげます。
932デフォルトの名無しさん:2007/08/04(土) 13:08:14
別にいいんでない?
論理演算を行うことで、算術演算の結果なんて捨てちゃっても。
そんなことは言語レベルで判断するようなことじゃないわけだし。
933デフォルトの名無しさん:2007/08/04(土) 13:26:03
実在の石でもあるよ。8085とか。
934デフォルトの名無しさん:2007/08/04(土) 13:26:26
ま、0をレジスタにロードすると0フラグが立つCPUもある事だし。
935デフォルトの名無しさん:2007/08/04(土) 14:44:20
>>930
符号フラグはともかくゼロフラグまで常にクリアはありえねぇと思う。
あるビットが0か1かどうかAND命令で判定する場合とかどうすんのよ。

ハード的にも論理演算だけフラグ更新をしないなんて仕様は回路が複雑に
なるだけ不利なのは目に見えてる。
936デフォルトの名無しさん:2007/08/04(土) 14:46:46
次スレどうする?
937930:2007/08/05(日) 00:30:42
>>932-935
どうもありがとうございます。
ゼロフラグをクリアするのはちょっと変ですよね。
その旨伝えようと思います。
また、そういう仕様のプロセッサもあるということを教えて頂き
勉強になりました。
938デフォルトの名無しさん:2007/08/05(日) 01:25:02
文句つけたからって使わなけりゃいけない現実が変わるわけじゃあない。
人間が石にあわせる他ないんだ。
939デフォルトの名無しさん:2007/08/05(日) 06:03:19
「靴に足を合わせろ!」がまかり通った旧軍時代みたいだな
940デフォルトの名無しさん:2007/08/05(日) 09:26:26
自分で石を選択出来れば良いけど、望みどおりの石ってのも無いしな。
どこかで妥協しなけりゃならんのさ。
941デフォルトの名無しさん:2007/08/06(月) 00:55:05
>>939
はぁ?今、自衛隊に入っても同じ事言われますが何か?
942デフォルトの名無しさん:2007/08/06(月) 22:29:51
自衛隊に入るような奴のことまで構ってられないよ。
943デフォルトの名無しさん:2007/08/07(火) 22:08:09
で、>>941は自衛隊に入っているのかいないのか!
944デフォルトの名無しさん:2007/08/08(水) 17:46:15
>>917
ここは宿題(丸投げ)スレじゃない。
宿題質問スレなんだ。
質問スレとしては、そこそこ機能してるように思う。回りくどい回答ばかりだけど。

# アセンブラの宿題隔離スレとしてはかなり機能してるかなw
945デフォルトの名無しさん:2007/08/08(水) 17:52:28
あ〜、オペコードの逆引き一覧表が欲しい。
946デフォルトの名無しさん:2007/08/08(水) 17:59:48
まあ機能していなければ900レスも伸びる方が不自然だわな。

こんな広く浅い分野じゃ「アセンブラの宿題は俺にやらせろw」みたいな奇特な奴も少ないだろうし。
こんなとこじゃねえの?
947デフォルトの名無しさん:2007/08/09(木) 06:18:27
ゼッパチと85なら俺に任せろ(w 狭すぎて誰も来なさそう
948デフォルトの名無しさん:2007/08/09(木) 07:00:33
8086と86000とsh2とarmぐらいなら
949デフォルトの名無しさん:2007/08/09(木) 07:54:08
>>948
宿題お願いします。
CPUはZ80、MSX1用の機械語モニタを2K以内に収まるように作ってください。
メモリダンプ、逆アセンブル、一行アセンブルの3つが出来るだけでいいです。
単価は30円/1行(コメント行除く)でお願いします(嘘)
950デフォルトの名無しさん:2007/08/09(木) 11:45:15
何故>>948にZ80の問題を?
951デフォルトの名無しさん:2007/08/09(木) 14:49:55
>2K以内に収まるように ・・・できるとして、平均2byte/命令で最大1000行=\3マソだな。
1桁違うな。「あたりまえにできる」ことが判っていて1000行書くだけで\60マソぐらいがプロの相場。
「できるかどうかわからない」/「受け手のスキル次第でできるかもしれない」 のコストを加味
したら、\100〜\150ぐらいまでになりそうなもんだ。 宿題丸投げにしてはデカすぎる。
95288000 なら知ってるが。:2007/08/10(金) 00:29:24
>>948
どこの CPU ? > 86000

>>951
妙に安いな > \100〜\150ぐらいまでになりそうなもんだ。
953デフォルトの名無しさん:2007/08/10(金) 01:52:04
100で受けてバイトに30で出すと差額が儲かるとは思わないか?
954デフォルトの名無しさん:2007/08/10(金) 02:27:45
>>953
完成しなかった時の責任はだれが取る?
バイト君が給料泥棒になる可能性はかなり高い
955デフォルトの名無しさん:2007/08/10(金) 02:42:57
>>952
たしかIntelのRISCだ >86000
Motorola の 88000と同時期くらいだったと思うけど。
956955:2007/08/10(金) 02:52:54
すまん。80860と間違えたw
元の質問の86000は68kの間違い?
957デフォルトの名無しさん:2007/08/10(金) 04:30:20
R3000
958デフォルトの名無しさん:2007/08/10(金) 08:55:19
V30なら任せろ
959デフォルトの名無しさん:2007/08/10(金) 11:15:58
AWとかって書くの?
960デフォルトの名無しさん:2007/09/05(水) 01:37:42
アセンブリ初めて二週間。意味がわからない状態が続いています。なんとなくわかったことはCやJAVAがアセンブリになりそれが機械語に変換され、その間のアセンブリを良く知っているとパソコンの基礎を理解するのに便利ですよーの程度です。

そんな私が学校から頂いた宿題ですが、
int temp = 0;
for (int i=0; i<100; i++)
temp+=A[i]
なるC言語をMIPSになおせ。

素人ながらもここまでやってみました。
move $t1, $zero #temp=0
move $t0, $zero
addi $t0, $t0, 1
add $t3, $a0, $t0 # アレイA[i]のアドレス=$t3
addi $t1, $t1, $t3
for: slt $t2, $t0, 100 #$t3 = (i<100)
beq $t2, 100, exit #if(i<100) go to exit

j exit
exit:

プログラムの間違いを修正、アドバイスをして頂ける方がいらっしゃいましたらよろしくお願いします。
961デフォルトの名無しさん:2007/09/05(水) 17:56:48
意味がわからないもなにも、CPUにさせたい動作そのものを記述するだけだろう。
命令表を見ながらやれば悩む要素なんざどこにもない。
962デフォルトの名無しさん:2007/09/05(水) 20:53:25
>>960
t1<-0 temp=0;
t0<-0 i=0;
loop:
t0>=100ならexitへ if (i>=100) hoto exit;
t2<-t0*4
t1<-t1+A(t2) temp+=A[i];
t0<-t0+1 i++;
loopへジャンプ goto loop;
exit:

これをアセンブラにする
963デフォルトの名無しさん:2007/09/05(水) 21:31:49
そのCのプログラムをMIPSをターゲットにして cc -S
964デフォルトの名無しさん:2007/09/05(水) 23:04:11
965デフォルトの名無しさん:2007/09/06(木) 03:56:44
>>960
素人ながらにナイスファイト。
一度Cコードを何らかのソフトでコンパイルして出てきたAssenblyを閲覧するというのも手だよ。
966デフォルトの名無しさん:2007/09/06(木) 05:54:50
違う石のだけど、ASMリストあげるよ。
int A[100];
void main(void) {
     register int temp = 0;
     static int i;
     for (i=0; i<100; i++)
       temp+=A[i] ;
}
967デフォルトの名無しさん:2007/09/06(木) 06:02:09
これは8bitの石なので、mipsに直せばもっと簡単になるはず。
    DSEG
A_:    DS    200
Z2:    DS    2・・・これが i
    CSEG
%2    LXI    B,0・・・これがtemp
%5    LXI    H,0
    SHLD    Z2
__2:    LHLD    Z2
    LXI    D,100
    CALL    CMPHD##
    JNC    __3
%6    LHLD    Z2
    DAD    H
    LXI    D,A_
    DAD    D
    MOV    A,M
    INX    H
    MOV    H,M
    MOV    L,A
    DAD    B
    MOV    C,L
    MOV    B,H
%5    LHLD    Z2
    INX    H
    SHLD    Z2
    JMP    __2
__3:
    RET
968デフォルトの名無しさん:2007/09/06(木) 14:07:00
i have no idea
969デフォルトの名無しさん:2007/09/06(木) 14:49:36
私は無いイデアを持っています
970デフォルトの名無しさん:2007/09/06(木) 21:07:54
どうして関数が呼ばれて最初に push ebp ってするの? 
971デフォルトの名無しさん:2007/09/06(木) 21:46:35
>>970
ebpは保存しておきたいから。
972デフォルトの名無しさん:2007/09/14(金) 03:38:50
スタックフレームを作るのに使うから。
973デフォルトの名無しさん:2007/09/14(金) 12:29:12
mips用gccでクロスコンパイルすればいいんじゃまいか?
974デフォルトの名無しさん:2007/09/15(土) 11:58:25
975デフォルトの名無しさん:2007/09/21(金) 05:12:36
mata aerukana
976デフォルトの名無しさん:2007/09/26(水) 14:37:23
ナップサック問題のプログラムができません。
誰か助けて下さい。
977デフォルトの名無しさん:2007/09/28(金) 16:51:10
新スレどうします?
978デフォルトの名無しさん:2007/09/28(金) 18:55:53
もし立てるなら アセンブリ に直しといて
979デフォルトの名無しさん:2007/09/28(金) 21:29:22
秋月の電波時計キットを買ってきたのですが、どうやって組み立てればいいですか?
980デフォルトの名無しさん:2007/09/28(金) 21:37:02
jmp 秋月スレ
981デフォルトの名無しさん:2007/09/28(金) 23:47:38
>>979
かなづちで粉砕→水100ccを加え冷凍庫へ
982デフォルトの名無しさん:2007/10/01(月) 18:10:44
>>981
出来ました!ありがとうございました!
983デフォルトの名無しさん:2007/10/02(火) 05:33:39
Write a program in MIPS assembly language to convert an ASCII decimal
string to an integer. Your program should expect register $a0 to hold the
address of a null-terminated string containing some combination of the
digits 0 through 9. Your program should compute the integer value equivalent
to this string of digits, then place the number in register $v0. Your
program need not handle negative numbers and need not be concerned
about values larger than 231 − 1.
If a nondigit character appears anywhere in the string, your program
should stop with the value -1 in register $v0. For example, if register
$a0 points to a sequence of three bytes 5010, 5210, 010 (the null-terminated
ASCII string 24), then when the program stops, register $v0 should contain
the value 2410, (or 11000 in binary). (The subscript ten means base
10.)
984デフォルトの名無しさん:2007/10/02(火) 09:49:18
そっちの方は「アッセンブリ」だろ、という突っ込みは野暮か?
985デフォルトの名無しさん:2007/10/03(水) 02:53:03
push は
・stack pointer を +1 してからデータを積む
・データを積んでから stack pointer を +1 する
のどっちですか。
CPUごとに違う気もしますが、しってる範囲でいいので教えてください。
986デフォルトの名無しさん:2007/10/03(水) 04:51:18
元の質問,間違い?
>231 − 1
2^(31) − 1
>5010, 5210, 010
50(10),52(10),0(10) (10)=decimal
987デフォルトの名無しさん:2007/10/03(水) 05:06:03
>>985
pushはプリデクリメント、popはポストインクリメントが一般的。
Cっぽく書くとこう。
Push : *(--StackPointer) = Data;
Pop : Data = *(StackPointer++);
988デフォルトの名無しさん:2007/10/03(水) 07:23:16
理由は[sp]を参照することで、最後に積んだ値(リターンアドレス)を得ることが出来るから
だと思う。
もちろん、そういうアドレッシングモードが用意されていれば、だけど。
例えば8086は無理でも、その元となった8080(Z80)にはあったはず。
989Socket774:2007/10/03(水) 08:07:40
>>985
+ ぢゃなくて - だよね?
990デフォルトの名無しさん:2007/10/03(水) 10:50:02
985は書き間違いだね。だけど世の中には、pushで+、popで−な石もある。(ADuC831/841とか)
991デフォルトの名無しさん:2007/10/03(水) 12:36:52
プリデクリメント、ポストインクリメントが多いと思う
992デフォルトの名無しさん:2007/10/03(水) 14:16:20
アセンブリ言語の宿題ができないときに、
アセンブリ言語好きのお兄さん・お姉さんに尋ねるスレ。

・必ずCPUの名前を書くこと!
・情報を小出しにしない。書ける情報は全て書いた方が得だよ。

前スレ

アセンブラの宿題質問スレ
http://pc11.2ch.net/test/read.cgi/tech/1161097445/

これで誰か新スレを!
993デフォルトの名無しさん:2007/10/03(水) 14:30:02
>>988
スタックポインタの演算とロード・ストアをアトミックにやる必要がないからじゃないの?
994デフォルトの名無しさん:2007/10/06(土) 15:32:54
995デフォルトの名無しさん:2007/10/06(土) 15:58:15
まぁ、その辺りのスレを使うほうが賢明かも知れんな。
996デフォルトの名無しさん:2007/10/07(日) 05:20:08
h
997デフォルトの名無しさん:2007/10/07(日) 05:23:02
t
998デフォルトの名無しさん:2007/10/07(日) 05:23:39
t
999デフォルトの名無しさん:2007/10/07(日) 05:26:28
p
1000小倉優子 ◆en0rG2J.f6 :2007/10/07(日) 05:27:02
1000ならジュースでも飲むか
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。