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

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

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2006/10/18(水) 00:04:05
アセンブラの宿題ができないときに、
アセンブラ好きのお兄さんに尋ねるスレ。

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

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

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

0008デフォルトの名無しさん2006/10/20(金) 23:58:08
盛り上がらないよなやっぱ
0009デフォルトの名無しさん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
0010デフォルトの名無しさん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
0011デフォルトの名無しさん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
これってもっと簡単に書ける?
0012デフォルトの名無しさん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にセットして戻るように作れ。

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

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

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

0020デフォルトの名無しさん2006/10/23(月) 01:10:36
どなたか教えてください。。。
0021デフォルトの名無しさん2006/10/23(月) 01:34:54
お願いします!
0022デフォルトの名無しさん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

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

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

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

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

1命令って、どういうプロセスで実行されるんだっけか?
読み出しに1クロック、解釈に1クロック、実行に1クロックで、合計3クロックか?
0027デフォルトの名無しさん2006/10/23(月) 04:05:36
書き戻しもあるぞよ
0028デフォルトの名無しさん2006/10/23(月) 04:15:08
いまどきのプロセッサはそう単純にはなってないだろうが
昔は、fetch, decode, execute, writeback の4つに分類されてたな。
0029デフォルトの名無しさん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
0030デフォルトの名無しさん2006/10/23(月) 11:56:44
2つだけでもオーバーフローは起きる
0031デフォルトの名無しさん2006/10/23(月) 12:51:32
>>14です!
教えてくださいお願いします
問題は書いた通りです

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

急ぎですのでなるべく早くお願いします!
0032デフォルトの名無しさん2006/10/23(月) 13:01:04
>>15-16の何が不満なんだろう。
0033デフォルトの名無しさん2006/10/23(月) 14:38:55
結局自分で考えて提出しました‥
答えも教えてもらいましたが全然違いました‥このスレの人のも
もうかなりヤバイです(ノд`)
答え1問目は5億何ちゃらというとんでもない数字でした
2問目はそれに10の-9乗掛けたものです
そもそもクロックとかまだ習っていませんでしたし‥
皆さん難しく考えすぎだったのでは‥
0034デフォルトの名無しさん2006/10/23(月) 14:44:06
2^29=5億何ちゃらだから>>16で合ってたじゃん。
それに10^-9をかけるということは1GHz動作だったんだな。
問題に1GHzって書いてなかったん?
0035デフォルトの名無しさん2006/10/23(月) 14:44:38
あ、>>15だった。
0036デフォルトの名無しさん2006/10/23(月) 14:44:59
2^29=536870912だろ。何がヤバイんだ?
0037デフォルトの名無しさん2006/10/23(月) 14:54:17
答えを教えてもらっても駄目な奴っているんだな
0038デフォルトの名無しさん2006/10/23(月) 14:55:06
クロック習ってないのにどれくらいの時間がかかるか、なんて問題出るの?
0039デフォルトの名無しさん2006/10/23(月) 15:18:03
0.5秒で1GB処理するのか
0040デフォルトの名無しさん2006/10/23(月) 16:34:35
>>34
書いてないです
>>36
間違えた答えで提出してしまったことです
>>38
出ましたね‥
クロックは教科書のその20ページ後ぐらいに初めてでてくるようです
0041デフォルトの名無しさん2006/10/23(月) 16:42:54
全ての命令が一秒待つとかだったら17年かかるな。
0042デフォルトの名無しさん2006/10/23(月) 17:05:00
>答えも教えてもらいましたが全然違いました‥このスレの人のも
だから>>15で合ってるじゃん。何が違うの?
もしかして2^29=5億何ちゃらって理解してなかった?
0043デフォルトの名無しさん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
0044デフォルトの名無しさん2006/10/23(月) 20:22:22
>>43
MOV D, -5
0045デフォルトの名無しさん2006/10/23(月) 23:45:43
なんでクピュ名かかないやつ多いんだ
0046デフォルトの名無しさん2006/10/23(月) 23:52:53
わからない人のために補足しておくと、
クピュとはCPUのことです。
0047デフォルトの名無しさん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
ワードしかだめなんだっけ?
0048デフォルトの名無しさん2006/10/25(水) 02:42:36
お願いします。
8085CPUで

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

という問題なんですが、さっぱりわかりません。プログラムのキーポイントと一緒に解説をおねがいします。
0049デフォルトの名無しさん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
0050デフォルトの名無しさん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 ;プログラム停止
0051デフォルトの名無しさん2006/10/25(水) 15:24:03
>>50
詳しい解説付きでどうもアリガトウ御座います。
0052472006/10/25(水) 21:52:00
>>49
DOSCALL.MACってなつかすぃものを見たーーーーーーw
0053デフォルトの名無しさん2006/10/25(水) 21:58:51
ところで学生って、デバッガ使わせてもらえないの?
オレは自力で覚えたから知らんが、全部、紙とか黒板で理論のみ習うわけ?
んなわけないと思うけど
デバッガで遊んでレジスタの変化とか見てれば、各命令の動作なんてすぐ覚えられると思うんだけど。。。
0054デフォルトの名無しさん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);
}
0055デフォルトの名無しさん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);
}
0056542006/10/26(木) 11:07:08
>>55
ご回答ありがとうございました。
gccってそんな機能があったんですねorz
使えると思いますので、学校に行ったら試してみたいと思います。
0057デフォルトの名無しさん2006/10/26(木) 11:18:53
>gccってそんな機能があったんですね

というか、C言語をアセンブリ言語に落とすのがCコンパイラの仕事だが。
0058552006/10/26(木) 11:34:48
>>56
ガンガレ
0059デフォルトの名無しさん2006/10/27(金) 00:05:13
質問しようと思ったら、全く同じ問題があってワラタ
0060デフォルトの名無しさん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[]= があるかないか?)があるのですが、
これらはどういった違いがあるのでしょうか?
0061デフォルトの名無しさん2006/10/30(月) 23:22:20
宿題です、分かる方お願いします。

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

ってことだと思う、 VerilogHDLは経験が無いけどきっとそう。
0068デフォルトの名無しさん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

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

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

の競争にしか見えません俺には。
0071デフォルトの名無しさん2006/10/31(火) 00:42:26
はい次の方、質問をどうぞ。
CPUと環境を明記してね。
0072682006/10/31(火) 00:55:51
>>69
正解。だが、お前の発言は面白くもなんともねぇ。
何故なら、お前には聞いてないからだ!ボケ
0073692006/10/31(火) 02:04:57
>>72
だから質問にある「意味」には答えてないだろ、
よくよめカス!
0074デフォルトの名無しさん2006/10/31(火) 12:10:50
>>73
意味についてでなく
CPUが解らなければ
答えられないということを解らせなければいけなかった。
ということではないかな?
そういう流れだと思うが。
0075デフォルトの名無しさん2006/10/31(火) 14:38:07
ソースだしたらCPU解かっちゃうからなぁ
0076デフォルトの名無しさん2006/10/31(火) 16:42:28
>>62を見た時点でCPUでも書いてりゃよかったのに
開き直っちまうからこんなことになる
0077デフォルトの名無しさん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
0078デフォルトの名無しさん2006/10/31(火) 19:28:01
ググッたら、教育用のCPUか>MINIPS
分岐命令の後ろに、nop入れろ
0079デフォルトの名無しさん2006/11/01(水) 01:02:32
ここでFPGAにMINIPSコアを乗せている>>60が登場!
0080デフォルトの名無しさん2006/11/01(水) 02:55:09
>>79
そんなやつおらんやろー。
そもそも、架空のCPUコア乗せてるのが信じられない。
ARMや8051とかならまだしも。
0081デフォルトの名無しさん2006/11/01(水) 04:27:47
COMET も架空かな
0082デフォルトの名無しさん2006/11/01(水) 10:35:08
「オレほどCPU持ってるやつはいない。100個持ってる。」
0083デフォルトの名無しさん2006/11/01(水) 18:28:18
教育用の架空のコアだから、FPGAに乗せるのも学習の一環だと思うな。
ソフトウエアでのエミュレータなら普通にアリだろ?
0084デフォルトの名無しさん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/までやりました。
0085デフォルトの名無しさん2006/11/01(水) 22:50:58
疲れるし、つまんないから仕事じゃなきゃやらなーい。
出来たから何って感じだし。

スレ違いだし。
0086852006/11/01(水) 22:56:14
あ、すまん。>>84じゃないよ。
FPGAやらの話してるやつへのレスね。
0087デフォルトの名無しさん2006/11/01(水) 23:21:52
>出来たから何って感じだし。
0088デフォルトの名無しさん2006/11/02(木) 02:18:04
>>84
CPU名を明記するように。
0089デフォルトの名無しさん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
0090デフォルトの名無しさん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
0091デフォルトの名無しさん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
0092デフォルトの名無しさん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
0093デフォルトの名無しさん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
0094デフォルトの名無しさん2006/11/02(木) 15:01:17
久しぶりに宿題板みたいになってきたな♪(゚д゚)ウマー
0095デフォルトの名無しさん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のインストールが上手く行っていないのか、
それとも単純にコマンドを間違えているのか、何か根本的に間違えているのか…
全く手詰まりになってしまったので何か助言をいただけないでしょうか…。
0096デフォルトの名無しさん2006/11/03(金) 00:16:06
>>95
ttp://sohda.net/cygwin/treebbs/treebbs.cgi?kako=1&all=44&s=44#44
0097デフォルトの名無しさん2006/11/03(金) 01:27:26
ありがとう。
ということはインストールが上手く行っていないのか…。
確かにインストールの途中で固まって以後すすまなくなってた。
アンインストールインストール…と繰り返すうちに訳が分からないことになってる…。
0098952006/11/03(金) 03:32:32
ダメだ…何度やってもインストールの途中で固まってしまう。
w32apiパッケージのlibuser32.aというのを入れれば動くという事は分かっても入れ方が分からない…。
他の質問者の人はインストールし直すと正常に動くようになったとあるけれど
自分の場合はインストールし直そうとするとほぼ確実に途中で固まってうまくいかない。
どうすればいいんだ…。
0099デフォルトの名無しさん2006/11/03(金) 03:58:45
>98
どこでどう止まるの?
ファイルのダウンロード中?コピー中?
何のファイルでとまる?
0100952006/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にいれればいいのか…。
0101デフォルトの名無しさん2006/11/03(金) 10:24:01
>100
それは普通「正常に終了」とは言わないケド…
…でも何で止まるんだろ。
ごめん。訊ねたけど判らないっす。
0102デフォルトの名無しさん2006/11/03(金) 10:25:04
普通にCygwinのサイトからダウンロードしてきたら?
遣り方についてはスレ違いにつき割愛。
0103952006/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
0104デフォルトの名無しさん2006/11/03(金) 17:46:33
printf() と main() ガ見つからない、ってさ
0105デフォルトの名無しさん2006/11/03(金) 18:03:54
要するにやっぱライブラリがみつかんねぇってこった。
0106デフォルトの名無しさん2006/11/04(土) 02:02:32
解決案その1
gccを介さず、素直にasとldを自分で呼び出して使う。

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

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

昔に比べりゃ、googleなんて便利なものがあって
なんで探し出せないか不思議だわ。
やる気ないとしか思えん。
0115デフォルトの名無しさん2006/11/06(月) 00:26:04
教えてgoo!で、ググって出た答えを書いてあげると感謝されるもんね!
0116デフォルトの名無しさん2006/11/06(月) 11:43:24
>メモリ空間に周辺機器のI/Oをマッピング
>I/O専用のアドレスを持ってるのでそこに配置
これ、理解してて書いてるならタダモノではない気配。
0117デフォルトの名無しさん2006/11/06(月) 13:01:15
メモリマップドI/Oとか、I/OマップドI/Oとか言ったかな。
昔8bit機いじってたヤツなら結構知ってるんじゃね?
0118デフォルトの名無しさん2006/11/06(月) 14:57:02
どっちもメモリマップドの話にしか見えない。
0119デフォルトの名無しさん2006/11/06(月) 19:07:07
>>116
いや、君が何を言いたいのかそれだけじゃよくわからんが、
たぶん君が無知なだけだと思うよ。
0120デフォルトの名無しさん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).
だそうです、どなたかお願いできないでしょうか?
0121デフォルトの名無しさん2006/11/06(月) 21:28:46
だからね、LC3が何者か提示しないと話が進まないと思うのだが。
0122デフォルトの名無しさん2006/11/06(月) 21:46:12
>>114
日本語大丈夫か?

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

>>111(俺じゃないが)は>>110に対するレスだよ。
その辺踏まえてるのかな。
0127デフォルトの名無しさん2006/11/07(火) 01:27:36
>>111が答になってない件について
0128デフォルトの名無しさん2006/11/07(火) 01:33:46
質問者が納得してるんだからいいんじゃねーの?
0129デフォルトの名無しさん2006/11/07(火) 03:13:34
【ちょっといいですか?】
不勉強な人が不勉強な人にでまかせを教えるのはやめましょうw
最悪ですw
本当にどうもありがとうございました。
0130デフォルトの名無しさん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進数で書かないとダメかね?
0131デフォルトの名無しさん2006/11/09(木) 00:43:33
初めまして、最近アセンブラを始めました。
現在、アセンブラでの計算に悩んでいます。
今回出た課題はw=x+5*y*z+4と言う式があり、
キーボードからインプットされた数字をx、y、zにいれてwを出したいんです。

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

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

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

と思ったが、
Nbitの整数同士を掛け算した結果の下位Nbitは、符号付きかどうかに関係ない
のだった。mul使っても普通は大丈夫だね。
0133デフォルトの名無しさん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
0134デフォルトの名無しさん2006/11/09(木) 11:21:08
>>133
掛け算もないCPUなの? Z80かなんかの8ビットCPUとか?
だとしても、その程度の話ならCで足し算で掛け算を実装してみればいいじゃん。
掛け算の両辺の大小見たりシフトで代用できないか検討したりするだけ。
#8ビットCPU用のCコンパイラのアセンブル出力覗いてみてもいいね。
01351332006/11/09(木) 17:18:45
>>134
CPUはFPGAというのでしょうか?作ったら使えるのかもしれませんが残念ながら掛け算はありません。
大小を見るというのは繰り返し回数に持ってくる方の変数は小さい方がいいからということでしょうか?
シフトについても、シフトを使うことでサイクル数が少なくて済む処理があるということを
聞いたことがある程度なのですが、どういったアルゴリズムなのでしょうか?
3000*300を300000*3にするようなイメージでしょうか?
質問ばっかりになってしまって申し訳ないですorz
0136デフォルトの名無しさん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によって素直にかけ算した方が速いことがあるから注意。
0137デフォルトの名無しさん2006/11/09(木) 17:58:56
136の後半は>>134じゃなくて>>135へのレス
01381342006/11/09(木) 18:38:35
>>135
FPGAか、納得。それじゃこったことは何もできないと思った方がいいねぇ。
#つーか、それこそノウハウの塊だから先人に教えを乞う方がよくね?
0139デフォルトの名無しさん2006/11/10(金) 00:22:44
スレ違いかもしれませんが・・・
CPUに関して勉強中なんですが、2バイトや4バイトでメモリに1回でアクセスするのに
番地は2や4の倍数である必要があるらしいんですが、なんでですか?
奇数アドレスの2バイトアクセスは、どの辺が困るのかわかりません。
CPUはARMです。
0140デフォルトの名無しさん2006/11/10(金) 00:49:59
>>139
こういう風に16byteのメモリがあったとする。
00──┐
04──└─→CPU(アドレス00から4byte読む)
08──
12──

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

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

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

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

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

IA-32 on NASM です

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

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

任意アドレス指定でアドレスされても常にバス幅のデータを正しく吐き出すような
回路が複雑になることってなんとなく想像できるでしょ。
0151デフォルトの名無しさん2006/11/11(土) 14:46:38
>>148
ttp://ja.wikipedia.org/wiki/%E5%91%BC%E5%87%BA%E8%A6%8F%E7%B4%84
ttp://www.hpcs.is.tsukuba.ac.jp/~msato/lecture-note/kikaigo2003/lecture6.pdf
0152デフォルトの名無しさん2006/11/11(土) 14:56:38
>>151
thx!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
01531392006/11/11(土) 15:10:34
>>146
>バス幅128ビットにしました、けど互換性確保したいから
>4バイト境界です、って可能性もある。
メモリのバス幅が128ビットで、CPU−メモリ間のデータバス幅が32ビットという場合ですね?
データバス幅を32ビットにすると、メモリアクセスは、4の倍数のアドレスから4バイトだけ、
という方法しか許さなくなるわけですか。

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

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

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

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

データバス8本ごとにアドレスデコーダ付けるような冗長な回路が一つの方法だが、
そういう冗長な回路が必要になるだろ
0169デフォルトの名無しさん2006/11/12(日) 10:42:23
>>167
設計・製造コストと機能のトレードオフは、工業製品としてはあたりまえ。
0170デフォルトの名無しさん2006/11/12(日) 21:16:18
宿題クル?
0171デフォルトの名無しさん2006/11/13(月) 01:52:20
m|||-_|||m<キットクル〜
0172デフォルトの名無しさん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
0173デフォルトの名無しさん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/
0174デフォルトの名無しさん2006/11/13(月) 16:10:16
>>173
失礼しました。誘導ありがとうございます。
0175デフォルトの名無しさん2006/11/15(水) 22:35:17
定数(75と37)を確保しその輪をGR1その差をGR2に算出せよって問題わかりますか?
0176デフォルトの名無しさん2006/11/15(水) 23:17:15
75と37の輪?
0177デフォルトの名無しさん2006/11/15(水) 23:20:05
和の間違いでした
0178デフォルトの名無しさん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
脳内アセンブラだから汎用性ないけどね。
0179デフォルトの名無しさん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
01801752006/11/16(木) 00:02:06
ありがとうございます!
0181デフォルトの名無しさん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
これだけでこのプログラムが何をやってるかわかりますか?
0182デフォルトの名無しさん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
0183デフォルトの名無しさん2006/11/18(土) 02:40:27
>>182
�dです、すみません
自己解決しました
0184デフォルトの名無しさん2006/11/18(土) 17:14:07
問題:キーボードから整数5個を入力して1次元整数配列aにセットし、次にサブルーチンrecuv_add_arrayで配列aの全要素を加算し、結果コーラー側で出力せよ。ただし、サブルーチンは再起型 パラメータは『先頭要素a[m]のアドレス』と『加算すべき要素数』とする。
お願いします。

授業ではttp://www.k.hosei.ac.jp/~i05r4102/までやりました。
8
0185デフォルトの名無しさん2006/11/18(土) 17:33:21
何が分からないのか分からない。
0186デフォルトの名無しさん2006/11/18(土) 19:54:00
Microsoft Macro Assembler 8.0 (MASM) パッケージ (x86 用)
http://www.microsoft.com/downloads/details.aspx?FamilyID=7A1C9DA0-0510-44A2-B042-7EF370530C64&displaylang=ja
0187デフォルトの名無しさん2006/11/21(火) 21:31:00
ハンドアセンブルっておもしろいな。ちゃんとプログラムが動いたときの
快感度は他の言語の比にならないぜ。
0188デフォルトの名無しさん2006/11/22(水) 00:41:49
んじゃ、一生やってれば?
でもそれ、ちゃんと動いていると思ってるの自分だけかもよ。
0189デフォルトの名無しさん2006/11/22(水) 00:49:13
ご一緒にポテトはいかがですか?
0190デフォルトの名無しさん2006/11/22(水) 11:11:59
>186
げー、VC2005必須かよ…
0191デフォルトの名無しさん2006/11/23(木) 11:24:17
Express Editionて、Freeで配ってる(配ってた?)だろ?
0192デフォルトの名無しさん2006/11/23(木) 12:35:20
でもアセンブラの為にVC++入れるのアホらしくね?
0193デフォルトの名無しさん2006/11/23(木) 14:47:37
手動で解凍したらFL_ml.exeが出てきたが、
これって使えるん?
0194デフォルトの名無しさん2006/11/24(金) 00:43:01
.pos0x100
irmovl$15,%ebx
rrmovl%ebx,%ecx
loop:
rmmovl%ecx,-3(%ebx)
addl%ebx,%ecx
jmploop

このアセンブリプログラムをアセンブルすると、どんなバイト列が出てくるか。
y86シミュレータ
0195デフォルトの名無しさん2006/11/24(金) 01:11:53
質問はなんですか?
0196デフォルトの名無しさん2006/11/24(金) 01:45:20
なんかもうアセンブラがどうこう以前に日本語でおk、な質問が多いな
0197デフォルトの名無しさん2006/11/24(金) 02:00:36
>>193
ml.exe にリネームすれば普通に使える。
ただしそれだけじゃリンカもライブラリもないから
本当に「アセンブル出来るだけ」になるがな。
0198デフォルトの名無しさん2006/11/25(土) 15:06:41
>>197
�d。後で遊んでみる。
0199デフォルトの名無しさん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文を作りたいです。

助けて頂けるとありがたいです。
0200デフォルトの名無しさん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系とその派生系の石しか扱わないから間違ってるかもだけど。
02011992006/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の使い方が分かりません。

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

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

と言う宿題を出されました。どなたか教えてください!
かなり初歩的なのかもしれませんが;
0205デフォルトの名無しさん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
0206デフォルトの名無しさん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
0207デフォルトの名無しさん2006/12/07(木) 00:44:02
質問はなんですか?
0208デフォルトの名無しさん2006/12/07(木) 10:40:36
今CASLの授業をやっているんですがメインルーチン?が自力で作れません。よかったら電卓のプログラムなんですが作っていただけますか!?
画面から3桁以内(符号なしビット)の2つの数字と、1つの演算子を入力して四則演算を行い、結果を画面に表示するプログラムです。
演算子は+, -, *, /を使います。

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

正しいときにジャンプする
正しくなければ通過とかの部分です。
わかりにくくてすいません。
0211C++プログラマ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文で条件分岐させて代入した方がいいのでしょうか?
0212それ以前にスレ違いなんだけどね2006/12/07(木) 21:58:55
>>211
小手先の愚作を労せず、最適化はコンパイラに任せなさい。
上の条件なら例えばif (x > 0) {...; } else {...;}とすれば適当なコードを出してくれるだろうし、
下の処理ならturn *= -1と書かずにturn = -turnすればよかろう。
尤も、その程度の内容だとどのように書いたところで処理速度が問題になるとも思えないが。
#もし本当に処理速度が問題になるのなら、プロファイリングとアセンブラ出力を読む作業は必須だ。
02132112006/12/07(木) 22:05:41
ありがとうございます、最適化はコンパイラに任せます
アセンブラのコードは読めないので、これから勉強してみます
スレ違いすいませんm(_ _)m
0214デフォルトの名無しさん2006/12/07(木) 23:04:15
ビットフィールド使って、最初から白=0、黒=1を得られるようにしとけばいいんじゃない?
MSXとかCPUが極度に貧弱なマシンでもないかぎり、気にするような事じゃ無いとは思うけど。
02152112006/12/08(金) 00:13:37
ビットフィールドははじめて知りました
書き換えてみます
ありがとうございます
0216デフォルトの名無しさん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
0217デフォルトの名無しさん2006/12/08(金) 18:27:51
どの部分?
0218デフォルトの名無しさん2006/12/08(金) 18:39:19
>>216
質問は日本語で頼むよ。
マジメな話、あんた自分が書いたその文章、自分以外の他人が読んで意味がわかると思うか?

エスパーを期待しても無駄だよ。
ここはムーの投書欄じゃねえからな。
0219たくや ◆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分足されてる気がするんだけど・・・
もしかして勘違い?
0220デフォルトの名無しさん2006/12/08(金) 19:01:00
何がわからんのかわからんが、ひょっとして開始アドレスが0000:0000だと思ってるのか?
0221デフォルトの名無しさん2006/12/08(金) 19:05:34
なんで0600h分足されてるのかがわからないです
0222デフォルトの名無しさん2006/12/08(金) 19:08:24
だからお前の日本語の方がわからんてw
0223デフォルトの名無しさん2006/12/08(金) 19:15:41
>>221
どういう処理を行ってる(と思う)のか、ソースを順に説明してみてくれないか?
とりあえず、おまえさんがどこで思い違いをしているのか理解できんとエスパーでも無い限り誰も回答できんと思うよ
0224デフォルトの名無しさん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に入れる
0225デフォルトの名無しさん2006/12/08(金) 19:36:20
ds:siの1バイト分の内容をalに入れる に戻る
0226デフォルトの名無しさん2006/12/08(金) 19:41:53
訂正

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

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

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

processとかの位置も変わるんですよね?
でも、jmp processじゃあprocessには飛べないんですか?
0232デフォルトの名無しさん2006/12/08(金) 21:14:23
0060h:mesもなんで0060hが必要なのかわからないです
0233デフォルトの名無しさん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の位置とかがずれてくる。
0234デフォルトの名無しさん2006/12/08(金) 21:53:54
ttp://www5c.biglobe.ne.jp/~ecb/assembler/assembler00.html
↑でソースを見ながらニーモニックの意味を調べてちょっと勉強してたんですけど
jmpのセグメントってCSなんですかぁ
ラベルの位置もよくわかっていませんでした
CSの動きについてもあまりよくわかってないんでちょっと勉強してきます・・・
ありがとうございました
0235デフォルトの名無しさん2006/12/08(金) 22:41:23
もしかして86系の石ってリロケータブルなコード書けない?
・・・んなわけないよなぁ。
0236デフォルトの名無しさん2006/12/10(日) 00:26:17
>>235
完全にとは云わないが、書ける筈だけど。
セグメント・レジスタも有ることだし。

jump命令は、普通セグメント内ジャンプしか
使わないだろ。
0237デフォルトの名無しさん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;
}
0238デフォルトの名無しさん2006/12/13(水) 22:18:47
>>237
C言語つーのはgccのってことでいいんかい?
02392372006/12/13(水) 22:27:30
>>238
はいそうです
02402372006/12/13(水) 22:49:56
連投すんません。
gccでもVCでもWindows上で動作するんであればおkです。
0241デフォルトの名無しさん2006/12/14(木) 21:13:48
超低レベルな質問です
同じ内容の数値計算をさせた場合Fortranとアセンブラじゃどちらが速いですか?
02422412006/12/14(木) 21:15:02
アセンブラじゃなくてアセンブルですね・・・
0243デフォルトの名無しさん2006/12/14(木) 21:19:56
アセンブリ:アセンブル:アセンブラ
=プログラミング言語:コンパイル:コンパイラ
0244デフォルトの名無しさん2006/12/14(木) 21:28:47
>>241
本質的にはアセンブラが負けることはないが、
実際にはそうもいかないのが難しいところ。
結局はコードを書く人の能力による。
0245デフォルトの名無しさん2006/12/14(木) 21:36:14
つーかアセンブラで数値計算なんてやりたくねーな
0246デフォルトの名無しさん2006/12/14(木) 21:39:36
アセンブラの宿題質問スレ
コンパイラの宿題質問スレ
0247デフォルトの名無しさん2006/12/14(木) 21:42:13
このスレ見直したらやっぱ誤用が多いね。
0248デフォルトの名無しさん2006/12/14(木) 21:44:40
言っとくが、スレタイのアセンブラは
アセンブリ言語のことだからな。
0249デフォルトの名無しさん2006/12/15(金) 00:14:46
事務計算だとアセンブリ言語使った方がマシだったりすることもあるよな。
石によるけどさ。
0250デフォルトの名無しさん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;
0251デフォルトの名無しさん2006/12/15(金) 19:59:32
わからないってどういう事?
ヒントの所に回答そのものが日本語で書いてあるのに。
0252CASL2006/12/15(金) 22:18:59
http://e-learning.inf.ie.kanagawa-u.ac.jp/e-learning/eCASL/index.html
を完成してほしいのは私だけ?
0253デフォルトの名無しさん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;
}
02542372006/12/16(土) 14:10:03
>>253
レスありがとうございます。
まさにコレのようです。

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

数日間探しても見つからなかったのでとても助かりました。
ありがとうございます。
02552502006/12/18(月) 23:55:11
>>251
それをプログラムでどう書けばいいのか分からないんです・・・
0256デフォルトの名無しさん2006/12/19(火) 22:23:32
MASM32を入れて、アセンブラの勉強もしてみようとおもったのですが
良い入門書は無いですか?
高級言語プログラマのためのアセンブラ入門と
http://www5c.biglobe.ne.jp/~ecb/assembler/assembler00.htmlのページを
見ながら勉強しようと思ったのですが、高級言語プログラマのためのアセンブラ入門は
なんか辞典みたいな感じで、アセンブラのページを読むと
なんとなくわかるにはわかるけど、なんでセグメント全部同じ名前にしてんだろ
とか、21hみたいな命令の意味とか、よくわからないのがやっぱ多いです。
で、やっぱり入門書を買おうと思うのですが、お勧めを教えてください。
CPUはIntel(R)Celeron(R)Mです。
0257デフォルトの名無しさん2006/12/20(水) 00:38:54
>>256
>なんでセグメント全部同じ名前にしてんだろ
EXEファイルでは無くて、COMファイル作る為?
>21hみたいな命令
「int 21h」これは、MS-DOSのシステム・コールを
呼出す為だと思う。
0258デフォルトの名無しさん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までいくと終了してしまうんですがどうすればいいでしょうか?
金種計算みたなのを作りたいんです
0259デフォルトの名無しさん2006/12/21(木) 00:39:00
>>258
 「JPL LOOP」の「JPL」が悪いみたいだけど。
 JPLって、Jump largeの意味?
 「JPLE LOOP」とすべきでは。
 JPLEは、Jump large or equal。
02602582006/12/21(木) 01:04:18
JPLEって言う命令は無いみたいなんですが…
エラーが出てきます
0261デフォルトの名無しさん2006/12/22(金) 00:19:46
>>258
ゴメン、一応考え方として書いただけで、
CASLはやった事がない。
無い場合は、その命令と等価となるような
処理に作り換えるとか。
0262デフォルトの名無しさん2006/12/31(日) 23:33:16
宿題でなくてすみませんが、質問です。

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

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

0265デフォルトの名無しさん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
0266デフォルトの名無しさん2007/01/02(火) 21:25:20
>>265
Sparc 知らんから間違いの指摘はできないけど、
デバッガでステップ実行してみればいいんじゃないか?
0267デフォルトの名無しさん2007/01/02(火) 22:48:06
>>265
.umulが%o0 * %o1の結果を、%o0 %o1のどちらかに代入してると思うのだが、
もう一方も何かしらの値が代入されているということはないかい?

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

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

なんか__startに異常があるみたいなメッセージが出てくるのですがそれがよくわかりません。
loadすら出来ないです。
0274デフォルトの名無しさん2007/01/04(木) 03:48:38
じゃあそのメッセージをここに貼るとかそういうことを思いつきませんか
0275デフォルトの名無しさん2007/01/04(木) 05:19:40
標準のトラップハンドラを読み込んでるからだな。
トラップハンドラを読み込まないか、
__startではなくmainにすれば良いと思うよ。
02762692007/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)
02772692007/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
02782692007/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:
0279デフォルトの名無しさん2007/01/05(金) 03:39:05
これだろ

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

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

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

その上のaddの行実行前に$t8に00000000、$gpに10008000が入ってる状態です。
addにより$a2にはその和の10008000が入るというのは理解できるのですが、
その後のlwの行の操作で
$t4に00000063が代入されるのが何故か分かりません。
0286デフォルトの名無しさん2007/01/08(月) 02:35:27
$t4に00000063が代入されたとき、10008000はいくつになってる?
0287ふぃb2007/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
.....................
0288デフォルトの名無しさん2007/01/11(木) 21:19:27
CPUが分からないって?
???
0289デフォルトの名無しさん2007/01/11(木) 22:00:41
>287
PCの機種名でもアセンブラの名前でも良いから書いてみそ
0290デフォルトの名無しさん2007/01/12(金) 00:11:27
マック使いってみんなこんなレベルなんだろうか。
自分が使ってるマシンのMPUもわからないなんて・・・。
0291デフォルトの名無しさん2007/01/12(金) 00:27:58
機種名モデル名購入日OS名その他知らない香具師もかなりいる
0292デフォルトの名無しさん2007/01/12(金) 10:21:56
MacOSでのスタックフレーム処理を理解する or 再帰を諦めてループを使って実装する
どっちか好きな方を選んでくれ。
0293ふぃb2007/01/12(金) 13:45:18
>298
すみません。アセンブラはgccです。

>292
スタックフレーム勉強します><
0294デフォルトの名無しさん2007/01/12(金) 18:10:41
つーか自分の機種すら分からないのは開発やる人間として大問題
0295デフォルトの名無しさん2007/01/12(金) 18:24:56
PowerPCか何かかな?
0296デフォルトの名無しさん2007/01/12(金) 18:29:29
NASM
0297ふぃb2007/01/15(月) 13:08:49
自己解決しました。
すいません
0298デフォルトの名無しさん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
0299続き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) を埋めよ。


初心者です。よろしくおながいします。
0300デフォルトの名無しさん2007/01/18(木) 17:52:20
>>298
初心者でも何でもいいけど、処理系(CPU,アセンブラ)くらい書かないとエスパーしか答えられないよ。
0301デフォルトの名無しさん2007/01/18(木) 21:06:16
これは多分CASLだな。
問16は問題文が欠けてないか?
せめて何を目的にしたプログラムかは書くべきだと思うんだが。
0302デフォルトの名無しさん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
0303ゆー2007/01/21(日) 18:21:22
ARMアセンブラについて質問です。

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

CMN r0,r1

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

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

MOVはシフト代わりに使えるから、その用途で使ったとき一緒に
ステータスレジスタを更新して欲しい場合がある。そのときMOVSを使う。
0312デフォルトの名無しさん2007/02/12(月) 16:42:41
アセンブラの条件分岐命令で
BLEとBGTの意味がわかりません。
どういう意味でしょうか?
0313デフォルトの名無しさん2007/02/12(月) 16:57:12
>>312
ニモニックセット依存。
恐らくは、前者はbranch if (register) less than or equal to (operand)の意で
後者はbranch if (regster) greater than (operand)の意だろう。
0314デフォルトの名無しさん2007/02/12(月) 17:12:27
ありがとさん
0315デフォルトの名無しさん2007/02/15(木) 15:09:01
SEP-3についての質問です。
C言語のprintf()は、printf("10\n")ともprintf("%d\n#",10)とも書くことが
できる。つまり、引数の数はいくつあってもよい。このようなサブルーチン
を実現するには、サブルーチンprintfをどのように記述し、どのようにして
呼び出せばよいだろうかっていう問題です。
よくわかりません。
0316デフォルトの名無しさん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);
0317デフォルトの名無しさん2007/02/15(木) 15:51:24
315追記です
アセンブラ言語でどのように書けばよいかっていう問題です。
0318デフォルトの名無しさん2007/02/15(木) 16:11:42
スタックに積まれている情報を変換子(%何とか)に対応させてアクセスするんでしょ。
vsprintf(wk,format,int1,int2,int3) なら、後ろからpush5回、call だから、スタックポインタの
すぐ後は復帰アドレス、その次からwkのポインタ、formatのポインタ。format解析の中で
%何とかに出会うたびにSP+2ワード+nワードをアクセスすればいい。
0319デフォルトの名無しさん2007/02/15(木) 16:49:57
#もう〜
#つまんなすぎっ!
0320デフォルトの名無しさん2007/02/19(月) 11:40:14
お願いします。

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

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

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

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

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

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

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

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

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

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

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

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

っていうか、法的拘束力のない契約にそもそも何の意味があるんだよw
0363デフォルトの名無しさん2007/02/28(水) 00:38:19
>>362
契約は、必ずしも法律行為ではないよ。
0364デフォルトの名無しさん2007/02/28(水) 04:19:47
エンジニアが逆アセンブルするのは必然だが
素人が趣味で解析したがるのは迷惑。
自分のマニアっぷりを自慢するために解析結果を公開したりするし。
0365デフォルトの名無しさん2007/02/28(水) 04:23:00
>>358
心配ならメーカに問い合わせたら?
つーか、アセンブラの勉強のためなら逆アセンブルするのは無意味だよ。
前から何人も書いているけどコード部とデータ部の区別やら環境やらが判らんと意味を為さないし。
そんなことよりも、アセンブラの勉強のためなら素直にアセンブラで書かれたソースを読めばいいじゃない。
0366デフォルトの名無しさん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
0367デフォルトの名無しさん2007/02/28(水) 15:07:48
>>366
ありがとうございます!

とても助かりましたー
0368デフォルトの名無しさん2007/03/02(金) 19:32:51
68hc11のコード表 激希望
アップロードお願い
0369デフォルトの名無しさん2007/03/02(金) 20:04:42
検索しろよ
0370デフォルトの名無しさん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

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

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

って、元辿って読んだらリバースエンジニアリング目的かよ。
0376デフォルトの名無しさん2007/03/05(月) 10:56:37
最終的には、俺たちにチューンしてくれと泣きついてな
0377デフォルトの名無しさん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
0378デフォルトの名無しさん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
0379デフォルトの名無しさん2007/03/07(水) 06:06:59
素直にCをB回足せばいいのに
0380デフォルトの名無しさん2007/03/07(水) 06:17:37
↑馬鹿
0381デフォルトの名無しさん2007/03/07(水) 11:38:13
先生からもらった関数が動かないんですが・・・
0382デフォルトの名無しさん2007/03/07(水) 11:49:44
>>381
で、宿題は?
0383デフォルトの名無しさん2007/03/07(水) 16:41:43
>>380 だって6×8ならそのほうがクロック少ないじゃん(w
0384デフォルトの名無しさん2007/03/07(水) 22:12:52
訂正されたのを実行しましたがやっぱり答えがあいません。
ちなみに答えは12+24+48=84になってしまいます。
24を足しているのがおかしいのです。
3周目のAND 01Hで0010Hと0001HをANDした結果Zフラグが立って
スキップにいけば問題解決なんですが、スキップに飛びません。
Aレジスタの中身を見てみるとちゃんと0000HなのですがZフラグが
立ちません。今みてみるとHフラグは立っていました。
なぜZフラグが立たないのでしょうか
0385デフォルトの名無しさん2007/03/07(水) 22:46:27
そりゃぁあんた、ZフラグはANDなんかじゃ勃たないだろよ。
0386デフォルトの名無しさん2007/03/07(水) 23:28:04
>>384
CPU壊れてるんじゃね?
0387デフォルトの名無しさん2007/03/07(水) 23:28:19
そもそも何のニーモニックなのか最初にはっきり言えよw
Z80?

>>385
A=0で立たないフラグはもはやゼロフラグじゃないだろw
0388デフォルトの名無しさん2007/03/08(木) 04:19:40
ANDなんかじゃダメなんだ。もっと奮い立つようなものじゃないとw
0389デフォルトの名無しさん2007/03/08(木) 05:23:49
>>384
アセンブルしたコードを貼って味噌。HEX出力でもバイナリダンプでもいいから。
#つーか、なんでjr使わないでjp使っているんだろ。
0390デフォルトの名無しさん2007/03/08(木) 07:25:45
8085じゃないの?
0391デフォルトの名無しさん2007/03/08(木) 07:34:53
Zilogニモニックで8080/8085はないだろうよ。
#8080は互換性あるけど、8085は(8085で追加されたインストラクションが)互換性ないし。
03923902007/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
03933902007/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 
こういう展開を期待してるわけですよね?
0394デフォルトの名無しさん2007/03/08(木) 08:39:56
元質以外が貼って何の意味があるんだよ。
0395デフォルトの名無しさん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
0396デフォルトの名無しさん2007/03/09(金) 22:18:38
みなさんありがとうございます!!
やりたいことは>>393 さんの通りです。
正直どう修正すればいいのか分からずじまいでした。
手直しまでしてもらいましてありがとうございます!
今から参考にして直してみます
0397デフォルトの名無しさん2007/03/10(土) 06:45:46
判ったら結果書いてね♪
0398デフォルトの名無しさん2007/03/11(日) 15:19:35
リテラルについての質問なんですが、
たとえば、論理加算で、

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

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

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

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

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

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

一般的な言い回しとは思わないけど。
0420デフォルトの名無しさん2007/03/17(土) 22:18:58
そんなことないでしょ。分かるのは恐らくエスパだけ。もちろんこれ逆説的表現ね。
左srcとか左destなら話も分かるが、左レジスタって一体何だよw
0421デフォルトの名無しさん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゙、   ̄   ./  , |::!
      / ヘ ヾ ヽ、 _,. '   / |:
0422デフォルトの名無しさん2007/03/18(日) 07:01:49
左・・・レジスタ・・・?
たぶんCASLだろうけど、あれは気持ち悪い。
左src右destが一番美しい。
0423デフォルトの名無しさん2007/03/18(日) 14:05:44
>>418=>>420=>422
思考の柔軟性がなさそうだから、アセンブラなんて変態的なものは
あきらめることをお勧めする。
0424デフォルトの名無しさん2007/03/18(日) 14:39:45
いや僭越ながら「思考の柔軟性」とやらは持ってるつもり。
持ってないのはESP能力ねw
0425デフォルトの名無しさん2007/03/18(日) 21:49:16
× 持ってないのはESP能力ね
○ 持ってないのは常識 + 話の流れを読む力

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

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

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


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

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

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

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

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

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

の意味がわかりません。

EAXからCを引く???

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

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

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

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

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

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

乗算自体は難しいことはないんだが。
0468デフォルトの名無しさん2007/04/17(火) 01:23:22
つーか8085てシフト命令ないのかよ...
0469デフォルトの名無しさん2007/04/17(火) 01:29:16
習い始めの宿題なら足し算+ループでいいじゃん。
04704642007/04/17(火) 01:30:54
お手数おかけします...。
このような例で大丈夫でしょうか。。。

「1から10まで加算して結果を8085H番地のメモリに記憶する。」

.8085
ASEG
ORG 800H
;
MVI A,0
MVI B,0
MVI C,10
LOOP: INR B
ADD B
DCR C
JNZ LOOP
STA 8085H
     HLT
;
END
0471デフォルトの名無しさん2007/04/17(火) 02:59:25
>>470
取り敢えずHLレジスタに0を入れて、DEレジスタにaを入れてb回足せばいい。
擬似コードだとこんな感じ。

HL = 0
D = 0
E = [9000h]
C = [9001h]
loop:
HL += DE
--C
if NZ goto loop
[9002h] = HL

しかし、「プログラミングを作りなさい」って……
0472デフォルトの名無しさん2007/04/17(火) 03:14:16
16bit加算があれば楽だけどって思ってたんだが、あったんだな・・・
てっきりないと思って苦労してたorz
0473デフォルトの名無しさん2007/04/17(火) 05:25:38
>>464 こんなのでどう?
    lda 09001h
    mov e,a
    mvi d,0  ; de<--(9001h)の値
    lda 09000h
    mov c,a
    mvi b,0  ; bc<--(9000h)の値
; ここから掛け算:HL <-- HL*DE (16bit)
    lxi h,0000
    mvi a,10h
LBL1:  dad h
    xchg
    dad h
    xchg
    jnc LBL2
    dad b
LBL2:  dcr a
    jnz 0108
    shld 09002h  ; 答
04744732007/04/17(火) 05:35:57
解説:シフトしながら1が立っているときだけ足すのが掛け算の常套手段なのね。
8bitの数の場合最初の8回は足し算が起こらないからムダだけど、16bit同士の掛け算にも
そのまま応用できる。aをb回足す手法と比べて、bが10hより大きいときループ回数の点で
有利、という利点がある。これは実際に8085のclibに使われている手法です。
0475デフォルトの名無しさん2007/04/17(火) 10:36:22
石自体なくなってるのに、何に使うんだろう? 専門学校の課題、っていうだけ?
0476デフォルトの名無しさん2007/04/17(火) 12:42:42
こんな流行らないこと教える専門学校ってある?
工業高校か高専ってとこじゃない?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

だから出来ないよ。

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

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

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

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


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

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

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

call routine
ret

を

jmp routine

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

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

int x=10;
int y=9;

int saiki(x,y){

if (x=0) return (y+4)
if (x>0) return (saiki(x-1,y))
}

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

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

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

俺は悪いけどそんな複雑なことやったことないんで知らない。
まあ、かなり石のアーキテクチャに依存する問題のような気がするけど。
0536デフォルトの名無しさん2007/04/20(金) 18:47:31
>>533
スタックがもったいないので再帰なんて使うな。
0537デフォルトの名無しさん2007/04/20(金) 19:47:12
>>535
引数や帰り値は、レジスタ渡しでいいだろう
普通に書けば問題ない。
この場合、末尾再帰だからレジスタが壊れる事を心配する必要さえない
0538デフォルトの名無しさん2007/04/20(金) 19:50:28
HOGE  START
    LAD   GR7, STK
    LAD   GR1, 10
    ST   GR1, 0, GR7
    LAD   GR7, 1, GR7
    CALL  SIGMA
;    DREG  ='*END*'
    RET
SIGMA  LAD   GR7, 1, GR7
    XOR   GR0, GR0
    LD   GR1, -2, GR7
    JZE   SKP0
    ST   GR1, -1, GR7
    LAD   GR1, -1, GR1
    ST   GR1, 0, GR7
    LAD   GR7, 1, GR7
    CALL  SIGMA
    ADDL  GR0, -1, GR7
SKP0  LAD   GR7, -2, GR7
    RET
STK   DS   100
    END
0539デフォルトの名無しさん2007/04/20(金) 19:54:53
京大電電の実験で使いました。kuechip2です。
アセンブリ言語でソートなどを書かなければなりません。
equはどうやって使うんですか?
#defineのようなものだと調べて知りましたが。

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

  ld acc,N

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

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

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

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

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

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

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

ふつうのソートよりはずいぶん早いけど・・・微ですね
0556デフォルトの名無しさん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]
0557デフォルトの名無しさん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]
0558デフォルトの名無しさん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だと動きません。オーバーフローですか?
どこをどうすりゃいいんだろ・・・
0559デフォルトの名無しさん2007/04/21(土) 13:06:36
dataという擬似命令が使えるようだけど org に相当するのがわからんから巧く使えんね
0560デフォルトの名無しさん2007/04/21(土) 13:18:16
bge(=greater or equal)
を起用したらなぜか通った。やはりoverflawか・・・
イミフ
0561デフォルトの名無しさん2007/04/21(土) 13:31:14
引き算で計算してるから
-64-65 = -129 だけど 16進で書くと $7F =127 になってしまう
だからaccの符号だけみて判定するとミスする事になる
0562デフォルトの名無しさん2007/04/21(土) 13:34:56
overflowってなんですか?ueでoverflawとかいってるけどまさしく今のおれですね・・・
overflowとcarryの違いが分からない
0563デフォルトの名無しさん2007/04/21(土) 13:55:22
演算結果の符合が正しくない状態がoverflow

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

っていうか、これ宿題以前に持ってないとマズい知識のような気がするけど。。
0564デフォルトの名無しさん2007/04/21(土) 14:15:32
ここでは、
overflow : 桁あふれ
carry : 桁あふれなどの結果の識別子
じゃないか。
0565デフォルトの名無しさん2007/04/21(土) 14:23:56
ココもアソコもない話だと思いますが。。
0566デフォルトの名無しさん2007/04/21(土) 14:37:16
>>565
プログラム板の外では、桁あふれ、とは取ってくれないってことね。
0567デフォルトの名無しさん2007/04/21(土) 17:03:02
先生が
overflowがでてもcarryがでない場合がある(うーん逆かも)
とか言ってた気がする。
負数がどうとか、他の班員は理解してたけどおれは????でした。
苦手なんだけどこの分野に進みたいんだよね・・・いらない子になりそう
0568デフォルトの名無しさん2007/04/21(土) 17:11:24
255に1を足したら キャリーも出てオーバーフローも立つ
-100に-1を足したらキャリーは出るがオーバーフローはたたない
0569デフォルトの名無しさん2007/04/21(土) 17:32:37
128から1を引いたらオーバーフローは出るがキャリーはたたない
0570デフォルトの名無しさん2007/04/21(土) 17:37:04
なんとなく把握した。
演算上、異常な事態がoverflowで、ふつうだけど表示不可な時がcarry
でおk?
0571デフォルトの名無しさん2007/04/21(土) 17:38:37
キャリーは符号無しで加算した時のオーバーフローってのでどうだ?
0572デフォルトの名無しさん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)みたいな場合だな。
プラスとプラスを足したのに答えがマイナスになってるのはおかしいでしょ。
0573デフォルトの名無しさん2007/04/21(土) 19:55:51
>>572
非常にわかりやすかった。俺にとってお前は神。
0574デフォルトの名無しさん2007/04/21(土) 20:43:09
>>573
貧乏神? それとも厄病神?
0575デフォルトの名無しさん2007/04/25(水) 05:06:52
H8/2000シリーズでeepmovという命令があります。マニュアル見ると、R4の転送バイト数が
ゼロのときは転送しないように書かれていますが、ゼロだと「最大」(バイトなら256、ワード
なら65536)の転送するんじゃないか、って気がするんです。 誰か試した人いませんか?
0576デフォルトの名無しさん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万人
0577デフォルトの名無しさん2007/04/25(水) 08:15:28
コピペ君って馬鹿だな、まで読んだ。
0578デフォルトの名無しさん2007/04/25(水) 12:40:57
逆アセはスレ違い?だれか誘導してくれるとうれしい
0579デフォルトの名無しさん2007/04/25(水) 13:10:58
逆アセはスレ違い以前に板違いかも
0580デフォルトの名無しさん2007/04/25(水) 13:58:55
エヴァンゲリオンだと文字数が合わないよなぁ?と思った。
0581デフォルトの名無しさん2007/04/25(水) 23:28:26
ハ
ン
ソ
ロ
H
0582お願いします2007/04/26(木) 20:43:03
アセンブラ言語を使ったPICにプログラムをしたいんですが、SW1を変化させるとLEDの点灯を変えるというものなんですがBTFSSをつかってやりたいんですがBTFSSの使い方を教えて下さい
おねがいします
0583デフォルトの名無しさん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:
0584お願いします2007/04/26(木) 23:28:31
SW1のポート番号とは例えばどんなものがありますか
あとGPIOとはなんですか? 
0585デフォルトの名無しさん2007/04/27(金) 13:05:41
マニュアルを読む手間くらいは人任せにしない方が身につきますよ
0586デフォルトの名無しさん2007/04/27(金) 14:06:48
>>584
ピン数によって GPIO一つしかなかったり PORTA PORTBがあったりする
SW1のポート番号は、どのポートを使ったかって事

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

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

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

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

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

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

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

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

>>618
ようするに mov だと2つのオペランド、SRC,DSTがあるでしょ?
SRCとDSTが好きな組み合わせが可能 = SRCとDSTが独立している = 直行
0620デフォルトの名無しさん2007/05/03(木) 13:25:35
なるほど「同じ成分を持たない」を「独立している」に読み替えるわけか
06216082007/05/03(木) 13:38:47
>>619
あ、なかったんですね
さっきCOM用のコードのASSUME命令(ASSUME CS:CODE,DS:CODEってなってました)
を消したり、中身が空のセグメント作ってそれを割り当てたりしてみると
どっちも見た目正常に動いたのですが、COM型だからでしょうか?
0622デフォルトの名無しさん2007/05/03(木) 13:46:58
ASSUMEが無ければ CS: DS: とかのプレフィックスが付かないだけ
06236082007/05/03(木) 14:28:40
>>622
セグメントオーバーライドプレフィックスっていうやつですか
COMだとASSUMEは必要ないんですね、本には書くようになってるんですが、慣習付ける為ですかね
まだEXEを扱えるようになってないので出直して来ます
0624デフォルトの名無しさん2007/05/03(木) 14:48:45
COMだとDS= ES= SS= CS だから まあ必要無いといえば無い
0625デフォルトの名無しさん2007/05/03(木) 15:11:38
.model tiny
とかしてるからでそ?
0626デフォルトの名無しさん2007/05/10(木) 03:05:41
セグメントディスクリプタキャッシュってレジスタの一種なの?
0627質問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
}

0628質問(補足)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;

0629質問(補足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
0630デフォルトの名無しさん2007/05/10(木) 16:13:01
質問なんですが、
市販のCPUを実際に自分でいじれるて、
実際に確認できるものとかないんですか?
例えば、電気がながれた
ほら、ここの0が1にかわって
こうなってこうなってだから結果がこうなるんだ
みたいなのがいいです
0631デフォルトの名無しさん2007/05/10(木) 16:29:06
>>630
大昔のパソコン(?)にはデータバスやアドレスバスにLEDがついて
動いてるのが視覚的にわかったもんじゃ。
デバッガでレジスタの内容見るとかじゃだめかね?

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

どちらにせよ板違いっぽいな。http://science6.2ch.net/denki/ こっち探してみ。
0637デフォルトの名無しさん2007/05/10(木) 16:57:08
>>636
誘導ありがとうございます
さっそく質問してきます
0638デフォルトの名無しさん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

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

ところで、なにをどうやって東京ドームをもとに計算するんだ?
0644デフォルトの名無しさん2007/05/11(金) 16:21:55
東京ドームに座布団が何枚敷けるか、から類推したとか・・・
0645デフォルトの名無しさん2007/05/11(金) 17:23:03
小錦何人分?
0646デフォルトの名無しさん2007/05/12(土) 00:11:11
うーん忘れたがとても多いということだけ覚えている。
またPS3のCPUがひとつ動いてない、なんか歩どまりがどうとかそういうのも覚えている。
他はうーん、ブースのアルゴリズム、これは忘れた。
0647デフォルトの名無しさん2007/05/12(土) 01:07:16
JTAG使えばええやん
0648デフォルトの名無しさん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が「:;<=>?」になります。
それはなぜでしょうか?
0649デフォルトの名無しさん2007/05/12(土) 07:58:46
フラグの動きが違うんだろうな。
ZかCかどっちか。
0650デフォルトの名無しさん2007/05/12(土) 08:04:46
>>648
キャリーはクリアされるよ。
06516492007/05/12(土) 08:19:44
久しぶりだな、こんなところにくるのは。
帰巣本能みたいな感じ。
0652デフォルトの名無しさん2007/05/12(土) 10:56:44
>>648
ORI を先にやって CPI 3AH にしてみたら?
0653デフォルトの名無しさん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に変換

か。

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

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

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

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

NOPの替わり?
0662デフォルトの名無しさん2007/05/12(土) 18:18:50
$はフェッチしたときのアドレスではなくて、「アセンブル時のその命令のロケーションカウンタ」
ですよ。だからZ8ニーモニックなら$+4で正解、85ニーモニックなら$+5で正解です。
JMP $は−3の相対アドレスを持ちます。 JR $は−2の相対アドレス。
0663デフォルトの名無しさん2007/05/12(土) 18:21:59
MASMでは $ は現在のアドレスのオフセット値
0664 ◆0uxK91AxII 2007/05/12(土) 18:25:42
>>661
それは、所謂無限loop。
x86だとjmp $+2で、pipelineをclearする意味合いがあるらしい。
0665デフォルトの名無しさん2007/05/12(土) 22:05:05
なんで、わざわざハードの動きを得意げに説明する奴が出てくるんだろうか...。
0666 ◆0uxK91AxII 2007/05/13(日) 00:07:44
あまりにもthreadの趣旨から外れた投稿を行う>>665は滅ぶべきだね。
0667デフォルトの名無しさん2007/05/13(日) 01:18:16
>>664
んなこと誰も訊いていない
0668デフォルトの名無しさん2007/05/13(日) 01:40:16
>>667
>>661
0669デフォルトの名無しさん2007/05/13(日) 09:10:57
$が何を指すかは処理系依存
無駄
0670デフォルトの名無しさん2007/05/13(日) 09:34:05
>>666
自演乙
06716712007/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です。
0672デフォルトの名無しさん2007/05/13(日) 18:12:34
eaxがポインタか。
終わったな、MS。
0673デフォルトの名無しさん2007/05/13(日) 18:38:41
dword ptr [eax] = EAXの指すアドレス(オフセット)にあるDouble Wordの値
0674デフォルトの名無しさん2007/05/13(日) 18:41:57
常識的にebx使うだろ。
eaxだと1バイト長い。
06756712007/05/13(日) 18:48:19
>>673
そういうことですか。
どうも、ありがとうございました。
0676デフォルトの名無しさん2007/05/13(日) 18:51:19
逆アセンブルするとMSがアフォだった。
0677デフォルトの名無しさん2007/05/13(日) 18:59:38
今時1バイトくらいけちけちすんなよ
0678デフォルトの名無しさん2007/05/13(日) 19:03:50
MSはかなりいい加減だな。
ゴミコンパイラ発覚。
0679デフォルトの名無しさん2007/05/13(日) 19:08:40
はいはいゴミゴミ
0680デフォルトの名無しさん2007/05/13(日) 19:09:25
コンパイラじゃないだろ。 アセンブラで書いたのを逆アセンブルしたんだろ?
0681デフォルトの名無しさん2007/05/13(日) 19:10:50
初心者大爆発(W
0682 ◆0uxK91AxII 2007/05/13(日) 19:15:18
>>627-629
>Express Edition
0683デフォルトの名無しさん2007/05/13(日) 19:19:31
Express Editionがどうこう以前にインラインアセンブラで書いてるじゃん >>627
0684 ◆0uxK91AxII 2007/05/13(日) 20:13:33
流れから、compileをExpress Editionで行ったと解釈。
違うならスルーで。
0685デフォルトの名無しさん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]
>となりました。

コンパイラ(アセンブラ)の仕事はラベルのアドレス解消しかないわな。
0686デフォルトの名無しさん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を実行 */
    }
}

0687デフォルトの名無しさん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
0688デフォルトの名無しさん2007/05/14(月) 18:37:42
質問の意味が判らん。
スタックを切り替えてるって事はコルーチンとかスレッド切り替えをやってるんだろ?
その部分で呼び出し元に戻らないのは当然で、
再度コールチンの切り替えが呼ばれたら、そこで再度ESPが戻されて元に戻るわけだ
0689デフォルトの名無しさん2007/05/14(月) 19:32:00
>>688
スタックポインタをあまりよくわかっていませんでした。
汎用データ・レジスタをすべてpopすると、
eip(ステータスレジスタ)に書かれているアドレスに分岐されるんですね。
たまたま、↑の場合はSPを切り替えたため、
eipが、funcの呼出しもとでなかったために
task_Aが実行されたんですね。
わかりました。
0690デフォルトの名無しさん2007/05/14(月) 22:38:12
>>689
> eip(ステータスレジスタ)

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

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

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

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

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

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

これの入れたものが逆に出てくるバージョンが知りたいです
07066942007/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
07076942007/05/24(木) 15:16:30
連続投稿すみませんでした

スペースたくさん入れても一つになってしまいますね
0708デフォルトの名無しさん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
0709デフォルトの名無しさん2007/05/24(木) 15:28:39
>>705
厄介だねえ IN 命令では何バイト読まれるか判らないのか
A 1バイト又は終了なら0バイト
B Nバイトが一気に読まれる
 なら比較的楽なんだけどなあ
0710気まぐれアナスイ2007/05/24(木) 15:37:37
私の計算では。
『((++) != (\/n)a) == 1』
0711デフォルトの名無しさん2007/05/24(木) 15:40:04
>>708
げ、バグがある。やっぱ無しっつうことで。
0712デフォルトの名無しさん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
07136942007/05/24(木) 16:41:09
>>709

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

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

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

>>708
そんな感じだとは思うのですが、エラーが出ていても
どこが間違っているのかも全然わからない素人なのです(汗
07146942007/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
07156942007/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
0716デフォルトの名無しさん2007/05/24(木) 17:51:49
とほほ。
SUBをSUBAに、R0をGR2にして、余分な空白は消さないと動かないね。
ENDの位置も間違ってる。
0717モンキーJ2007/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:

よろしくお願いします。
0718デフォルトの名無しさん2007/05/24(木) 21:25:59
問題があるとすれば、それはその課題の出題者の頭がだな。
0719デフォルトの名無しさん2007/05/24(木) 21:39:45
>>715
スタック使ってないやん…
0720デフォルトの名無しさん2007/05/26(土) 03:21:48
使わずに済むならそれにこしたこたねんだ
0721デフォルトの名無しさん2007/05/26(土) 03:27:12
>>717
MIPSのアセンブラって皆こうなん?
$とかすごく入力しにくいぞ
0722デフォルトの名無しさん2007/05/26(土) 11:08:09
そうでもないよ
0723デフォルトの名無しさん2007/05/27(日) 00:12:29
$ が入力しにくいってどんな環境なんだ?
0724・∀・)っ-○◎●2007/05/27(日) 00:48:17
shift+4って日本語でも英語でも同じだよな
0725デフォルトの名無しさん2007/05/27(日) 02:09:03
まさかケータイからとか?
0726デフォルトの名無しさん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

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

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

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

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

循環しますが

0743デフォルトの名無しさん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です。
0744デフォルトの名無しさん2007/05/31(木) 22:02:27
コメントの書き方がヘタレだな、なぜこうしたかという意思表示が伝わってこん。
そういう1命令ごとのミクロの視点じゃなくて、もう少し大局的なコメントを書いてくれ。
例:どうやって1秒間の時間稼ぎをするのか、とか。

添削はそれから。
07457432007/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

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

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

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

これは時間稼ぎループの中に入れないとまずい。
それにしてもループで時間稼ぎとは前時代的だなw
0750デフォルトの名無しさん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も要らないかと。
0751デフォルトの名無しさん2007/06/01(金) 09:17:45
命令を理解しているかどうかを確かめるために
1行ずつ命令の動作をそのままコメントに書かせる奴はいる。
0752デフォルトの名無しさん2007/06/02(土) 13:10:39
Spimでオーバーフロー時の処理ルーチンって何のことだかわかりますか?
0753デフォルトの名無しさん2007/06/02(土) 15:53:10
オーバーフロー時の処理ルーチンのことだろ
0754デフォルトの名無しさん2007/06/03(日) 10:55:41
どんな命令与えるの?
0755デフォルトの名無しさん2007/06/03(日) 13:27:19
オーバーフローが起きたときは処理系によりレジスタの内容が「最大」になるとか不定になるとか
ゼロになるとかいろいろあると思う。計算の途中なら先を続けないとか、数値として編集するなら
「計算できません」的な表示を作るとか、要するに「正しい答以外の場合」の後始末が必要でしょ
0756デフォルトの名無しさん2007/06/03(日) 17:25:43
本とかで調べるとmfc0命令でレジスタにコピーし、ジャンプレジスタ命令で例外が起きたコードに戻す。ってあったんで頭を抱えていたのですが、
なんだか難しく考えすぎていたようです。>>755 ありがとうございました。
0757デフォルトの名無しさん2007/06/04(月) 05:35:34
>>745はどうなったのかな?
0758デフォルトの名無しさん2007/06/07(木) 23:35:21
データラベル DB
の組み合わせはデータラベルを識別子とする変数や配列を定義してるようなものだと思えばいいんでしょうか?
0759デフォルトの名無しさん2007/06/08(金) 01:53:30
グローバル変数限定なら、まあ。
0760デフォルトの名無しさん2007/06/08(金) 02:00:17
>>758
hoge DB "hanage",0
はC言語でいうところの
char* hoge = "hanage";
かなぁ。
0761デフォルトの名無しさん2007/06/08(金) 03:57:59
正確には、char hoge[7]="hanage"; の訳が>>758
>>760は hoge: DW peke
      peke: DB "hanage",0 になる。
07627582007/06/08(金) 06:47:33
>>759-761
ありがとうございます、そういう感覚で覚えておきます
0763デフォルトの名無しさん2007/06/16(土) 12:01:13
高級言語からアセンブリに落とす作業ってなんていう?
0764デフォルトの名無しさん2007/06/16(土) 12:04:20
sageわすれ
0765デフォルトの名無しさん2007/06/16(土) 13:20:14
コンパイル
0766デフォルトの名無しさん2007/06/17(日) 02:26:32
そのままアセンブリに落とすっていってるな

なんかいい名前かんがえようぜ
0767デフォルトの名無しさん2007/06/17(日) 05:32:01
>>766
組み立て作業(誰にでも出来る簡単なお仕事です!未経験者歓迎)
0768デフォルトの名無しさん2007/06/22(金) 00:14:10
よろしうお願いします。
問題文はうpしますた
ttp://bebe.run.buttobi.net/up/src/be_1192.txt
0769デフォルトの名無しさん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
0770デフォルトの名無しさん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を商に足してゆく、という考え方です。
0771デフォルトの名無しさん2007/06/22(金) 14:16:13
専用ブラウザで見ると、スペースはちゃんと残るよ。
0772デフォルトの名無しさん2007/06/25(月) 14:35:58
MIPS RISCアーキテクチャのアセンブラで質問が。

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

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

 読みこみ $t0,配列アドレス
ラベル1:
 戻れるジャンプ read_char
 アドレスに保存 $t0,$v0
 加算 $t0,1
 比較 $v0,キャリッジリターン
 同一じゃなければジャンプ ラベル1
 アドレスに保存 $t0,0
 読みこみ $t0,配列アドレス
 戻れるジャンプ print_string
0774デフォルトの名無しさん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を使う */
07757722007/06/25(月) 19:17:21
すいません。
>>772のように動作するプログラムをMIPSアセンブリで組んだら
どのようになるのでしょうか?

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


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

ttp://bebe.run.buttobi.net/up/src/be_1239.txt
0778デフォルトの名無しさん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
0779デフォルトの名無しさん2007/06/25(月) 20:37:57
どこにも宣言が無いけど、マクロのつもりじゃまいか。
07807722007/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になると
より純粋なアセンブリ言語に近くなっているようで、データメンバを指定できなくなったり、配列が使えなくなったりしているようです。
0781デフォルトの名無しさん2007/06/26(火) 00:03:17
えーと?
spimに依存した話、って事でいいのかな?
07827722007/06/26(火) 02:51:50
>>781
でOKです。
07837722007/06/26(火) 18:20:52
課題の主旨を勘違いしていたようです。
キューではなくスタックを2度使い、普通に表示されるようにしなければならないのですが、
スタックを2回使った場合、どうやればいいのか検討もつかないので、>>773さんのような感じで
どなたかヒントを戴けないでしょうか?

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

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

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

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

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

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

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

こんな感じかと作ってみたのですが、文字を入力した瞬間、エラーが出てしまいます。
ttp://bebe.run.buttobi.net/up/src/be_1279.txt
07907842007/06/27(水) 13:40:32
スタックに積むといいながら、789見てみるとスタックじゃなくて配列に入れてるように見える。
俺はこの石のASMはいじったことないが、add $10, 1 の後、bneってのは変だと思う。
何かとコンペアして、beかbneでなきゃおかしいでしょ。 で、その比較するものは、
「今格納した文字が特定の何かの文字か?」と判定するんじゃないの?'n'だったら終わり、
っていうんじゃあまりにもプログラムらしくないでしょ。"hellow"を入れたら動かないことになる。
ふつうは復帰(0Dh)か改行(0Ah)を入れたら1行分の文字列の終わり、と認識するもんだ。
0791つづき2007/06/27(水) 13:48:53
この石に他の大部分と同じアーキテクチャのスタック機能があると仮定しての話だけど、
789はpush/popの概念解ってる? スタックポインタ(SP)という特定のレジスタがあって、自分で
初期化する場合もあるし、789が書くプログラムにきたときに特定の値にそれが初期化されてる
こともある。それは処理系依存。
push-->SPの指すメモリにレジスタの1語を書き込み、SPを1語分減らす、
pop -->SPの指すメモリから1語レジスタに読み出し、SPを1語分増やす、 君の処理系でもそう?
0792デフォルトの名無しさん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
07937842007/06/27(水) 14:04:18
今言語のとこ見てた。push/popが無いのね。補足ありがと。>>792
789のやり方なら、最初に$10にarのアドレスを入れるところで、$10に$SPをコピーしておく。
で、newlineを識別したところでは$SPは何語分か減っているが、最初のコピー$10の指す
メモリから順に取り出せば入力した順に文字が取り出せる、というわけ
07947722007/06/27(水) 15:00:14
>>792,793さん
書いてくださった事を元に、今書き直しています。
07957722007/06/27(水) 15:15:44
>>792
教科書には、

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


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

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

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

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

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

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

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

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

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

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

入力されたのが出力されりゃいいだけなら、こんな感じじゃあるまいか。
getsとputsを使って手抜きしてもいい気がする。
08147722007/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
0815デフォルトの名無しさん2007/06/27(水) 21:14:18
>>812
いや、自分で考える習慣を付けさせてるんだから最高の教官だと思うが。
08167722007/06/27(水) 21:29:35
>>815
まともな教官なら提出期限3時間前の時点で、未提出3分の2という状況はないと思いますorz
個人的にはプログラム板の人に講義をしてもらいたいところです。

>>814のコードですが、lb $9, A($8)がエラーを起こしているみたいです。
readで保存したsb $9, A($8)を呼び出しているだけだと思うのですが、
何がいけないのでしょうか?
0817デフォルトの名無しさん2007/06/27(水) 21:57:10
そんなときには1ステップづつ実行して、自分が想定した動きをしているか確かめよう。
デバッグ作業が勝利の鍵だ。
0818デフォルトの名無しさん2007/06/27(水) 21:58:17
>>816
そこは問題ない。814のコードは忘れて、810のコードに戻れ。
printの前で$8を別のレジスタに保存 が問題。
別のレジスタに$8が保存されてないからループが始まった瞬間、
0以下になりループから脱出するので一文字しか出力されない。
08197722007/06/27(水) 22:05:38
>>817,818
動きました!早速提出してきます。
本当にありがとうございました!
0820デフォルトの名無しさん2007/06/27(水) 22:10:53
>>819
おめ。810の時点で物凄くコード書きたかったが、手淫しながら待っててよかった。
0821デフォルトの名無しさん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が提出出来ないって、ゆとりはすごいな。
0822デフォルトの名無しさん2007/06/27(水) 22:34:41
といいつつ、コピペ修正忘れてprintへ飛ぶところをreadのままにしてる
俺がゆとりだった罠。
0823デフォルトの名無しさん2007/06/28(木) 19:24:29
すごい・・・2chの親切な人が全てここに集まった気がする
0824デフォルトの名無しさん2007/06/28(木) 22:05:52
インテルのアセンブリ言語(たとえば加算、減算、ロード、ストア)の命令セッ
トの構成とMIPSの命令セットの構成の違いを教えていただきたいのですが、お
願いします。
0825デフォルトの名無しさん2007/06/28(木) 22:06:41
大学のレポートで、今日中に書かなきゃやばいです・・・
0826デフォルトの名無しさん2007/06/28(木) 22:32:26
マルチ良くないぜ、たけし君
0827デフォルトの名無しさん2007/06/28(木) 22:33:15
たけし?
大体マルチじゃないよ。
0828デフォルトの名無しさん2007/06/28(木) 22:48:44
86系命令セットで数TFLOPSを実現するらしい
0829デフォルトの名無しさん2007/06/28(木) 23:56:10
よくわからないけどありがとう・・・
質問を打ち切ります。
0830デフォルトの名無しさん2007/06/29(金) 00:17:07
ここで聞いたことを後で後悔するんだろうな
0831先に後悔するなら大変だが2007/06/29(金) 07:55:55
>>830
大丈夫、後で後悔するなら当たり前だから。
0832デフォルトの名無しさん2007/06/30(土) 09:33:24
MIPS/SPIMにて最初の20の二乗の合計を計算するプログラムを組みたいのですが、
どうやればいいのでしょうか?
0833デフォルトの名無しさん2007/07/01(日) 05:23:18
>最初の20の二乗の合計 ってなんか抜けてないか?
最初の20個の整数?素数?テーブルの中身? 何bitの情報?
0834デフォルトの名無しさん2007/07/01(日) 07:20:20
>>833
1から20までの数値の二乗を足していって、その結果を表示するプログラムです。
説明がわかりにくくて申し訳ありませんでした。
テーブルの中身、何bitの情報というのは説明されていないので分かりません。
とにかく、結果が表示されれば良いと思います。

ここまで作ってみたのですが、エラーを起こしてしまいます。
悪い点があればご教示お願いします。
ttp://doiob.net/doiob/uploader/src/up7205.txt
08358342007/07/01(日) 07:22:50
こちらでした。

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

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

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

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

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

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

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

>addi $v0, $0, 4 #文字を出力 宣言
>add $a0, $2, $0 #$2を出力
>syscall
どう見ても>835と違うわけだが。
08398342007/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

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

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

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

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

ずっとやっているのですが、全然出来ません。
0844デフォルトの名無しさん2007/07/01(日) 14:00:52
>>842
>840にはputsってのがあるのに今度はまたそれがない。
putsで出力しているんじゃないの?
あんたへのレスに、ヒントになりそうなことは山ほどあるんだけど全然理解できてないだろ。
いい加減に行き当たりばったりで振り回さないでくれるかな。
0845デフォルトの名無しさん2007/07/01(日) 16:03:33
>>844 == >>842
0846あほかい2007/07/01(日) 16:26:11
自演だとでも?
0847デフォルトの名無しさん2007/07/01(日) 21:32:40
とりあえずさ、わからないで答えてるやつは自重しようよ。
0848デフォルトの名無しさん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
0849デフォルトの名無しさん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では出力されない。
08508342007/07/02(月) 06:09:57
>>849
完璧です!きちんと表示されました。ありがとうございました!
08518342007/07/02(月) 06:13:03
あと、UC系列ですがUC Berkleyではありません。
0852デフォルトの名無しさん2007/07/02(月) 11:09:17
結局、丸投げに終わったわけだ。
0853デフォルトの名無しさん2007/07/02(月) 15:33:13
>>849
> >>848
> 理論はあってるけどそれでは無理。SPIMでは出力されない。
えぇと?spim ver. 7.3で出力を確認済みなんですが?
SPIMでは出力されないという根拠を聞かせてもらいたい。
0854デフォルトの名無しさん2007/07/02(月) 19:31:38
>>853
834のコードからしてspimsal使ってるんだろう。
spimsalだとそのコードでは0としか出力されない。
0855デフォルトの名無しさん2007/07/02(月) 21:09:38
spimsalでは0になる??
はて、何でじゃろか?madd使ってるせい?
0856デフォルトの名無しさん2007/07/04(水) 12:03:20
とりあえずmallを使わずにmulとadd使ったらちゃんと出力された。
print_intを使う事は何も問題がなさそう。
0857デフォルトの名無しさん2007/07/07(土) 14:21:30
CASLIIの超初歩問題らしいですがお願いします

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

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

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

0873デフォルトの名無しさん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
0874デフォルトの名無しさん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はジャンプと考えていいですよね。
これで明日試してみます。<(_ _)>

0875デフォルトの名無しさん2007/07/12(木) 20:05:36
>>874
決められていなければデータをどこに置くかは好みとか気分次第だから
STARTの後のラベル名がついたアドレスは実行のエントリポイントを表す
ラベル名を指定しなければSTARTの次から実行が始まる
CASLIIの仕様書を見れ
0876デフォルトの名無しさん2007/07/12(木) 20:23:27
仕様書をみるとSTARTの前にもラベルを指定しなくちゃいけないみたいなんですけど・・・
仕様書読みました?
0877デフォルトの名無しさん2007/07/12(木) 23:20:59
>>876
命令行のラベルは無くてもいい(2.1(4))
2.2の表のほうが間違いじゃないか?
実際のところ本家のセンターのシミュレータはラベル無しSTARTを通す
ラベルありEND命令は通さないところを見ると省略可能にはあってはいけないの意味も含めるらしい
0878デフォルトの名無しさん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

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

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

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

っていうか、質問が欲しいとは言ったが、困ってるのかな?>>885
0890デフォルトの名無しさん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を使って要素の値を表示
とする
0891デフォルトの名無しさん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]);
}
}
0892デフォルトの名無しさん2007/07/27(金) 00:35:25
define
0893デフォルトの名無しさん2007/07/27(金) 04:06:20
>>890
実行環境は正確に。
単にMIPSと書いたらMIPS32であるとみなすからね。
0894デフォルトの名無しさん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が使えます
0895デフォルトの名無しさん2007/07/27(金) 20:29:18
同じ大学でワロタ
つか解答貰ったでしょ?
0896デフォルトの名無しさん2007/07/27(金) 23:28:53
そんなもの貰ってません
だから多分違う大学ですね
0897デフォルトの名無しさん2007/07/27(金) 23:35:05
しかし問題文がほぼ同じなんだが・・・
J科じゃないのか
0898デフォルトの名無しさん2007/07/27(金) 23:53:37
>>896
なんでそんな冷たいのよwww
0899デフォルトの名無しさん2007/07/28(土) 01:49:49
つまり、
二人とも同じ非常勤講師のテストを受けてるんじゃないか?

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

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

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

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

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

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

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

>>917 自分の能力にみあった評価をしてもらった方がいいよ。
0923デフォルトの名無しさん2007/08/02(木) 22:48:09
>>912rikuu
何が分からないんだ。
ヒントの1〜5のどれが分からないんだ。
CASLIIの入力仕様が分からないのか?
それとも、10進数を2進数に変換する方法が分からないのか?
剰余という言葉が分からないのか?
09249232007/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で除する問題なんて正攻法では難しすぎる。
0925デフォルトの名無しさん2007/08/03(金) 01:07:50
>>922
自分の能力にみあった評価をしてもらった方がいいよ。
0926デフォルトの名無しさん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
0927デフォルトの名無しさん2007/08/04(土) 00:33:37
>>925 の評価は最低ランクに決まりました
0928デフォルトの名無しさん2007/08/04(土) 00:52:23
>>927
自分の能力にみあった評価をしてもらった方がいいよ。
0929デフォルトの名無しさん2007/08/04(土) 08:03:41
あなたにしては、よくがんばった、80点。
0930デフォルトの名無しさん2007/08/04(土) 13:00:12
質問です。

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

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

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

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

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

>>951
妙に安いな > \100〜\150ぐらいまでになりそうなもんだ。
0953デフォルトの名無しさん2007/08/10(金) 01:52:04
100で受けてバイトに30で出すと差額が儲かるとは思わないか?
0954デフォルトの名無しさん2007/08/10(金) 02:27:45
>>953
完成しなかった時の責任はだれが取る?
バイト君が給料泥棒になる可能性はかなり高い
0955デフォルトの名無しさん2007/08/10(金) 02:42:57
>>952
たしかIntelのRISCだ >86000
Motorola の 88000と同時期くらいだったと思うけど。
09569552007/08/10(金) 02:52:54
すまん。80860と間違えたw
元の質問の86000は68kの間違い?
0957デフォルトの名無しさん2007/08/10(金) 04:30:20
R3000
0958デフォルトの名無しさん2007/08/10(金) 08:55:19
V30なら任せろ
0959デフォルトの名無しさん2007/08/10(金) 11:15:58
AWとかって書くの?
0960デフォルトの名無しさん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:

プログラムの間違いを修正、アドバイスをして頂ける方がいらっしゃいましたらよろしくお願いします。
0961デフォルトの名無しさん2007/09/05(水) 17:56:48
意味がわからないもなにも、CPUにさせたい動作そのものを記述するだけだろう。
命令表を見ながらやれば悩む要素なんざどこにもない。
0962デフォルトの名無しさん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:

これをアセンブラにする
0963デフォルトの名無しさん2007/09/05(水) 21:31:49
そのCのプログラムをMIPSをターゲットにして cc -S
0964デフォルトの名無しさん2007/09/05(水) 23:04:11
>>963
0965デフォルトの名無しさん2007/09/06(木) 03:56:44
>>960
素人ながらにナイスファイト。
一度Cコードを何らかのソフトでコンパイルして出てきたAssenblyを閲覧するというのも手だよ。
0966デフォルトの名無しさん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] ;
}
0967デフォルトの名無しさん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
0968デフォルトの名無しさん2007/09/06(木) 14:07:00
i have no idea
0969デフォルトの名無しさん2007/09/06(木) 14:49:36
私は無いイデアを持っています
0970デフォルトの名無しさん2007/09/06(木) 21:07:54
どうして関数が呼ばれて最初に push ebp ってするの? 
0971デフォルトの名無しさん2007/09/06(木) 21:46:35
>>970
ebpは保存しておきたいから。
0972デフォルトの名無しさん2007/09/14(金) 03:38:50
スタックフレームを作るのに使うから。
0973デフォルトの名無しさん2007/09/14(金) 12:29:12
mips用gccでクロスコンパイルすればいいんじゃまいか?
0974デフォルトの名無しさん2007/09/15(土) 11:58:25
>>973 >>963
0975デフォルトの名無しさん2007/09/21(金) 05:12:36
mata aerukana
0976デフォルトの名無しさん2007/09/26(水) 14:37:23
ナップサック問題のプログラムができません。
誰か助けて下さい。
0977デフォルトの名無しさん2007/09/28(金) 16:51:10
新スレどうします?
0978デフォルトの名無しさん2007/09/28(金) 18:55:53
もし立てるなら アセンブリ に直しといて
0979デフォルトの名無しさん2007/09/28(金) 21:29:22
秋月の電波時計キットを買ってきたのですが、どうやって組み立てればいいですか?
0980デフォルトの名無しさん2007/09/28(金) 21:37:02
jmp 秋月スレ
0981デフォルトの名無しさん2007/09/28(金) 23:47:38
>>979
かなづちで粉砕→水100ccを加え冷凍庫へ
0982デフォルトの名無しさん2007/10/01(月) 18:10:44
>>981
出来ました!ありがとうございました!
0983デフォルトの名無しさん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.)
0984デフォルトの名無しさん2007/10/02(火) 09:49:18
そっちの方は「アッセンブリ」だろ、という突っ込みは野暮か?
0985デフォルトの名無しさん2007/10/03(水) 02:53:03
push は
・stack pointer を +1 してからデータを積む
・データを積んでから stack pointer を +1 する
のどっちですか。
CPUごとに違う気もしますが、しってる範囲でいいので教えてください。
0986デフォルトの名無しさん2007/10/03(水) 04:51:18
元の質問,間違い?
>231 − 1
2^(31) − 1
>5010, 5210, 010
50(10),52(10),0(10) (10)=decimal
0987デフォルトの名無しさん2007/10/03(水) 05:06:03
>>985
pushはプリデクリメント、popはポストインクリメントが一般的。
Cっぽく書くとこう。
Push : *(--StackPointer) = Data;
Pop : Data = *(StackPointer++);
0988デフォルトの名無しさん2007/10/03(水) 07:23:16
理由は[sp]を参照することで、最後に積んだ値(リターンアドレス)を得ることが出来るから
だと思う。
もちろん、そういうアドレッシングモードが用意されていれば、だけど。
例えば8086は無理でも、その元となった8080(Z80)にはあったはず。
0989Socket7742007/10/03(水) 08:07:40
>>985
+ ぢゃなくて - だよね?
0990デフォルトの名無しさん2007/10/03(水) 10:50:02
985は書き間違いだね。だけど世の中には、pushで+、popで−な石もある。(ADuC831/841とか)
0991デフォルトの名無しさん2007/10/03(水) 12:36:52
プリデクリメント、ポストインクリメントが多いと思う
0992デフォルトの名無しさん2007/10/03(水) 14:16:20
アセンブリ言語の宿題ができないときに、
アセンブリ言語好きのお兄さん・お姉さんに尋ねるスレ。

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

前スレ

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

これで誰か新スレを!
0993デフォルトの名無しさん2007/10/03(水) 14:30:02
>>988
スタックポインタの演算とロード・ストアをアトミックにやる必要がないからじゃないの?
0994デフォルトの名無しさん2007/10/06(土) 15:32:54
アセンブラを勉強しよう
http://pc11.2ch.net/test/read.cgi/tech/1172916032/l50

アセンブラ… Part 12
http://pc11.2ch.net/test/read.cgi/tech/1187079488/l50
0995デフォルトの名無しさん2007/10/06(土) 15:58:15
まぁ、その辺りのスレを使うほうが賢明かも知れんな。
0996デフォルトの名無しさん2007/10/07(日) 05:20:08
h
0997デフォルトの名無しさん2007/10/07(日) 05:23:02
t
0998デフォルトの名無しさん2007/10/07(日) 05:23:39
t
0999デフォルトの名無しさん2007/10/07(日) 05:26:28
p
1000小倉優子 ◆en0rG2J.f6 2007/10/07(日) 05:27:02
1000ならジュースでも飲むか
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。