アセンブラの宿題質問スレ
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/10/18(水) 00:04:05アセンブラ好きのお兄さんに尋ねるスレ。
・必ずCPUの名前を書くこと!
・情報を小出しにしない。書ける情報は全て書いた方が得だよ。
0002デフォルトの名無しさん
2006/10/18(水) 00:05:440003デフォルトの名無しさん
2006/10/18(水) 00:06:56それ以外のアセンブラなんて人間にすすめるもんじゃない。
0004デフォルトの名無しさん
2006/10/18(水) 00:20:21本家スレに逝けw
0005デフォルトの名無しさん
2006/10/18(水) 00:47:59[8085h]←[8051h]+[8052h] を計算し、符号付2進数加算としてのオーバーフローを判定する
8085プログラムで書けという問題なのですがまったく分かりません。
どなたか分かる方教えてください。よろしくお願いします。
0006デフォルトの名無しさん
2006/10/18(水) 01:28:16まあまず、8bitの2の補数を足したときにオーバーフローする条件を考えてみれ。
0007デフォルトの名無しさん
2006/10/18(水) 03:12:340008デフォルトの名無しさん
2006/10/20(金) 23:58:080009デフォルトの名無しさん
2006/10/21(土) 00:56:11LDA 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プログラム全体は自分で頑張って作ってみようと思っているのですが、
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!の計算には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サブルーチンで計算し、全て呼び側(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:340014デフォルトの名無しさん
2006/10/23(月) 00:31:10問題
もしコンピュータが直線的な処理しかできないとすると、0番地から計算を始めても主記憶の最後の番地までの命令をただ実行するだけでそこで終わってしまう。
1GBの主記憶であるとして、全ての命令が仮に2バイトで表せたとして、
・何命令収容できるか
・全部の命令を実行するのに、どれくらいの時間がかかるか
PDP11のプログラムカウンタとかについての問題です
答えだけじゃなくて説明をしなければならないので、できるだけ解説もお願いします
よろしくおねがいします
0015デフォルトの名無しさん
2006/10/23(月) 00:37:421命令2byteだから1GBで0.5G命令、つまり2^29命令、
1命令に1クロックかかるなら2^29クロック。
1MHzなら、これは537秒くらい。
と、書いてはみたが、俺は勘違いしているような気がしてきた。
0016デフォルトの名無しさん
2006/10/23(月) 00:50:19プログラムカウンタの上限までいったら次は0番地に戻るんじゃないか
とかいうツッコミはダメですか?
0017デフォルトの名無しさん
2006/10/23(月) 00:50:37わけわかりません・・・
勘違いって?
0019デフォルトの名無しさん
2006/10/23(月) 00:55:24すみませんわかりません
0020デフォルトの名無しさん
2006/10/23(月) 01:10:360021デフォルトの名無しさん
2006/10/23(月) 01:34:540022デフォルトの名無しさん
2006/10/23(月) 02:11:39ものすごく基礎的なことなので
コンピュータのしくみ
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問題が意味不明
GBを理解してるか、の問題?
どんな命令を実行するのかわからないのに、
どれくらいの時間がかかるかなんてわからない
0026デフォルトの名無しさん
2006/10/23(月) 03:59:330番地から順に命令を実行できるのみだとしたら、と考えるんだろう?
命令数は簡単だから省く。
1命令って、どういうプロセスで実行されるんだっけか?
読み出しに1クロック、解釈に1クロック、実行に1クロックで、合計3クロックか?
0027デフォルトの名無しさん
2006/10/23(月) 04:05:360028デフォルトの名無しさん
2006/10/23(月) 04:15:08昔は、fetch, decode, execute, writeback の4つに分類されてたな。
0029デフォルトの名無しさん
2006/10/23(月) 08:36:07プログラム全体は自分で頑張って作ってみようと思っているのですが、
32ビットの整数値を予め用意しそれを操作する方法が分かりません。
命令自体が32ビットなのに32ビットの数なんて操れるのでしょうか?
addi命令でも操れるのはせいぜい24ビットだったような気がしますし、
5個も足したら普通にオーバーフローしてしまうんじゃないかとorz
http://www.za.ztv.ne.jp/yosi-h/v6010005ffffff.jpg
0030デフォルトの名無しさん
2006/10/23(月) 11:56:440031デフォルトの名無しさん
2006/10/23(月) 12:51:32教えてくださいお願いします
問題は書いた通りです
補足です
学習範囲は実行制御にかかわる命令というところで、GBとかも習いました
教科書によるとプログラムカウンタは2ずつ増加していくけど、直線的な処理にとどまるらしいです
そこでジャンプ命令と条件分岐命令が用意されており、柔軟な処理が可能になると書いてあります
急ぎですのでなるべく早くお願いします!
0032デフォルトの名無しさん
2006/10/23(月) 13:01:040033デフォルトの名無しさん
2006/10/23(月) 14:38:55答えも教えてもらいましたが全然違いました‥このスレの人のも
もうかなりヤバイです(ノд`)
答え1問目は5億何ちゃらというとんでもない数字でした
2問目はそれに10の-9乗掛けたものです
そもそもクロックとかまだ習っていませんでしたし‥
皆さん難しく考えすぎだったのでは‥
0034デフォルトの名無しさん
2006/10/23(月) 14:44:06それに10^-9をかけるということは1GHz動作だったんだな。
問題に1GHzって書いてなかったん?
0035デフォルトの名無しさん
2006/10/23(月) 14:44:380036デフォルトの名無しさん
2006/10/23(月) 14:44:590037デフォルトの名無しさん
2006/10/23(月) 14:54:170038デフォルトの名無しさん
2006/10/23(月) 14:55:060039デフォルトの名無しさん
2006/10/23(月) 15:18:030040デフォルトの名無しさん
2006/10/23(月) 16:34:35書いてないです
>>36
間違えた答えで提出してしまったことです
>>38
出ましたね‥
クロックは教科書のその20ページ後ぐらいに初めてでてくるようです
0041デフォルトの名無しさん
2006/10/23(月) 16:42:540042デフォルトの名無しさん
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:22MOV D, -5
0045デフォルトの名無しさん
2006/10/23(月) 23:45:430046デフォルトの名無しさん
2006/10/23(月) 23:52:53クピュとはCPUのことです。
0047デフォルトの名無しさん
2006/10/24(火) 23:49:38label_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:368085CPUで
_ _
A←B・C+D ・ E (論理演算)
という問題なんですが、さっぱりわかりません。プログラムのキーポイントと一緒に解説をおねがいします。
0049デフォルトの名無しさん
2006/10/25(水) 04:02:46その形式ならサイズ指定してやればバイト/ワード/ロングワードのどれでもいける。
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キーポイント:何も無し
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詳しい解説付きでどうもアリガトウ御座います。
0053デフォルトの名無しさん
2006/10/25(水) 21:58:51オレは自力で覚えたから知らんが、全部、紙とか黒板で理論のみ習うわけ?
んなわけないと思うけど
デバッガで遊んでレジスタの変化とか見てれば、各命令の動作なんてすぐ覚えられると思うんだけど。。。
0054デフォルトの名無しさん
2006/10/26(木) 08:59:47アドレスへ分岐させる。その際に、復帰アドレスがr1レジスタに格納される)
を使って再帰的に以下のCプログラムをアセンブラにしたいのですが、
C言語を作るまでで若干力尽きております。ご教授いただければ幸いですorz
int func(int j){
if(j==0){
return j;
}
return j+func(j-1);
}
0055デフォルトの名無しさん
2006/10/26(木) 09:41:57gccがその環境にあるかしらんけどコンパイラオプションに
アセンブラコードをはかせるよう指定してみたらいかがかと。
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);
}
005654
2006/10/26(木) 11:07:08ご回答ありがとうございました。
gccってそんな機能があったんですねorz
使えると思いますので、学校に行ったら試してみたいと思います。
0057デフォルトの名無しさん
2006/10/26(木) 11:18:53というか、C言語をアセンブリ言語に落とすのがCコンパイラの仕事だが。
0059デフォルトの名無しさん
2006/10/27(金) 00:05:130060デフォルトの名無しさん
2006/10/28(土) 19:58:33VerilogHDLを用いた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:32CPU名を書いてないので答えられない。
0063デフォルトの名無しさん
2006/10/30(月) 23:29:490064デフォルトの名無しさん
2006/10/30(月) 23:33:560066デフォルトの名無しさん
2006/10/30(月) 23:48:08ほっとけばいいよ。
0067デフォルトの名無しさん
2006/10/31(火) 00:03:33前者はシーケンシャルに実行される、ってことは、代入するコードが生成される。
後者はプロセッサの初期化時に値がロードされる。
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でzlがレジスタっぽいし、分岐がbrってことは、AVRかな?
0070デフォルトの名無しさん
2006/10/31(火) 00:35:24「どっちがより痛い奴か」
の競争にしか見えません俺には。
0071デフォルトの名無しさん
2006/10/31(火) 00:42:26CPUと環境を明記してね。
0074デフォルトの名無しさん
2006/10/31(火) 12:10:50意味についてでなく
CPUが解らなければ
答えられないということを解らせなければいけなかった。
ということではないかな?
そういう流れだと思うが。
0075デフォルトの名無しさん
2006/10/31(火) 14:38:070076デフォルトの名無しさん
2006/10/31(火) 16:42:28開き直っちまうからこんなことになる
0077デフォルトの名無しさん
2006/10/31(火) 18:28:24FFFFFF00番地に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分岐命令の後ろに、nop入れろ
0079デフォルトの名無しさん
2006/11/01(水) 01:02:320080デフォルトの名無しさん
2006/11/01(水) 02:55:09そんなやつおらんやろー。
そもそも、架空のCPUコア乗せてるのが信じられない。
ARMや8051とかならまだしも。
0081デフォルトの名無しさん
2006/11/01(水) 04:27:470082デフォルトの名無しさん
2006/11/01(水) 10:35:080083デフォルトの名無しさん
2006/11/01(水) 18:28:18ソフトウエアでのエミュレータなら普通にアリだろ?
0084デフォルトの名無しさん
2006/11/01(水) 19:35:521.キーボードから上底、下底、高さを入力し、台形の面積をディスプレイに出力せよ。
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出来たから何って感じだし。
スレ違いだし。
0087デフォルトの名無しさん
2006/11/01(水) 23:21:520088デフォルトの名無しさん
2006/11/02(木) 02:18:04CPU名を明記するように。
0089デフォルトの名無しさん
2006/11/02(木) 07:31:46とりあえず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.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.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.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.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:170095デフォルトの名無しさん
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:06ttp://sohda.net/cygwin/treebbs/treebbs.cgi?kako=1&all=44&s=44#44
0097デフォルトの名無しさん
2006/11/03(金) 01:27:26ということはインストールが上手く行っていないのか…。
確かにインストールの途中で固まって以後すすまなくなってた。
アンインストールインストール…と繰り返すうちに訳が分からないことになってる…。
009895
2006/11/03(金) 03:32:32w32apiパッケージのlibuser32.aというのを入れれば動くという事は分かっても入れ方が分からない…。
他の質問者の人はインストールし直すと正常に動くようになったとあるけれど
自分の場合はインストールし直そうとするとほぼ確実に途中で固まってうまくいかない。
どうすればいいんだ…。
0099デフォルトの名無しさん
2006/11/03(金) 03:58:45どこでどう止まるの?
ファイルのダウンロード中?コピー中?
何のファイルでとまる?
010095
2006/11/03(金) 05:33:41ttp://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それは普通「正常に終了」とは言わないケド…
…でも何で止まるんだろ。
ごめん。訊ねたけど判らないっす。
0102デフォルトの名無しさん
2006/11/03(金) 10:25:04遣り方についてはスレ違いにつき割愛。
010395
2006/11/03(金) 15:18:10エラーメッセージが増えました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:330105デフォルトの名無しさん
2006/11/03(金) 18:03:540106デフォルトの名無しさん
2006/11/04(土) 02:02:32gccを介さず、素直にasとldを自分で呼び出して使う。
解決案その2
gccに-nostartfilesオプションを指定する。
あと、ソースは公開しよう。
0107デフォルトの名無しさん
2006/11/05(日) 17:31:28という問題が出ました。どなたかご教授下さい。
http://kjm.kir.jp/pc/?p=24382.jpg
0108デフォルトの名無しさん
2006/11/05(日) 19:01:28LC-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>どのような方法で実現されているのでしょうか?
いろいろ。
その実習のようにメモリ空間に周辺機器のI/Oをマッピングしたり、
CPUによってはI/O専用のアドレスを持ってるのでそこに配置したり。
0112デフォルトの名無しさん
2006/11/05(日) 23:17:04ありがとうございました。皆さん物知りで大変助かります^^;
0113デフォルトの名無しさん
2006/11/05(日) 23:34:200114デフォルトの名無しさん
2006/11/05(日) 23:38:30希望する情報を自分で探し出せない能力は
プログラマーに必要な素質がかけてるようなきガス
昔に比べりゃ、googleなんて便利なものがあって
なんで探し出せないか不思議だわ。
やる気ないとしか思えん。
0115デフォルトの名無しさん
2006/11/06(月) 00:26:040116デフォルトの名無しさん
2006/11/06(月) 11:43:24>I/O専用のアドレスを持ってるのでそこに配置
これ、理解してて書いてるならタダモノではない気配。
0117デフォルトの名無しさん
2006/11/06(月) 13:01:15昔8bit機いじってたヤツなら結構知ってるんじゃね?
0118デフォルトの名無しさん
2006/11/06(月) 14:57:020119デフォルトの名無しさん
2006/11/06(月) 19:07:07いや、君が何を言いたいのかそれだけじゃよくわからんが、
たぶん君が無知なだけだと思うよ。
0120デフォルトの名無しさん
2006/11/06(月) 21:09:35遅レスですみません、さきほど教授に聞いたら、問題は
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:460122デフォルトの名無しさん
2006/11/06(月) 21:46:12日本語大丈夫か?
>>120
そのLC3やらの言語と俺らが知っている一般的なアセンブラは必ずしも同じじゃないんだよ。
あと、その問題のどの辺りが分からんのかも教えてくれ。一から作らす気か?w
0123デフォルトの名無しさん
2006/11/06(月) 23:19:09ここは宿題が分からないときに質問するスレであって変わりに宿題してもらうスレじゃないんだよ。
誤解するな。
0124デフォルトの名無しさん
2006/11/06(月) 23:44:440125デフォルトの名無しさん
2006/11/07(火) 00:30:27IOマップドは普通「I/O専用命令」の下りがあるもんだ。
メモリマップドとの区別ついてないだろ?
あと>>110はDMAの可能性もある。
0126デフォルトの名無しさん
2006/11/07(火) 01:00:13何が言いたいねん。
>>111(俺じゃないが)は>>110に対するレスだよ。
その辺踏まえてるのかな。
0127デフォルトの名無しさん
2006/11/07(火) 01:27:360128デフォルトの名無しさん
2006/11/07(火) 01:33:460129デフォルトの名無しさん
2006/11/07(火) 03:13:34不勉強な人が不勉強な人にでまかせを教えるのはやめましょうw
最悪ですw
本当にどうもありがとうございました。
0130デフォルトの名無しさん
2006/11/07(火) 03:17:59ttp://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まず、負の数を表示すること自体ができるか(出力だけが間違ってる)、
次に、乗算でmulでなくちゃんとimulを使っているか(計算が間違ってる)、
この2つは大丈夫ですか?
と思ったが、
Nbitの整数同士を掛け算した結果の下位Nbitは、符号付きかどうかに関係ない
のだった。mul使っても普通は大丈夫だね。
0133デフォルトの名無しさん
2006/11/09(木) 01:29:152次元配列の値をアセンブラで出したいのですが、例えば
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掛け算もないCPUなの? Z80かなんかの8ビットCPUとか?
だとしても、その程度の話ならCで足し算で掛け算を実装してみればいいじゃん。
掛け算の両辺の大小見たりシフトで代用できないか検討したりするだけ。
#8ビットCPU用のCコンパイラのアセンブル出力覗いてみてもいいね。
0135133
2006/11/09(木) 17:18:45CPUはFPGAというのでしょうか?作ったら使えるのかもしれませんが残念ながら掛け算はありません。
大小を見るというのは繰り返し回数に持ってくる方の変数は小さい方がいいからということでしょうか?
シフトについても、シフトを使うことでサイクル数が少なくて済む処理があるということを
聞いたことがある程度なのですが、どういったアルゴリズムなのでしょうか?
3000*300を300000*3にするようなイメージでしょうか?
質問ばっかりになってしまって申し訳ないですorz
0136デフォルトの名無しさん
2006/11/09(木) 17:58:11A≒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:560138134
2006/11/09(木) 18:38:35FPGAか、納得。それじゃこったことは何もできないと思った方がいいねぇ。
#つーか、それこそノウハウの塊だから先人に教えを乞う方がよくね?
0139デフォルトの名無しさん
2006/11/10(金) 00:22:44CPUに関して勉強中なんですが、2バイトや4バイトでメモリに1回でアクセスするのに
番地は2や4の倍数である必要があるらしいんですが、なんでですか?
奇数アドレスの2バイトアクセスは、どの辺が困るのかわかりません。
CPUはARMです。
0140デフォルトの名無しさん
2006/11/10(金) 00:49:59こういう風に16byteのメモリがあったとする。
00──┐
04──└─→CPU(アドレス00から4byte読む)
08──
12──
00──
04────→CPU(アドレス04から4byte読む)
08──
12──
こういう配線になってたらアドレス02から4byte読めないだろ?
こういう制限が出てしまうくらい配線が大変だということだ。
0141デフォルトの名無しさん
2006/11/10(金) 01:16:270142139
2006/11/10(金) 10:15:081バイト用、2バイト用、4バイト用の配線があるというわけですね?
CPUじゃなくてバスの制約に引っかかるんですか。 ありがとうございました。
0143デフォルトの名無しさん
2006/11/10(金) 14:28:28いや、たとえば4バイト境界から一度に4バイト読む配線だけ用意した場合、
02番地から4バイト読む時は2回読んでくっつけなくちゃいけない。
読み出しのコストが倍かかっても読んでくれるCPUと、「それ、おかしいだろ」
ってエラーにするCPUとがある。
0144デフォルトの名無しさん
2006/11/10(金) 23:56:47「ちょっと!メモリの読み出しに2回もコストをかけたら、一定速度での命令実行なんて出来ないじゃない!」
「私に読んで欲しかったら、アドレス境界を4の倍数に合わせなさい!さあ、はやくっ!」
と文句を言ってしまうのだ。許せ。
0145139
2006/11/11(土) 00:00:04>一度に4バイト読む配線だけ用意した場合
これはメモリスペックで言うバス幅が32ビットであるということでしょうか?
んでこれが境界を決めているというわけですか?
バス幅が16bitなら2バイト毎のアドレス、64bitならば、8バイト毎のアドレス、みたいな感じで・・
0146デフォルトの名無しさん
2006/11/11(土) 00:51:33>メモリスペックで言うバス幅が32ビット
CPUアーキテクチャでいうバス幅が近いかな、とおもう。
最近のCPUはキャッシュや内部RAM/ROMを持ってたりするから
単純にこ〜だ、とは言えない。
設計する時に決める事、ってかんじ。
バス幅128ビットにしました、けど互換性確保したいから
4バイト境界です、って可能性もある。
0147デフォルトの名無しさん
2006/11/11(土) 08:12:4716ビットCPUとは言え、メモリが今とはビット単価も占有面積も違う時代。
まして8ビットバス版の8088の存在もある。当然の如く命令長は1バイトからの可変長とされた。
そこではたと気付く。「命令長が奇数だったら、次の2バイト命令がワード境界を跨ぐじゃん。」
斯くして現在にまで続く可変命令長の際物CPUができあがったというわけ。
一方Motorolaは68000の開発に当たって素直に命令長を2の倍数のみとした。
そのために3ビットイミディエイト加減算なんて命令までできることになったが、
それはまた別のお話。
0148デフォルトの名無しさん
2006/11/11(土) 14:15:42IA-32 on NASM です
サブルーチンの先頭でよく見かける
push ebp
mov ebp, esp
は、何をしてるんでしょうか?
ebp を push する意味って esp を ebp に mov するためですよね?
この mov って必要なんですか?
引数とからんでる気はするんですが・・・
教えてください><
0149デフォルトの名無しさん
2006/11/11(土) 14:16:340150デフォルトの名無しさん
2006/11/11(土) 14:25:31どうせこんなスレでまじめに聞いてやしないだろうけど、
あんまりこのスレの連中のいうこと真に受けない方がいいよ。
俺も本当の理由をソース付きで答えられるわけじゃないけど、
それは恐らくCPU側の都合というよりもアドレスをデコードする側(つまりメモリとか
デバイス)側の問題でしょう。
任意アドレス指定でアドレスされても常にバス幅のデータを正しく吐き出すような
回路が複雑になることってなんとなく想像できるでしょ。
0151デフォルトの名無しさん
2006/11/11(土) 14:46:38ttp://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:38thx!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
0153139
2006/11/11(土) 15:10:34>バス幅128ビットにしました、けど互換性確保したいから
>4バイト境界です、って可能性もある。
メモリのバス幅が128ビットで、CPU−メモリ間のデータバス幅が32ビットという場合ですね?
データバス幅を32ビットにすると、メモリアクセスは、4の倍数のアドレスから4バイトだけ、
という方法しか許さなくなるわけですか。
>>150
結構収穫ありました。 ググってもさっぱりわかりませんでしたし。
>任意アドレス指定でアドレスされても常にバス幅のデータを正しく吐き出すような
>回路が複雑になることってなんとなく想像できるでしょ。
回路のことはさっぱりわかりませんで、想像出来ませんでした。
0154デフォルトの名無しさん
2006/11/11(土) 15:15:360155デフォルトの名無しさん
2006/11/11(土) 15:28:22>147
>150こそ滅茶苦茶だから。
0156デフォルトの名無しさん
2006/11/11(土) 15:34:07ハードにその機能があるかどうか。
0157デフォルトの名無しさん
2006/11/11(土) 16:09:41何が言いたいんだろうw
0158139
2006/11/11(土) 16:10:03メモリに
・2の倍数のアドレスから2バイトアクセスする
・4の倍数のアドレスから4バイトアクセスする
みたいな機能があるってことですか?
0159デフォルトの名無しさん
2006/11/11(土) 16:20:19古典的なISAバスでも何でもいいから、メモリやデバイスのアドレスデコード回路が
どうなってるかを調べれば自ずとわかるよ。
0160デフォルトの名無しさん
2006/11/11(土) 16:48:39そう作るのが大変だから今の設計はほとんどそんな風に
作ってないって話だろうが。
メモリ読みだし単位は決まってた方が作るのに便利って事。
大体から、昔から1ビット単位じゃなくて1バイト単位でアクセスするって
お約束もあっただろ?
0161デフォルトの名無しさん
2006/11/11(土) 16:52:18素直に並べりゃ絶対にアドレス境界を跨がない読み出しになるんだから、
奇数アドレスから読めないことで一体何が困るのか逆に理解できない。
0162デフォルトの名無しさん
2006/11/11(土) 17:00:000163デフォルトの名無しさん
2006/11/11(土) 17:40:450164139
2006/11/11(土) 17:44:07>>140を見る限り、境界はメモリの構造によるものと考えていいんでしょうか。
0165デフォルトの名無しさん
2006/11/11(土) 18:25:35っていうかどうせHW勉強する気がないんだろ?
だったらそういうことにいちいち疑問を持たず、そういうものだと思う態度が正解。
勉強する気もないのにいちいちドチテ坊やするのは愚の骨頂っていうんだよ。
0166デフォルトの名無しさん
2006/11/11(土) 18:47:20>147も書いているが、各々のプロセッサ設計段階での事情を反映しているだけ。
制約云々は二の次。
0167デフォルトの名無しさん
2006/11/11(土) 18:53:01それ優先順位としては逆だと思いますが。。
0168デフォルトの名無しさん
2006/11/11(土) 18:55:52どんなハードにする必要があるのか考えれば自明だろうに。。
データバス8本ごとにアドレスデコーダ付けるような冗長な回路が一つの方法だが、
そういう冗長な回路が必要になるだろ
0169デフォルトの名無しさん
2006/11/12(日) 10:42:23設計・製造コストと機能のトレードオフは、工業製品としてはあたりまえ。
0170デフォルトの名無しさん
2006/11/12(日) 21:16:180171デフォルトの名無しさん
2006/11/13(月) 01:52:200172デフォルトの名無しさん
2006/11/13(月) 09:19:40この状態から命令・それに伴う回路を最低ひとつ分加えて、どんなプログラムでもいいので
この状態で流すより実行サイクル数が短くて済めばそれで正解という課題です。
左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失礼しました。誘導ありがとうございます。
0175デフォルトの名無しさん
2006/11/15(水) 22:35:170176デフォルトの名無しさん
2006/11/15(水) 23:17:150177デフォルトの名無しさん
2006/11/15(水) 23:20:050178デフォルトの名無しさん
2006/11/15(水) 23:24:35data1 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:57LD 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
0180175
2006/11/16(木) 00:02:060181デフォルトの名無しさん
2006/11/17(金) 23:42:48R2<-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:16R1 ← 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�dです、すみません
自己解決しました
0184デフォルトの名無しさん
2006/11/18(土) 17:14:07お願いします。
授業ではttp://www.k.hosei.ac.jp/~i05r4102/までやりました。
8
0185デフォルトの名無しさん
2006/11/18(土) 17:33:210186デフォルトの名無しさん
2006/11/18(土) 19:54:00http://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:130190デフォルトの名無しさん
2006/11/22(水) 11:11:59げー、VC2005必須かよ…
0191デフォルトの名無しさん
2006/11/23(木) 11:24:170192デフォルトの名無しさん
2006/11/23(木) 12:35:200193デフォルトの名無しさん
2006/11/23(木) 14:47:37これって使えるん?
0194デフォルトの名無しさん
2006/11/24(金) 00:43:01irmovl$15,%ebx
rrmovl%ebx,%ecx
loop:
rmmovl%ecx,-3(%ebx)
addl%ebx,%ecx
jmploop
このアセンブリプログラムをアセンブルすると、どんなバイト列が出てくるか。
y86シミュレータ
0195デフォルトの名無しさん
2006/11/24(金) 01:11:530196デフォルトの名無しさん
2006/11/24(金) 01:45:200197デフォルトの名無しさん
2006/11/24(金) 02:00:36ml.exe にリネームすれば普通に使える。
ただしそれだけじゃリンカもライブラリもないから
本当に「アセンブル出来るだけ」になるがな。
0198デフォルトの名無しさん
2006/11/25(土) 15:06:41�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にらめっこして考えてくれ。
REPNE SCASBで終了する時の条件は2つ。
ECX=0になった時かZF(ゼロフラグ)が立った時。
ALの内容が見つかればZF=1、見つからなければZF=0になるんだろう?
REPNE SCASB
JNZ L1
見つかったときの処理
JMP LE
L1:
見つからなかったときの処理
LE:
ここまででif〜elseは表せると思うけど。
68系とその派生系の石しか扱わないから間違ってるかもだけど。
0201199
2006/12/01(金) 10:18:51何とかIfelse文は出来ました。
ですが、現在は片方が負数の足し算に悩んでいます。
正数同士なら
mov bh, 0
mov ecx, 70
mov esi, 69
mov edi, 70
addition:
mov ah, 0
mov al, var1[esi]
add al, bh
aaa
mov bh, ah
or bh, 30h
add al, var2[esi]
aaa
or bh, ah
or bh, 30h
or al, 30h
mov sum[edi],al
dec esi
dec edi
loop addition
mov sum[edi], bh
と書けたのですが、片方が負数の時のも物が書けません。
もしvar1の値が負の数だったら、一度正数に直してvar2 - var1の形に直そうとしたのですが、
aasの使い方が分かりません。
助けて頂けると幸いです。
0202デフォルトの名無しさん
2006/12/01(金) 14:40:56AAS - アンパックBCDの減算結果ALを補正する。繰り下がりが発生するとAH <- AH - 1 CF=1 AF=1
ADDの時みたいに下桁からSUBしてってAASで補正してけばいいんじゃない?
0203199
2006/12/01(金) 15:14:05ですが、Var1<Var2の場合は答えがおかしくなります。
CMP、jmp、などを使って別の所に飛んでから別の計算式を書いた方が良いのでしょうか…。
0204デフォルトの名無しさん
2006/12/06(水) 18:58:54どのようなc言語プログラムをコンパイルすると、ここで示したアセンブラ言語のプログラムになるか
示せ。また、c言語プログラムとアセンブリ言語の対応関係を示せ。
と言う宿題を出されました。どなたか教えてください!
かなり初歩的なのかもしれませんが;
0205デフォルトの名無しさん
2006/12/06(水) 19:00:30fibo:
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$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:020208デフォルトの名無しさん
2006/12/07(木) 10:40:36画面から3桁以内(符号なしビット)の2つの数字と、1つの演算子を入力して四則演算を行い、結果を画面に表示するプログラムです。
演算子は+, -, *, /を使います。
よろしくお願いします。
0209デフォルトの名無しさん
2006/12/07(木) 10:49:260210デフォルトの名無しさん
2006/12/07(木) 11:05:04どうやって作ればいいのかがわからないんですが。
例えば、GR1に何を入力したかをチェックするやりかたとかです。
CAP GR1、MOJI
JZE TADASII
正しいときにジャンプする
正しくなければ通過とかの部分です。
わかりにくくてすいません。
0211C++プログラマ
2006/12/07(木) 21:28:30コンパイラ 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小手先の愚作を労せず、最適化はコンパイラに任せなさい。
上の条件なら例えばif (x > 0) {...; } else {...;}とすれば適当なコードを出してくれるだろうし、
下の処理ならturn *= -1と書かずにturn = -turnすればよかろう。
尤も、その程度の内容だとどのように書いたところで処理速度が問題になるとも思えないが。
#もし本当に処理速度が問題になるのなら、プロファイリングとアセンブラ出力を読む作業は必須だ。
0213211
2006/12/07(木) 22:05:41アセンブラのコードは読めないので、これから勉強してみます
スレ違いすいませんm(_ _)m
0214デフォルトの名無しさん
2006/12/07(木) 23:04:15MSXとかCPUが極度に貧弱なマシンでもないかぎり、気にするような事じゃ無いとは思うけど。
0215211
2006/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:510218デフォルトの名無しさん
2006/12/08(金) 18:39:19質問は日本語で頼むよ。
マジメな話、あんた自分が書いたその文章、自分以外の他人が読んで意味がわかると思うか?
エスパーを期待しても無駄だよ。
ここはムーの投書欄じゃねえからな。
0219たくや ◆TakUyA81FM
2006/12/08(金) 18:42:53dw process
dw 60h
とか
mov ax,60h
mov ds,ax
mov si,mes
processとかmesのアドレス指定で0600h分足されてる気がするんだけど・・・
もしかして勘違い?
0220デフォルトの名無しさん
2006/12/08(金) 19:01:000221デフォルトの名無しさん
2006/12/08(金) 19:05:340222デフォルトの名無しさん
2006/12/08(金) 19:08:240223デフォルトの名無しさん
2006/12/08(金) 19:15:41どういう処理を行ってる(と思う)のか、ソースを順に説明してみてくれないか?
とりあえず、おまえさんがどこで思い違いをしているのか理解できんとエスパーでも無い限り誰も回答できんと思うよ
0224デフォルトの名無しさん
2006/12/08(金) 19:31:50DFをクリアして
スタックを使えるように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:200226デフォルトの名無しさん
2006/12/08(金) 19:41:530060h:processにジャンプ ←ここの0060hが何で必要なのかがわからない
dsに0060hを入れる
0227デフォルトの名無しさん
2006/12/08(金) 20:10:36コピーやジャンプ自体が不要とかいうんだったらまだ質問の意図が理解できるんだが。
>←ここの0060hが何で必要なのかがわからない
何で不要だと思うんだ?
それを無くしたらどうなると思う?
0228デフォルトの名無しさん
2006/12/08(金) 20:31:52jmp processじゃあだめなんですか?
0229デフォルトの名無しさん
2006/12/08(金) 20:40:51これが何をコピーしているか具体的にわかってるよね?
0230デフォルトの名無しさん
2006/12/08(金) 20:44:310231デフォルトの名無しさん
2006/12/08(金) 20:58:44次に読み込むプログラムをメモリの07c00hに置くために
メモリの00600hに位置を変えるんですよね?
processとかの位置も変わるんですよね?
でも、jmp processじゃあprocessには飛べないんですか?
0232デフォルトの名無しさん
2006/12/08(金) 21:14:230233デフォルトの名無しさん
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↑でソースを見ながらニーモニックの意味を調べてちょっと勉強してたんですけど
jmpのセグメントってCSなんですかぁ
ラベルの位置もよくわかっていませんでした
CSの動きについてもあまりよくわかってないんでちょっと勉強してきます・・・
ありがとうございました
0235デフォルトの名無しさん
2006/12/08(金) 22:41:23・・・んなわけないよなぁ。
0236デフォルトの名無しさん
2006/12/10(日) 00:26:17完全にとは云わないが、書ける筈だけど。
セグメント・レジスタも有ることだし。
jump命令は、普通セグメント内ジャンプしか
使わないだろ。
0237デフォルトの名無しさん
2006/12/13(水) 21:32:51グローバル変数や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:47C言語つーのはgccのってことでいいんかい?
0240237
2006/12/13(水) 22:49:56gccでもVCでもWindows上で動作するんであればおkです。
0241デフォルトの名無しさん
2006/12/14(木) 21:13:48同じ内容の数値計算をさせた場合Fortranとアセンブラじゃどちらが速いですか?
0242241
2006/12/14(木) 21:15:020243デフォルトの名無しさん
2006/12/14(木) 21:19:56=プログラミング言語:コンパイル:コンパイラ
0244デフォルトの名無しさん
2006/12/14(木) 21:28:47本質的にはアセンブラが負けることはないが、
実際にはそうもいかないのが難しいところ。
結局はコードを書く人の能力による。
0245デフォルトの名無しさん
2006/12/14(木) 21:36:140246デフォルトの名無しさん
2006/12/14(木) 21:39:36コンパイラの宿題質問スレ
0247デフォルトの名無しさん
2006/12/14(木) 21:42:130248デフォルトの名無しさん
2006/12/14(木) 21:44:40アセンブリ言語のことだからな。
0249デフォルトの名無しさん
2006/12/15(金) 00:14:46石によるけどさ。
0250デフォルトの名無しさん
2006/12/15(金) 11:19:28digitsDCB"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ヒントの所に回答そのものが日本語で書いてあるのに。
0252CASL
2006/12/15(金) 22:18:59を完成してほしいのは私だけ?
0253デフォルトの名無しさん
2006/12/16(土) 01:37:40ifで使われている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;
}
0254237
2006/12/16(土) 14:10:03レスありがとうございます。
まさにコレのようです。
当方の環境(Visual Studio 6.0)ではエラーがでるので、
修正しつつ参考にさせて頂きたいと思います。
数日間探しても見つからなかったのでとても助かりました。
ありがとうございます。
0256デフォルトの名無しさん
2006/12/19(火) 22:23:32良い入門書は無いですか?
高級言語プログラマのためのアセンブラ入門と
http://www5c.biglobe.ne.jp/~ecb/assembler/assembler00.htmlのページを
見ながら勉強しようと思ったのですが、高級言語プログラマのためのアセンブラ入門は
なんか辞典みたいな感じで、アセンブラのページを読むと
なんとなくわかるにはわかるけど、なんでセグメント全部同じ名前にしてんだろ
とか、21hみたいな命令の意味とか、よくわからないのがやっぱ多いです。
で、やっぱり入門書を買おうと思うのですが、お勧めを教えてください。
CPUはIntel(R)Celeron(R)Mです。
0257デフォルトの名無しさん
2006/12/20(水) 00:38:54>なんでセグメント全部同じ名前にしてんだろ
EXEファイルでは無くて、COMファイル作る為?
>21hみたいな命令
「int 21h」これは、MS-DOSのシステム・コールを
呼出す為だと思う。
0258デフォルトの名無しさん
2006/12/20(水) 19:38:40LOOP 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「JPL LOOP」の「JPL」が悪いみたいだけど。
JPLって、Jump largeの意味?
「JPLE LOOP」とすべきでは。
JPLEは、Jump large or equal。
0260258
2006/12/21(木) 01:04:18エラーが出てきます
0261デフォルトの名無しさん
2006/12/22(金) 00:19:46ゴメン、一応考え方として書いただけで、
CASLはやった事がない。
無い場合は、その命令と等価となるような
処理に作り換えるとか。
0262デフォルトの名無しさん
2006/12/31(日) 23:33:16とりあえずi386以降のニーモニックは分かるのですが、MASMの擬似命令とか
宣言の使い方を例題で詳しく説明したサイトや本のお勧めはありますか?
セグメントがどうこうとか考えずにNASMで楽してたので、MASMは全然分かりません。
0263デフォルトの名無しさん
2006/12/31(日) 23:46:410264デフォルトの名無しさん
2006/12/31(日) 23:51:180265デフォルトの名無しさん
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:20Sparc 知らんから間違いの指摘はできないけど、
デバッガでステップ実行してみればいいんじゃないか?
0267デフォルトの名無しさん
2007/01/02(火) 22:48:06.umulが%o0 * %o1の結果を、%o0 %o1のどちらかに代入してると思うのだが、
もう一方も何かしらの値が代入されているということはないかい?
あと、それだとxにxをy回掛けることになって、x^(y+1)になると思うのだが?
0268265
2007/01/02(火) 23:55:07どうもアドバイスありがとうございます.
指摘された通り%o1が.umulを実行した後に0になっていたのが原因でした.
かける回数も直せました.
本当にありがとうございました.
0269デフォルトの名無しさん
2007/01/03(水) 22:03:30SPIMでシュミレーションしてるのですが…
解決策があればご伝授ください。
プログラムソース: http://www.uploda.org/uporg641230.asm
0270デフォルトの名無しさん
2007/01/03(水) 22:39:340271デフォルトの名無しさん
2007/01/03(水) 23:45:22漏れには必要無いことが分かったので消した
0272デフォルトの名無しさん
2007/01/04(木) 01:26:18俺ならば、「addi」みたいな命令は、registerを初期化してから
使用するけど。
0273269
2007/01/04(木) 02:01:06なんか__startに異常があるみたいなメッセージが出てくるのですがそれがよくわかりません。
loadすら出来ないです。
0274デフォルトの名無しさん
2007/01/04(木) 03:48:380275デフォルトの名無しさん
2007/01/04(木) 05:19:40トラップハンドラを読み込まないか、
__startではなくmainにすれば良いと思うよ。
0276269
2007/01/05(金) 03:30:24ありがとうございます。
無事に実行できました。
ものすごく低レベルな質問をしているのかもしれませんが、
プログラムのmain以下14行目の
lw $t4, 0($a2)で、
その上のaddの行実行前に$t8に00000000、$gpに10008000が入ってる状態です。
addにより$a2にはその和の10008000が入るというのは理解できるのですが、
その後のlwの行の操作で
$t4に00000063が代入されるのが何故か分かりません。
どうかご教授ください。よろしくお願いします。
(プログラム >>277-278)
0277269
2007/01/05(金) 03:32:24.data0x10008000
.word100
.word99
.word98
(以下.word 0まで続きます)
.text
.globl__start
__start:
addi$t0, $zero,0
addi$t2, $zero,100
addi$t7, $zero,4
addi$t9, $zero,1
sub$t0, $t2, $t9
loopi:
slt$t3, $t0,$zero
bne$t3, $zero,progend
addi$t1, $zero,0
0278269
2007/01/05(金) 03:32:53loopj:
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
0280269
2007/01/05(金) 03:53:20申し訳ないです。。さっぱり…
なぜ63が出てくるのかという点から掴めませんorz
加えて、質問箇所の下のadd $a3. $a2, $t7では
$a2に10008000, $t7に4が入ってるので$a3は10008004になったのですが
その下のlwで$t5に何故63が入るのでしょう…?
0281デフォルトの名無しさん
2007/01/05(金) 09:35:280282269
2007/01/07(日) 07:15:2510008000の内容は64(100)だと思うのですが、
何故63が入るのでしょう…?
0283デフォルトの名無しさん
2007/01/07(日) 07:37:141008004の内容が63(99)だから。
sw$t5, 0($a3)
$a2じゃないぞ、$a3だぞ?
0284デフォルトの名無しさん
2007/01/07(日) 07:37:590285デフォルトの名無しさん
2007/01/08(月) 02:25:48その上のaddの行実行前に$t8に00000000、$gpに10008000が入ってる状態です。
addにより$a2にはその和の10008000が入るというのは理解できるのですが、
その後のlwの行の操作で
$t4に00000063が代入されるのが何故か分かりません。
0286デフォルトの名無しさん
2007/01/08(月) 02:35:270287ふぃb
2007/01/11(木) 20:48:30MacOSでアセンブラを勉強し始めたのですが、再帰関数のところで
フィボナッチ数列の実装ができません・・・
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???
0289デフォルトの名無しさん
2007/01/11(木) 22:00:41PCの機種名でもアセンブラの名前でも良いから書いてみそ
0290デフォルトの名無しさん
2007/01/12(金) 00:11:27自分が使ってるマシンのMPUもわからないなんて・・・。
0291デフォルトの名無しさん
2007/01/12(金) 00:27:580292デフォルトの名無しさん
2007/01/12(金) 10:21:56どっちか好きな方を選んでくれ。
0293ふぃb
2007/01/12(金) 13:45:18すみません。アセンブラはgccです。
>292
スタックフレーム勉強します><
0294デフォルトの名無しさん
2007/01/12(金) 18:10:410295デフォルトの名無しさん
2007/01/12(金) 18:24:560296デフォルトの名無しさん
2007/01/12(金) 18:29:290297ふぃb
2007/01/15(月) 13:08:49すいません
0298デフォルトの名無しさん
2007/01/18(木) 14:48:3915-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-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初心者でも何でもいいけど、処理系(CPU,アセンブラ)くらい書かないとエスパーしか答えられないよ。
0301デフォルトの名無しさん
2007/01/18(木) 21:06:16問16は問題文が欠けてないか?
せめて何を目的にしたプログラムかは書くべきだと思うんだが。
0302デフォルトの名無しさん
2007/01/19(金) 02:27:35JMI 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:22CMNは符号を反転させて比較するものですよね?
たとえば r0番地に3、r1番地に-5 があるとします。
そして
CMN r0,r1
と書いたらどっちの符号が反転されるんですか?
両方されたら意味ないですよね?
お願いします!!!
0304デフォルトの名無しさん
2007/01/21(日) 18:35:32ヒント:ステータスレジスタ
0305ゆー
2007/01/21(日) 18:40:29のことですか?あまり詳しくないのでよくわかりません・・・
0306デフォルトの名無しさん
2007/01/21(日) 19:50:47それをもらってきてよく読むように。
まず、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:05http://www.jp.arm.com/document/manual/mdl.cgi
0309ゆー
2007/01/21(日) 21:11:22ありがとうございます。
0310ゆー
2007/01/21(日) 22:58:25MOVとMOVSの違いがいまいちわかりません。
マニュアル見てもよくわかりません↓
お願いします><
0311デフォルトの名無しさん
2007/01/22(月) 01:41:39今アーキテクチャリファレンスマニュアルひけないんで代わりのポインタ張っとく。
ttp://www.bomber.co.jp/chaola/docs/ARM/inst_ARM.html#5.1
MOVはシフト代わりに使えるから、その用途で使ったとき一緒に
ステータスレジスタを更新して欲しい場合がある。そのときMOVSを使う。
0312デフォルトの名無しさん
2007/02/12(月) 16:42:41BLEとBGTの意味がわかりません。
どういう意味でしょうか?
0313デフォルトの名無しさん
2007/02/12(月) 16:57:12ニモニックセット依存。
恐らくは、前者はbranch if (register) less than or equal to (operand)の意で
後者はbranch if (regster) greater than (operand)の意だろう。
0314デフォルトの名無しさん
2007/02/12(月) 17:12:270315デフォルトの名無しさん
2007/02/15(木) 15:09:01C言語のprintf()は、printf("10\n")ともprintf("%d\n#",10)とも書くことが
できる。つまり、引数の数はいくつあってもよい。このようなサブルーチン
を実現するには、サブルーチンprintfをどのように記述し、どのようにして
呼び出せばよいだろうかっていう問題です。
よくわかりません。
0316デフォルトの名無しさん
2007/02/15(木) 15:29:46int 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アセンブラ言語でどのように書けばよいかっていう問題です。
0318デフォルトの名無しさん
2007/02/15(木) 16:11:42vsprintf(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:1468HC11で8BIT、MPUなのですが、
逆アセンブラがありません。
ダウンロードサイトに、DOS環境で動くものはあるのですが、
使い方がわかりません、
アセンブルする方法教えてください、初心者ですみません
0321デフォルトの名無しさん
2007/02/19(月) 12:34:45初心者だから知らなくても仕方ないが、逆アセンブラがなくてもアセンブラがあればアセンブルすることは可能だ
0322デフォルトの名無しさん
2007/02/19(月) 13:40:24レスありがとうございます
プログラムが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> どうしたら、ふるいMPUなのでコード表もありません、
英語でいいならフリースケール・セミコンダクタの英語サイトに行けば無料配布してるぞ。
ProduntsからHC11ってのを選べばいろいろ出てくる。
0325デフォルトの名無しさん
2007/02/19(月) 20:17:100326デフォルトの名無しさん
2007/02/20(火) 04:56:388bitのソフトなんてちっちゃいんだから、作っちゃったほうが手間要らないのでは?
0327デフォルトの名無しさん
2007/02/20(火) 06:22:06問題は、今時5.25"を読める環境がないことだなw
勉強がてら、自分で作るのお勧め。
なーに、バイナリモジュールを16進ダンプかHEXフォーマットかSフォーマットにしてやって、
それを入力に使えばスクリプト形言語でちょちょいのぱーだよ。
0328デフォルトの名無しさん
2007/02/20(火) 13:47:34>>327
ご指導ありがとうございます
初心者すぎて、ちょっと無理みたいです、
データアップロードしますので、どなたかお願いします
0329デフォルトの名無しさん
2007/02/20(火) 18:57:410330デフォルトの名無しさん
2007/02/21(水) 03:11:50アップロードします
http://up.kabubu.net/cgi/up2/upload.php
ファイル名 ”68hc11バイナリ
よろしくお願いします。
0331デフォルトの名無しさん
2007/02/21(水) 03:15:42ファイル名”バイナリーファイル68hc11”でした
0332デフォルトの名無しさん
2007/02/21(水) 20:36:21これってプログラムじゃなくて何かのデータなんじゃ・・・?
0333デフォルトの名無しさん
2007/02/22(木) 00:19:170335333
2007/02/22(木) 06:43:4232KBのうち、オフセット0x1d1cから0xffが集中して入っているし、
オフセット0x20e0からは3バイト+1-2バイトのタグ型データ構造に見えるし、
他にもいかにもデータって感じでバイト列が並んでいるがね。
0336デフォルトの名無しさん
2007/02/22(木) 13:59:22全部Bxxとかの条件分岐だけで飛んでたりしたら嫌だなぁ。
眺めてるとだんだん無圧縮のスプライトパターンデータとかに見えてくる。
これの出所ってどこ?
0337デフォルトの名無しさん
2007/02/23(金) 02:33:30ボッシュの8ビットCPUです。
なんとかなりませんか?
0338デフォルトの名無しさん
2007/02/23(金) 02:36:330339デフォルトの名無しさん
2007/02/23(金) 03:00:020340デフォルトの名無しさん
2007/02/23(金) 03:29:25エンジンコントロール用みたいです、
0341デフォルトの名無しさん
2007/02/23(金) 09:22:12もしそうなら暗号化キーがなきゃお手上げ。
0342デフォルトの名無しさん
2007/02/23(金) 12:29:26逆アセンブルしたソースを人が読める形に修正する、なんて殆どの場合不可能だよw
可能な場合なんてむしろ例外的。
それは人的資源の質や量の問題と無関係に、ね。
0343デフォルトの名無しさん
2007/02/23(金) 12:53:31>>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暗号キーは無いみたいです、
土日でイロイロ調べてみます、
お世話になるかもしれませんがよろしくお願いします
0346デフォルトの名無しさん
2007/02/24(土) 18:09:350347デフォルトの名無しさん
2007/02/25(日) 05:15:02ハンドアセンブルしようとデータシート探しても見つからず、、、、
鬱
0348デフォルトの名無しさん
2007/02/25(日) 17:33:23何の罪になると言うんだ?
0349デフォルトの名無しさん
2007/02/25(日) 18:54:54逆アセ自体を禁止しているものであれば、、ということだろう。
0350デフォルトの名無しさん
2007/02/25(日) 20:49:28少なくとも「是非やってください」と言うところはない。
0351デフォルトの名無しさん
2007/02/26(月) 08:27:27法律で禁止されてるのを破るのが犯罪。
0352デフォルトの名無しさん
2007/02/26(月) 21:32:320353デフォルトの名無しさん
2007/02/26(月) 23:27:06間違ってますよ、その認識。
0354デフォルトの名無しさん
2007/02/27(火) 10:08:41よければ詳しく。
0355デフォルトの名無しさん
2007/02/27(火) 13:18:380356デフォルトの名無しさん
2007/02/27(火) 16:23:38関数を書きたいです。 $a0に変換されたストリングを保管するアドレスが渡されるという前提です。
0357デフォルトの名無しさん
2007/02/27(火) 16:24:240358デフォルトの名無しさん
2007/02/27(火) 18:08:50アセンブラの勉強のために、質問してただけなんですけど。
大丈夫ですよね、、、、、
で、結果報告です、
ハンドアセンブラしようとデータシート探しましたが見つからず
おまけに、68hc11ではなくて、6803?の疑問が浮上しました
1993年に68hc11発売されていましたか?教えてください
0359デフォルトの名無しさん
2007/02/27(火) 18:42:221984年発表。
0360デフォルトの名無しさん
2007/02/27(火) 23:17:56a=b+cを実現するためのアセンブラを示し、その横にマシン語を示すこと
ただし、aは100h番地、bは10h番地、cは20h番地に割り当てられているとする(hは16進数の表現の意味)
おねがいします
0361デフォルトの名無しさん
2007/02/27(火) 23:26:29まったく・・・
犯罪:罪を犯すこと。また、犯した罪。
罪:法律的・道徳的・宗教的な規範に反する行為。など
つまり、違法かどうかと犯罪とは必ずしも対ではない。
0362デフォルトの名無しさん
2007/02/28(水) 00:11:29激しくスレ違いだけど、契約って行為そのものが法律行為だから
これを履行しないことは違法性を構成するに決まってるじゃんw
っていうか、法的拘束力のない契約にそもそも何の意味があるんだよw
0363デフォルトの名無しさん
2007/02/28(水) 00:38:19契約は、必ずしも法律行為ではないよ。
0364デフォルトの名無しさん
2007/02/28(水) 04:19:47素人が趣味で解析したがるのは迷惑。
自分のマニアっぷりを自慢するために解析結果を公開したりするし。
0365デフォルトの名無しさん
2007/02/28(水) 04:23:00心配ならメーカに問い合わせたら?
つーか、アセンブラの勉強のためなら逆アセンブルするのは無意味だよ。
前から何人も書いているけどコード部とデータ部の区別やら環境やらが判らんと意味を為さないし。
そんなことよりも、アセンブラの勉強のためなら素直にアセンブラで書かれたソースを読めばいいじゃない。
0366デフォルトの名無しさん
2007/02/28(水) 05:45:41; 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ありがとうございます!
とても助かりましたー
0368デフォルトの名無しさん
2007/03/02(金) 19:32:51アップロードお願い
0369デフォルトの名無しさん
2007/03/02(金) 20:04:420370デフォルトの名無しさん
2007/03/03(土) 02:29:30オペコードマップ
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ってことで、ここからオペコードマップにも命令リストにもアクセスできる。
ttp://home.earthlink.net/~tdickens/68hc11/docs_references.html
0373デフォルトの名無しさん
2007/03/04(日) 23:58:34今週は少し進みましたが、、、、、
逆アセンブラソフトほしいn
こういうソフト見つけましたが使えますかねー?
http://down.upsdn.net/html/1/1.html
0374デフォルトの名無しさん
2007/03/05(月) 10:51:160375デフォルトの名無しさん
2007/03/05(月) 10:52:01逆アスくらい自力でできるだろうよ。
って、元辿って読んだらリバースエンジニアリング目的かよ。
0376デフォルトの名無しさん
2007/03/05(月) 10:56:370377デフォルトの名無しさん
2007/03/07(水) 03:41:12修正お願いします。。
(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:51LOOP: 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:590380デフォルトの名無しさん
2007/03/07(水) 06:17:370381デフォルトの名無しさん
2007/03/07(水) 11:38:130382デフォルトの名無しさん
2007/03/07(水) 11:49:44で、宿題は?
0383デフォルトの名無しさん
2007/03/07(水) 16:41:430384デフォルトの名無しさん
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:270386デフォルトの名無しさん
2007/03/07(水) 23:28:04CPU壊れてるんじゃね?
0387デフォルトの名無しさん
2007/03/07(水) 23:28:19Z80?
>>385
A=0で立たないフラグはもはやゼロフラグじゃないだろw
0388デフォルトの名無しさん
2007/03/08(木) 04:19:400389デフォルトの名無しさん
2007/03/08(木) 05:23:49アセンブルしたコードを貼って味噌。HEX出力でもバイナリダンプでもいいから。
#つーか、なんでjr使わないでjp使っているんだろ。
0390デフォルトの名無しさん
2007/03/08(木) 07:25:450391デフォルトの名無しさん
2007/03/08(木) 07:34:53#8080は互換性あるけど、8085は(8085で追加されたインストラクションが)互換性ないし。
0392390
2007/03/08(木) 07:59:33lstをそのまま貼ると崩れちゃうんで、スペースを全角に直して貼ってみます。
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
0393390
2007/03/08(木) 08:22:45LOOP:時点での
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:560395デフォルトの名無しさん
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:460398デフォルトの名無しさん
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頭のゼロで「数値リテラルであってラベルでない」とアセンブラが認識できるから。
cみたいに0xで始まる書き方も許せばいいのにと個人的には思うけど、あまり見かけません。
0401デフォルトの名無しさん
2007/03/11(日) 17:39:43>0xで始まる書き方も許せばいい
これは逆に、c で0Ahや10bという書き方を許さないのが疑問なんだが。
0402デフォルトの名無しさん
2007/03/11(日) 17:44:04自分の身近な物が世の中の全てだと思う奴のことを「セカイ系」って言うらしいけど
最近確かにこういうセカイ系タイプって増えてるな。
リテラルの書き方なんてアセのメーカーによってマチマチじゃん。
マイコン系ならcでもビットワイズのリテラルを許すものもあるし。
0403デフォルトの名無しさん
2007/03/11(日) 17:55:43ここでいってるcはANSIだろう。
asmはいろいろだが。
0404デフォルトの名無しさん
2007/03/11(日) 18:15:52まあ、エスパーの漏れ様が答えてやると、
仕 様 く ら い 読 め
ってことだな。
2.5 機械語命令
adr
アドレスは,10 進定数,16 進定数,アドレス定数又はリテラルで指定する。
リテラルは,一つの10 進定数,16 進定数又は文字定数の前に等号(=)を付けて
記述する。CASL�Uは,等号の後の定数をオペランドとするDC 命令を生成し,そ
のアドレスをadr の値とする。
0405デフォルトの名無しさん
2007/03/11(日) 23:24:050406デフォルトの名無しさん
2007/03/11(日) 23:29:040407デフォルトの名無しさん
2007/03/12(月) 00:53:050408デフォルトの名無しさん
2007/03/13(火) 19:20:14ソースとデスティネーションが右左のどっちか、
リテラルとメモリのラベル、オフセットなどの区別の仕方はどうなってるのか、
そういうのは必ずマニュアルを見て確認してるぞ。
たまにアセンブラのマニュアル忘れてくれる営業さんがいるんだが、
インラインアセンブラとか使うときにどーしろっつーんじゃい。
アセンブラを勉強するなら、環境によってみんな文法が違うってことをまずはじめに覚えろ。
それができたら質問してよろしい。
簡単に言うと、「まず、どのCPUを使うのかを書け!わからなかったらアセンブラに手を出すな!!」
0409デフォルトの名無しさん
2007/03/14(水) 05:12:060410デフォルトの名無しさん
2007/03/14(水) 08:13:35dest/src の順番すらアセンブラによってまちまちだし。
0411デフォルトの名無しさん
2007/03/14(水) 14:46:230412デフォルトの名無しさん
2007/03/14(水) 15:22:060413デフォルトの名無しさん
2007/03/14(水) 18:21:20個人的にはソース・デストの順が好き。
0414デフォルトの名無しさん
2007/03/15(木) 04:40:28その後マイコンの時代になると→がメジャーになってきたね。
0415デフォルトの名無しさん
2007/03/15(木) 07:58:030416デフォルトの名無しさん
2007/03/15(木) 10:18:39store reg, mem
の類は同じニモニックセットでも矢印の向きが変わる典型って訳だな。
0417デフォルトの名無しさん
2007/03/16(金) 18:43:47左レジスタの方が感覚に合うなあ
0418デフォルトの名無しさん
2007/03/16(金) 20:31:120419デフォルトの名無しさん
2007/03/17(土) 22:15:52「右」「左」が区別できる奴なら普通わかると思うが。
一般的な言い回しとは思わないけど。
0420デフォルトの名無しさん
2007/03/17(土) 22:18:58左srcとか左destなら話も分かるが、左レジスタって一体何だよw
0421デフォルトの名無しさん
2007/03/17(土) 23:06:57/::::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思考の柔軟性がなさそうだから、アセンブラなんて変態的なものは
あきらめることをお勧めする。
0424デフォルトの名無しさん
2007/03/18(日) 14:39:45持ってないのはESP能力ねw
0425デフォルトの名無しさん
2007/03/18(日) 21:49:16○ 持ってないのは常識 + 話の流れを読む力
まあ、日本語が理解できないようだから ESP に頼る必要があるのかもしれないけど。 (w
0426デフォルトの名無しさん
2007/03/19(月) 01:04:42特定の石が腐ってるだけ。
なんでそれがわからない?
0427デフォルトの名無しさん
2007/03/19(月) 07:37:010428デフォルトの名無しさん
2007/03/19(月) 07:46:40mov 系の命令は 移動方向は同じ
mov src,dst と mov dst,src が混在する事はあまりない(絶対にないとはいえないが)
LD/ST系は、src/dstではなく、レジスタ/アドレッシング が固定。多くは左にレジスタ、右にアドレッシング
レジスタが1個や2個しかない場合は、
LDA STA のように命令にレジスタが含まれるものもある
ただ mov系とLD/ST系が混在する場合はありえるかも
0429デフォルトの名無しさん
2007/03/19(月) 07:51:37それに418が mov系の話と勘違いしてツッコミ中
0430デフォルトの名無しさん
2007/03/19(月) 07:57:16石が腐っているのではなく、適切に利用出来ないだけだろ。
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クロックが違うんだから、
ゲームに使う話なら高速な方がありがたいだろう
でも68000は内部32bitだから、使い易さは段違い。
0433デフォルトの名無しさん
2007/03/22(木) 13:27:110434デフォルトの名無しさん
2007/03/22(木) 14:59:07その理屈で行くと、8086(クロック5MHz)も当然ゴミなんだろうな。
0435デフォルトの名無しさん
2007/03/25(日) 03:16:16それ自体で良い悪いを語ることはナンセンスでしょ。3MHzの8085でもいまだに現役ですよ。
0436デフォルトの名無しさん
2007/03/25(日) 03:32:540437デフォルトの名無しさん
2007/03/25(日) 05:38:330438デフォルトの名無しさん
2007/03/25(日) 22:08:24だったら(昔の)ゲームとか単純な制御には68kなんかより圧倒的に有利だろうね。
0439デフォルトの名無しさん
2007/03/25(日) 22:26:40ハーバードアーキテクチャがどういうものか調べてこいよ。
0440デフォルトの名無しさん
2007/03/25(日) 22:45:19なんでもいいけどどうせ反論するなら具体的にやってみたら?
いや、できないなら無理することないよw
ちなみに俺は仕事で8052互換コアのコード書いてるから
ハーバードアーキテクチャの利点も欠点もある程度分かってるつもりだけどね。
0441デフォルトの名無しさん
2007/03/26(月) 00:20:130442デフォルトの名無しさん
2007/03/26(月) 03:32:59頑張って電波出してくれ>>438 >>440
0443デフォルトの名無しさん
2007/03/26(月) 11:58:41まさかな。
0444デフォルトの名無しさん
2007/03/27(火) 11:05:250445デフォルトの名無しさん
2007/03/27(火) 11:24:090446デフォルトの名無しさん
2007/03/27(火) 12:07:55シンプルな命令体形でパイプライン処理を導入したおかげだろう
ただ、Accが1個しかなく(まあゼロページ全部がレジスタとも言えるが)
AddWithCF しか無い等、命令数は他のCPUより若干増え気味だが
ソコに色々工夫の余地があった
0447デフォルトの名無しさん
2007/03/27(火) 12:26:594ビットマイコンとか PICのように命令ビット幅がデータビット幅より大きいものは、こうするしかない事情もある
8051のように両方同じビットサイズのものは逆に珍しい
DSPの多くで採用されるのは、速度的な問題から
DSPは積和を高速に実行する為、
命令と掛算のソース2つで3つに別けたり
積和は繰り返すので、
命令そのものはキャッシュに入るとして acc += 命令*データが出来るようにしたものが多い
こうする事で、2倍の速度が得られるわけだ
0448デフォルトの名無しさん
2007/03/27(火) 12:39:04仮定法という言葉を知らないにしても、小学生未満の読解力だなw
0449デフォルトの名無しさん
2007/03/27(火) 13:48:230450デフォルトの名無しさん
2007/03/30(金) 18:28:58どこに仮定法の要素が有るんだw
0451デフォルトの名無しさん
2007/04/11(水) 00:25:42CMP DWORD PTR DS:[EAX-C],1
の意味がわかりません。
EAXからCを引く???
0452デフォルトの名無しさん
2007/04/11(水) 08:13:19EAXって名前からすると IA32だとすると
[EAX-0Ch] を省略表示したんだろうなと、
0453デフォルトの名無しさん
2007/04/11(水) 19:43:27EAX-0Chって結局どこのアドレス指すんでしょうか?
+ならまだしも-ってどこになるんだろう
0454デフォルトの名無しさん
2007/04/11(水) 19:47:270455デフォルトの名無しさん
2007/04/11(水) 20:43:48別にマイナスでもいいじゃん。
最適化のため先にポインタをインクリメントしているかもしれないし
スタック上の変数かもしれないし。
0456デフォルトの名無しさん
2007/04/11(水) 21:19:49C言語なら
eflags.zero_flag = (*(unsigned long*)(eax-0xc) == 1)
0457デフォルトの名無しさん
2007/04/12(木) 08:42:59おいおい。
0458デフォルトの名無しさん
2007/04/12(木) 12:18:49PUSH
RET
0459デフォルトの名無しさん
2007/04/13(金) 00:30:171語8ビットとして、1の補数の求め方がわかりません。
00110101なら11001010を作りたいのです。プロセッサの演算命令は
DEC,INC,SHL,SHR.ROTL,ROTR,ADD,SUBのみ使えます。
おながいします。
0460デフォルトの名無しさん
2007/04/13(金) 00:36:03255から引け。
0461デフォルトの名無しさん
2007/04/13(金) 00:41:15本人マジだったら悪いけど
0462デフォルトの名無しさん
2007/04/13(金) 04:30:550463デフォルトの名無しさん
2007/04/13(金) 06:02:290464デフォルトの名無しさん
2007/04/16(月) 22:38:28「9000H番地の1バイトデータをa、9001H番地の1バイトデータをbとしたとき、
a×bを16ビットで求め、下位1バイトを9002H番地、上位1バイトを9003H番地に
格納するプログラミングを作りなさい。またこのプログラムの実行時間を計算しなさい。」
という問題がわかりません。
どなたか教えて頂けないでしょうか?
0465デフォルトの名無しさん
2007/04/17(火) 00:57:54だれかZ80マスターいませんかー?
0466デフォルトの名無しさん
2007/04/17(火) 01:03:330467デフォルトの名無しさん
2007/04/17(火) 01:12:46何でもいいから適当な例を一つか二つほど晒してくれ。
8085アセンブリ言語の文法知らんから始まらない。
乗算自体は難しいことはないんだが。
0468デフォルトの名無しさん
2007/04/17(火) 01:23:220469デフォルトの名無しさん
2007/04/17(火) 01:29:160470464
2007/04/17(火) 01:30:54このような例で大丈夫でしょうか。。。
「1から10まで加算して結果を8085H番地のメモリに記憶する。」
.8085
ASEG
ORG 800H
;
MVI A,0
MVI B,0
MVI C,10
LOOP: INR B
ADD B
DCR C
JNZ LOOP
STA 8085H
HLT
;
END
0471デフォルトの名無しさん
2007/04/17(火) 02:59:25取り敢えずHLレジスタに0を入れて、DEレジスタにaを入れてb回足せばいい。
擬似コードだとこんな感じ。
HL = 0
D = 0
E = [9000h]
C = [9001h]
loop:
HL += DE
--C
if NZ goto loop
[9002h] = HL
しかし、「プログラミングを作りなさい」って……
0472デフォルトの名無しさん
2007/04/17(火) 03:14:16てっきりないと思って苦労してたorz
0473デフォルトの名無しさん
2007/04/17(火) 05:25:38lda 09001h
mov e,a
mvi d,0 ; de<--(9001h)の値
lda 09000h
mov c,a
mvi b,0 ; bc<--(9000h)の値
; ここから掛け算:HL <-- HL*DE (16bit)
lxi h,0000
mvi a,10h
LBL1: dad h
xchg
dad h
xchg
jnc LBL2
dad b
LBL2: dcr a
jnz 0108
shld 09002h ; 答
0474473
2007/04/17(火) 05:35:578bitの数の場合最初の8回は足し算が起こらないからムダだけど、16bit同士の掛け算にも
そのまま応用できる。aをb回足す手法と比べて、bが10hより大きいときループ回数の点で
有利、という利点がある。これは実際に8085のclibに使われている手法です。
0475デフォルトの名無しさん
2007/04/17(火) 10:36:220476デフォルトの名無しさん
2007/04/17(火) 12:42:42工業高校か高専ってとこじゃない?
学校の宿題なら>>473の方法でいいと思うけど、実際の現場ではニブルXニブルの
look up tableを使うんじゃないかな?
まあ8085使ったことないんで知らないけど。
ちなみに8085は無くなってないんじゃないかな。
0477デフォルトの名無しさん
2007/04/17(火) 12:56:45>>473の方法で8x8を書くのに比べて速度出すのも難しい。
コード量は増えるしね
0478473
2007/04/17(火) 18:00:360479デフォルトの名無しさん
2007/04/17(火) 22:23:39を求め、連続する2語のメモリ上におけ。
という問題です。今期からはじめたばかりです。
もし出来れば
$a : 100
$b : -10
$sum1 : 0
&sum2 : 0
から続けれる形でお願いします。よろしくお願いします、。
0480デフォルトの名無しさん
2007/04/17(火) 22:29:080481デフォルトの名無しさん
2007/04/17(火) 22:31:32東工大情報工学科3年情報実験第3履修生乙wwwww
0482デフォルトの名無しさん
2007/04/17(火) 22:58:380483479
2007/04/17(火) 23:16:070484デフォルトの名無しさん
2007/04/17(火) 23:17:30ハライテェw
0485479
2007/04/17(火) 23:19:230486デフォルトの名無しさん
2007/04/17(火) 23:26:03てかあまり自分の大学名とか言わないようにww
0487デフォルトの名無しさん
2007/04/17(火) 23:26:35gas形式でx86だね?
0488479
2007/04/17(火) 23:32:38ADDとかADDIやら使う形式のOSです。。
0489デフォルトの名無しさん
2007/04/17(火) 23:33:16480 = 484 != 481
俺はただ単純に>483がツボっただけ
0490デフォルトの名無しさん
2007/04/17(火) 23:34:38仮に分からないとしても。(このレベルがわからないってかなり重傷だが)
だってそれなりにプライドあるだろ?
工業高校の生徒だって解ける問題だぞ
0491464
2007/04/17(火) 23:40:17詳しい解答、解説ありがとうございました。
とても助かりました。
>>476さん
やっぱり流行らないことなんですね。
一応地方の大学なんです..。
0492デフォルトの名無しさん
2007/04/17(火) 23:41:22俺は大学行ってないからわからんが、大卒だからこそ全然
書けないのばっか。ハードには一切触れないとこも多いらしい
ペン持って理論ばっか勉強しているんだろう。
てか490は馬鹿にすることで学歴コンプ解消しようとしてんだろ?
0493デフォルトの名無しさん
2007/04/17(火) 23:48:35っていうか、学歴コンプなんて今日日流行らないよ。
自分より優れている人間は素直にリスペクトした方が精神衛生上楽だし健全でしょ。
っていうか、煽り抜きで、本当に東工大で>>479がわからんとしたらかなり痛いと思うよ。
0494デフォルトの名無しさん
2007/04/17(火) 23:54:250495デフォルトの名無しさん
2007/04/17(火) 23:56:04あれ、なんだかわかる人いる?
0496479
2007/04/18(水) 00:01:180497デフォルトの名無しさん
2007/04/18(水) 00:09:26mov al, [a]
imul byte [b]
mov [sum1], al
mov [sum2], ah
だが俺はgas使えん。
0498デフォルトの名無しさん
2007/04/18(水) 00:10:010499デフォルトの名無しさん
2007/04/18(水) 00:13:250500・∀・)っ-○◎●
2007/04/18(水) 00:23:35gcc hoge.c -S
0501デフォルトの名無しさん
2007/04/18(水) 00:29:250502デフォルトの名無しさん
2007/04/18(水) 00:51:30a: dc.b 100
b: dc.b -10
.bss
sum1: ds.b 1
sum2: ds.b 1
.text
kkzn:
movem.l d0-d1,-(sp)
move.b a(pc), d0
move.b b(pc), d1
muls d1, d0
move.w d0, sum1(pc)
movem.l (sp)+, d0-d1
rts
.end
0503デフォルトの名無しさん
2007/04/18(水) 03:30:550504デフォルトの名無しさん
2007/04/18(水) 18:46:24今はwindowsが一番メジャーだからいいけどさ、
必死で覚えても仮にwindowsがなくなってmacが主流になったら
またアセンブリmac.verを覚えなくちゃいけないわけでしょ?そこらへんどうなのよ
0505デフォルトの名無しさん
2007/04/18(水) 18:51:21そして、毎年チップが新しく作られる都度、命令も増えている。
でもさ、それがアセンブラなんだ。
0506デフォルトの名無しさん
2007/04/18(水) 21:57:36パソコンに限って言えばアセンブラで書く(書ける)処理はかなり限定されるし。
0507デフォルトの名無しさん
2007/04/18(水) 22:12:57じゃあお前さんはGASでもMASMでも書けるかい?無理だろうよ
0508デフォルトの名無しさん
2007/04/18(水) 22:16:460509デフォルトの名無しさん
2007/04/18(水) 22:38:430510・∀・)っ-○◎●
2007/04/18(水) 22:45:06Cって最高のトランスレータだと思いませんか
0511デフォルトの名無しさん
2007/04/18(水) 22:51:300512デフォルトの名無しさん
2007/04/18(水) 23:26:54別に片方わかってりゃ GAS でも MASM でも書けるだろ。
習熟にはちょっと時間が必要かもしれないけど、無理ってことはないと思うぞ。
>>510
「最低の」の間違いだろ? (w
0513デフォルトの名無しさん
2007/04/18(水) 23:27:17ダントツで効率が悪いよな 将来性がないっていうの?
その分簡単だからいいんじゃね
まぁ長年使っていけるプログラムなんてそうないけどね
0514・∀・)っ-○◎●
2007/04/18(水) 23:53:31トランスレータかけようと思ったら全部展開せにゃならんよ、たしか
性能の要求と人件費を天秤にかければ
アセンブリ言語できる技術者の需要なんて糞みたいなもんだよ、
月100万でロートル数人雇うより、CPUメーカー謹製の最適化
コンパイラ買った方が圧倒的に安上がりだし。
最近はIntrinsicsでCでも低レベルの部分触れるようになってるから絶滅の一途。
読んで理解できるに越したことはないけど、書ける必要は全くないね。
命令の並びをどうこうするよりもアルゴリズム自体の改善で性能改善できるケースも多い。
そしてそれは構造化言語のほうが圧倒的にやりやすい。
>その分簡単だからいいんじゃね
何がどう簡単なの?機械が解読・変換しやすいって意味?それなら納得。
0515デフォルトの名無しさん
2007/04/19(木) 00:37:43どっちかしか書けないの? 頭を切り替えられない馬鹿?
それとも、アルファベットを見ただけで拒否反応を起こしちゃう英語嫌いと同じ手合い?
0516デフォルトの名無しさん
2007/04/19(木) 00:40:07違う命令覚えなきゃいけないとはいっても、結局やることはメモリかレジスタを
弄るだけだからすぐに慣れちゃうし。
どうせ資料見ながら作業するから暗記する気最初から無かったりする。
命令なんか使ってりゃ自然に覚えるし、覚えなくてもさほど困らない。
0517デフォルトの名無しさん
2007/04/19(木) 04:50:200518デフォルトの名無しさん
2007/04/19(木) 06:51:30今時 アセンブラ = 高速化 だけ で語ってる奴がいるとは...
0519デフォルトの名無しさん
2007/04/19(木) 18:44:26PIC16F84Aを使っているのですが…
CALLでサブルーチンとしてジャンプした後、RETURNせずに
スタックから戻り番地ひとつ消してサブルーチン外にGOTOすることってできませんか?
0520デフォルトの名無しさん
2007/04/19(木) 18:59:47適当なレジスタにPOPできない?
z80辺りだと常套手段だけど。
0521デフォルトの名無しさん
2007/04/19(木) 19:12:40適切な答えが欲しければやりたいことをもう少し具体的に詳細に書いた方がいいと思う。
例えば「スタックから戻り番地ひとつ消してサブルーチン外にGOTO」とあるが、
これは常にそういう動作をしたいの?
それとも条件によっては呼び出し元に戻りたい場合もあるわけ?
まあ、個人的にはそもそも何かトンチンカンなことをやりたがってるような
印象を受けるけど。
まともな質問ができない人ってのは、自分で自分のやりたいことをよく把握してない
場合が多いからね。
0522デフォルトの名無しさん
2007/04/19(木) 19:16:39push/popとか他のスタック操作命令もない。
だから出来ないよ。
基本的に専門系スレには知識も技術も無いのに、
妙な口出しするのが良く出没するけど、それはどこでもそうだから気にしないように。
0523デフォルトの名無しさん
2007/04/19(木) 19:20:580524デフォルトの名無しさん
2007/04/19(木) 19:25:09そもそもCALLやスタックの操作は手段に過ぎず目的ではないはず。
0525デフォルトの名無しさん
2007/04/19(木) 19:29:31アセンブラで書く時は良く使うテクニックだからやりたい事は良く判るよ。
PICの場合は、スタックポインタが無いし、スタックは循環するから
この場合、単にgotoで飛んでしまえば問題ない。
スタックの勘定は合わないけどね。 ただそれだけだから。
0526デフォルトの名無しさん
2007/04/19(木) 19:33:20それの方法がよくわからなくて…
>>522
ああ、やっぱりそうなんですか。
POP動作はRETURNとRETLWしか使えないんですね…
素直にRETLW使います。
0527デフォルトの名無しさん
2007/04/19(木) 19:37:43あ、飛ばしてOKなんですか?
スタック循環させてかまわないんですね…
今後PIC以外でアセンブリやるときに、こういうコトする癖がつくとマズい気もしますが…
0528デフォルトの名無しさん
2007/04/19(木) 19:41:41飛ばしていいけど、戻れるのはmain と同じレベルね。
一つ前とか2つ前というような戻り方は出来ない。
他のCPUで言えばスタックポインタの初期化するのと同じね。
0529デフォルトの名無しさん
2007/04/19(木) 20:21:48おいおいどう考えても>>519みたいのは「よく使うテクニック」なんかじゃないだろう。
call routine
ret
を
jmp routine
に置き換えるような、構造化プログラミングの作法に反しない最適化なら
ごく普通のテクニックだと思うけど。
っていうか、519みたいな手段をとる目的もわからずによく回答できるよなこのスレの連中は。
0530デフォルトの名無しさん
2007/04/19(木) 20:48:210531デフォルトの名無しさん
2007/04/19(木) 21:50:35アセンブラで書く理由は、それが低レベルだから。
低レベルで書くから可能な手法があって、その一つがコレってだけの事。
0532デフォルトの名無しさん
2007/04/20(金) 12:09:36ただ、まともにコンテクスト保存しようとしたら大変だから代替手段として
飛ばしリターン。 普通に使うと思うが?
0533デフォルトの名無しさん
2007/04/20(金) 16:23:41アセンブラで再帰関数っぽいものは如何表現すればよいでしょう。
Cで書くと
int x=10;
int y=9;
int saiki(x,y){
if (x=0) return (y+4)
if (x>0) return (saiki(x-1,y))
}
みたいなのを作りたいぉ。
0534デフォルトの名無しさん
2007/04/20(金) 16:30:35PICのようにスタックが無かったら再帰は無理だが
汎用CPUなら、再帰はそのままCALL/JSRで呼び出せばいいだけ
0535デフォルトの名無しさん
2007/04/20(金) 18:41:28>>533の質問の肝は、要はローカル変数や引数や返り値を再帰呼び出しが
可能なような実装にするにはどうしたらいいかってことだろうに。
俺は悪いけどそんな複雑なことやったことないんで知らない。
まあ、かなり石のアーキテクチャに依存する問題のような気がするけど。
0536デフォルトの名無しさん
2007/04/20(金) 18:47:31スタックがもったいないので再帰なんて使うな。
0537デフォルトの名無しさん
2007/04/20(金) 19:47:12引数や帰り値は、レジスタ渡しでいいだろう
普通に書けば問題ない。
この場合、末尾再帰だからレジスタが壊れる事を心配する必要さえない
0538デフォルトの名無しさん
2007/04/20(金) 19:50:28LAD GR7, STK
LAD GR1, 10
ST GR1, 0, GR7
LAD GR7, 1, GR7
CALL SIGMA
; DREG ='*END*'
RET
SIGMA LAD GR7, 1, GR7
XOR GR0, GR0
LD GR1, -2, GR7
JZE SKP0
ST GR1, -1, GR7
LAD GR1, -1, GR1
ST GR1, 0, GR7
LAD GR7, 1, GR7
CALL SIGMA
ADDL GR0, -1, GR7
SKP0 LAD GR7, -2, GR7
RET
STK DS 100
END
0539デフォルトの名無しさん
2007/04/20(金) 19:54:53アセンブリ言語でソートなどを書かなければなりません。
equはどうやって使うんですか?
#defineのようなものだと調べて知りましたが。
N: equ 80H
とすると80(16進法)番地にNという整数が用意されることは分かりましたが
どうやって値を設定するかが分かりません。
これが分かればあとはBccで分岐させるやりかたが分かればいいのですが。
0540デフォルトの名無しさん
2007/04/20(金) 19:55:40http://upc.ice.ous.ac.jp/~uejima/kue2-webasm/
ここにウェブアセンブラがあります。
もしよかったら使ってください
0541デフォルトの名無しさん
2007/04/20(金) 20:03:54http://www.arch.ce.hiroshima-cu.ac.jp/~ochi/kuechip2/umult4x4.asm.txt
これを見ると、
ld acc,N
で acc に 080h が入るんじゃないの?
0542デフォルトの名無しさん
2007/04/20(金) 20:18:25あと、分岐の実験中ですが
ld acc, 0
lp1: add acc, 1
cmp acc, xxx
bn lp1
end
このプログラムがxxx=100の時は動くのにxxx=150の時は動きません。
どうしてですかね
0543デフォルトの名無しさん
2007/04/20(金) 20:43:4116進数の80ってことだろ。たとえばcbhと書いたら16進数字か識別子か区別が
つきにくくなるから、先頭に0を書くこともある。
>このプログラムがxxx=100の時は動くのにxxx=150の時は動きません。
2の補数表現って知ってるか?
8ビットだと10進数で127までは正の数だが、128以上だと負の数扱いになる。
0544デフォルトの名無しさん
2007/04/20(金) 20:49:24つーか、チミには相談できる友達はいないのかい
0545デフォルトの名無しさん
2007/04/20(金) 20:52:11なるほど。
アセンブラが分かる友達はさすがにいないので・・・
おれもrubyしか分からない。Cすら不明
0546デフォルトの名無しさん
2007/04/20(金) 20:55:49まあ宿題スレだから
それに>539宿題丸投げってわけでもないからね
0547デフォルトの名無しさん
2007/04/20(金) 23:23:21質問ですが
ld acc, [j]
と
ld acc, (j)
はどう違いますか?
たぶんですが、[]はその番地にある値、()はその値そのもの
という解釈でよろしいでしょうか?
つまり()は即値代入、[]は、絶対アドレス代入ということで。
0548デフォルトの名無しさん
2007/04/20(金) 23:37:21まあとりあえず、落ち着いて>>1をよく読もうぜ。
0549デフォルトの名無しさん
2007/04/20(金) 23:37:300550デフォルトの名無しさん
2007/04/21(土) 06:31:22コレだろ?
[d] 絶対アドレス(プログラム領域)
(d) 絶対アドレス(データ領域)
[IX+d] インデックス修飾アドレス(プログラム領域)
(IX+d) インデックス修飾アドレス(データ領域)
0551デフォルトの名無しさん
2007/04/21(土) 10:58:030552デフォルトの名無しさん
2007/04/21(土) 11:36:13DATA[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いちいちメモリに退避ldやstを繰り返してうんざりです。
挿入ソートどうやら書けました。
負数や同じ数にも対応、朝から飯食ってませんよ・・・
もうこの言語にはうんざりです
54321の並びかえに
195 steps, 896 clocks
ふつうのソートよりはずいぶん早いけど・・・微ですね
0556デフォルトの名無しさん
2007/04/21(土) 12:49:31a1: 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:14st 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:13add 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:360560デフォルトの名無しさん
2007/04/21(土) 13:18:16を起用したらなぜか通った。やはりoverflawか・・・
イミフ
0561デフォルトの名無しさん
2007/04/21(土) 13:31:14-64-65 = -129 だけど 16進で書くと $7F =127 になってしまう
だからaccの符号だけみて判定するとミスする事になる
0562デフォルトの名無しさん
2007/04/21(土) 13:34:56overflowとcarryの違いが分からない
0563デフォルトの名無しさん
2007/04/21(土) 13:55:22具体的にはプラスとプラスを足した結果がマイナスだったり、
マイナスとマイナスを足した結果がプラスになった場合をoverflowという。
っていうか、これ宿題以前に持ってないとマズい知識のような気がするけど。。
0564デフォルトの名無しさん
2007/04/21(土) 14:15:32overflow : 桁あふれ
carry : 桁あふれなどの結果の識別子
じゃないか。
0565デフォルトの名無しさん
2007/04/21(土) 14:23:560566デフォルトの名無しさん
2007/04/21(土) 14:37:16プログラム板の外では、桁あふれ、とは取ってくれないってことね。
0567デフォルトの名無しさん
2007/04/21(土) 17:03:02overflowがでてもcarryがでない場合がある(うーん逆かも)
とか言ってた気がする。
負数がどうとか、他の班員は理解してたけどおれは????でした。
苦手なんだけどこの分野に進みたいんだよね・・・いらない子になりそう
0568デフォルトの名無しさん
2007/04/21(土) 17:11:24-100に-1を足したらキャリーは出るがオーバーフローはたたない
0569デフォルトの名無しさん
2007/04/21(土) 17:32:370570デフォルトの名無しさん
2007/04/21(土) 17:37:04演算上、異常な事態がoverflowで、ふつうだけど表示不可な時がcarry
でおk?
0571デフォルトの名無しさん
2007/04/21(土) 17:38:370572デフォルトの名無しさん
2007/04/21(土) 19:13:15なんとなくじゃなくてテキスト読めよ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非常にわかりやすかった。俺にとってお前は神。
0574デフォルトの名無しさん
2007/04/21(土) 20:43:09貧乏神? それとも厄病神?
0575デフォルトの名無しさん
2007/04/25(水) 05:06:52ゼロのときは転送しないように書かれていますが、ゼロだと「最大」(バイトなら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:280578デフォルトの名無しさん
2007/04/25(水) 12:40:570579デフォルトの名無しさん
2007/04/25(水) 13:10:580580デフォルトの名無しさん
2007/04/25(水) 13:58:550581デフォルトの名無しさん
2007/04/25(水) 23:28:26ン
ソ
ロ
H
0582お願いします
2007/04/26(木) 20:43:03おねがいします
0583デフォルトの名無しさん
2007/04/26(木) 22:26:08ここから使う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あとGPIOとはなんですか?
0585デフォルトの名無しさん
2007/04/27(金) 13:05:410586デフォルトの名無しさん
2007/04/27(金) 14:06:48ピン数によって GPIO一つしかなかったり PORTA PORTBがあったりする
SW1のポート番号は、どのポートを使ったかって事
RB1 なら GPIOの所は PORTB で ポート番号のところは1になる
0587デフォルトの名無しさん
2007/04/28(土) 01:39:34別に身につかなくてもいいんです
結果さえ得られれば
0588デフォルトの名無しさん
2007/05/02(水) 20:21:06基礎からできるお勧めのアセンブラの本とかないでしょうか?
command operatorの多さにびっくりで、まずは最初にそれに慣れるなければいけ
ません。簡単なcommand の使い方がから徐々にステップアップできる本を
探してます。心当たりのある人、レスをお持ちしてます。
0589デフォルトの名無しさん
2007/05/02(水) 22:07:32まずはZ80でも覚えなさい。基本的な考えとかはそんなに変わりゃしないから。
0590デフォルトの名無しさん
2007/05/02(水) 22:26:24Z80みたいな酷い石をいまさら学ぶ必要なんか無いよ。
0591デフォルトの名無しさん
2007/05/02(水) 22:58:10勉強に最適だと思うし、確か、Z80 とその互換CPUは世界でもっとも使われて
いるCPUじゃなかったか?
0592デフォルトの名無しさん
2007/05/02(水) 23:06:28その中で一位は統計が無い
4ビットはリモコン、時計、電気ポットと、Z80なんかに比べたら数だけは凄いぞ
0593デフォルトの名無しさん
2007/05/02(水) 23:17:52一昔前なら6502だろ。なんといってもファミコンで世界6千万台。ブッチギリ
ただ PS1が1億台代以上売ったから塗り替えられたかもな
0594デフォルトの名無しさん
2007/05/02(水) 23:40:30Z80は変な制限が多いしオペコードマップが汚すぎる。
8bitでもいまさらZ80なんかを選ぶ理由はない。
32bitだけど68000でもやった方がマシ。ずっと素直だしね。
0595デフォルトの名無しさん
2007/05/02(水) 23:42:45Z80 は組み込み系で現物を使う機会が僅かながらにあると思うんだが、68000 はどうなんだ?
0596デフォルトの名無しさん
2007/05/02(水) 23:46:550597デフォルトの名無しさん
2007/05/02(水) 23:47:04http://www.atmarkit.co.jp/news/200704/24/freescale.html
8bitは 小さいのはPIC、少し大きいのは8051(EZUSBとかPSoC)とか
どうしてもハーバードアーキテクチャの方が優勢だろ
0598デフォルトの名無しさん
2007/05/02(水) 23:52:17MSXエミュレータを忘れもらっちゃ困るw
0599デフォルトの名無しさん
2007/05/03(木) 00:01:22ただ、x86はアセンブラで書く事は殆どないだろう。
一部高速化の為に使うか、コンパイラ製作者が使うだけだ
0600デフォルトの名無しさん
2007/05/03(木) 00:20:310601デフォルトの名無しさん
2007/05/03(木) 01:11:31簡単と言えば簡単だけと、「超シンプル」とまでは言えないと思う。
例) MC14500 => 16命令 (つーか、これ以外に 1bit CPU ってあるのか?)
http://www.st.rim.or.jp/~nkomatsu/motorola/MC14500.html
0602デフォルトの名無しさん
2007/05/03(木) 01:40:39http://www.freescale.co.jp/pressrelease/article.php?id=139
0603デフォルトの名無しさん
2007/05/03(木) 01:58:360604デフォルトの名無しさん
2007/05/03(木) 06:14:44バンク切り替えて命令の後半が置いてきぼりになったり
うっかりヒューズ切って二度と書き込めなくなったりしない
のなら知ってるけど。
0605デフォルトの名無しさん
2007/05/03(木) 07:55:180606デフォルトの名無しさん
2007/05/03(木) 08:31:41プログラマから見たときはほぼ32bitとして見ていい。
あと、CPUとか言わない。ちゃんとMPUって言うべき。
0607デフォルトの名無しさん
2007/05/03(木) 08:46:05アセンブラの出番はあんまり無い事になる。
直交性が無い、使い難い方が、アセンブラの出番があるという事になる
0608デフォルトの名無しさん
2007/05/03(木) 09:46:47擬似命令とニーモニックの対応表のようなものってどこかにありませんか?
0609・∀・)っ-○◎●
2007/05/03(木) 09:56:14DDも擬似命令だけど、対応するニーモニックは無いよね
確認したいなら、いっぺんEXE吐いて逆アセンブルしてみたら良いかと
0610デフォルトの名無しさん
2007/05/03(木) 10:10:18アセンブラの知識がないとセル(のSPEの効率を上げるため)のプログラミングは難しい。
0611607
2007/05/03(木) 10:21:49DEBUGコマンドでオフセットアドレスの0000番地から逆アセンブルしてみたんですが
確かにオフセットアドレスをCSとかDSとかに代入してるようなのはないんですね
OSからセグメントアドレスはプログラムが実行される前に各レジスタに与えられてるってことですか
0614デフォルトの名無しさん
2007/05/03(木) 12:07:54いまいちイメージがつかめん
0615デフォルトの名無しさん
2007/05/03(木) 12:19:15CISCではレジスタとメモリの間も演算出来るから、その組み合わせの事も言うかな
0616デフォルトの名無しさん
2007/05/03(木) 12:46:450617608
2007/05/03(木) 13:12:310618デフォルトの名無しさん
2007/05/03(木) 13:13:06直交っていうのは数学(線形代数?)の用語だと思うんだけど。
二次元の世界だと、要はナイセキ(←IMEって糞だな。こんな基本的な言葉も変換できない)
が0で同じ方向の成分を持たないって意味でしょ、もともとは
0619デフォルトの名無しさん
2007/05/03(木) 13:22:43マクロアセンブラが無い時代ってのは無かったと思うのだが
>>618
ようするに mov だと2つのオペランド、SRC,DSTがあるでしょ?
SRCとDSTが好きな組み合わせが可能 = SRCとDSTが独立している = 直行
0620デフォルトの名無しさん
2007/05/03(木) 13:25:350621608
2007/05/03(木) 13:38:47あ、なかったんですね
さっきCOM用のコードのASSUME命令(ASSUME CS:CODE,DS:CODEってなってました)
を消したり、中身が空のセグメント作ってそれを割り当てたりしてみると
どっちも見た目正常に動いたのですが、COM型だからでしょうか?
0622デフォルトの名無しさん
2007/05/03(木) 13:46:580623608
2007/05/03(木) 14:28:40セグメントオーバーライドプレフィックスっていうやつですか
COMだとASSUMEは必要ないんですね、本には書くようになってるんですが、慣習付ける為ですかね
まだEXEを扱えるようになってないので出直して来ます
0624デフォルトの名無しさん
2007/05/03(木) 14:48:450625デフォルトの名無しさん
2007/05/03(木) 15:11:38とかしてるからでそ?
0626デフォルトの名無しさん
2007/05/10(木) 03:05:410627質問
2007/05/10(木) 15:32:43配列の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:20typedef 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{
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大昔のパソコン(?)にはデータバスやアドレスバスにLEDがついて
動いてるのが視覚的にわかったもんじゃ。
デバッガでレジスタの内容見るとかじゃだめかね?
というか0/1で動作の仕組みを理解って論理回路レベルだ。
君はハード屋さんを目指したほうがいいかもだぞ。
0632デフォルトの名無しさん
2007/05/10(木) 16:38:59回答ありがとうございます。
論理回路は授業で少ししました。
電流がこう流れて、だからこうなって
みたいなのが知りたいのです。
そういうのってやっぱり企業に入らないとわからないんですかね?
特に自分で遊びながら確認できるものがいいんですが・・・
0633デフォルトの名無しさん
2007/05/10(木) 16:45:44>デバッガでレジスタ
とありますけど、自分は実際に電流を流してみて、
その反応がしりたいんです。
どこかに電流がながれてだからここがこう変わってみたい感じです
0634デフォルトの名無しさん
2007/05/10(木) 16:46:160635デフォルトの名無しさん
2007/05/10(木) 16:47:53あの本も電流がここに流れて・・・
みたいなことが書かれてなかったような気がします
0636デフォルトの名無しさん
2007/05/10(木) 16:56:18ブレッドボードにTTLとLEDで適当に論理回路組んでみるとか。
どちらにせよ板違いっぽいな。http://science6.2ch.net/denki/ こっち探してみ。
0637デフォルトの名無しさん
2007/05/10(木) 16:57:08誘導ありがとうございます
さっそく質問してきます
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ありがとうございます。
参考にさせていただきます。
0640デフォルトの名無しさん
2007/05/11(金) 00:12:490641デフォルトの名無しさん
2007/05/11(金) 00:23:40億くらいだったかな
0642デフォルトの名無しさん
2007/05/11(金) 00:24:21確か、東京ドームをもとにして計算したんだけど。
0643デフォルトの名無しさん
2007/05/11(金) 14:10:50Core2Duoあたりだと確か3億弱くらいだっけ。
ちなみにZ80やそれ以前のものだと数千程度らしいが。
ところで、なにをどうやって東京ドームをもとに計算するんだ?
0644デフォルトの名無しさん
2007/05/11(金) 16:21:550645デフォルトの名無しさん
2007/05/11(金) 17:23:030646デフォルトの名無しさん
2007/05/12(土) 00:11:11またPS3のCPUがひとつ動いてない、なんか歩どまりがどうとかそういうのも覚えている。
他はうーん、ブースのアルゴリズム、これは忘れた。
0647デフォルトの名無しさん
2007/05/12(土) 01:07:160648デフォルトの名無しさん
2007/05/12(土) 04:06:53A<---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:46ZかCかどっちか。
0650デフォルトの名無しさん
2007/05/12(土) 08:04:46キャリーはクリアされるよ。
0651649
2007/05/12(土) 08:19:44帰巣本能みたいな感じ。
0652デフォルトの名無しさん
2007/05/12(土) 10:56:44ORI を先にやって CPI 3AH にしてみたら?
0653デフォルトの名無しさん
2007/05/12(土) 11:02:38RRA
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:250655デフォルトの名無しさん
2007/05/12(土) 11:25:400656デフォルトの名無しさん
2007/05/12(土) 11:29:17CPI 3AH (CP A,3AH)だ。
$+4では?(JMP3バイト、JR2バイト)
0657デフォルトの名無しさん
2007/05/12(土) 12:47:22尤も、アセンブラが敢えてjr命令自身を指すように作られていれば別だが。
0658デフォルトの名無しさん
2007/05/12(土) 13:00:540659デフォルトの名無しさん
2007/05/12(土) 13:17:15とかいうコードを良く使うから、$はその命令のアドレスの事じゃないかな?
だから、まあラベル使っとけと
0660デフォルトの名無しさん
2007/05/12(土) 13:21:16普通の(単純な)CPUは、命令をフェッチした段階でプログラムカウンタをインクリメントするものだけど。
でないと、次の命令フェッチに間に合わせられなくなってしまう。
ついでに言えば、プログラムカウンタが次の命令を指してないとサブルーチンコールが激しく面倒な訳だが。
0661デフォルトの名無しさん
2007/05/12(土) 18:11:10>とかいうコードを良く使うから
NOPの替わり?
0662デフォルトの名無しさん
2007/05/12(土) 18:18:50ですよ。だからZ8ニーモニックなら$+4で正解、85ニーモニックなら$+5で正解です。
JMP $は−3の相対アドレスを持ちます。 JR $は−2の相対アドレス。
0663デフォルトの名無しさん
2007/05/12(土) 18:21:59それは、所謂無限loop。
x86だとjmp $+2で、pipelineをclearする意味合いがあるらしい。
0665デフォルトの名無しさん
2007/05/12(土) 22:05:050667デフォルトの名無しさん
2007/05/13(日) 01:18:16んなこと誰も訊いていない
0668デフォルトの名無しさん
2007/05/13(日) 01:40:16>>661
0669デフォルトの名無しさん
2007/05/13(日) 09:10:57無駄
0670デフォルトの名無しさん
2007/05/13(日) 09:34:05自演乙
0671671
2007/05/13(日) 18:09:35mov 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終わったな、MS。
0673デフォルトの名無しさん
2007/05/13(日) 18:38:410674デフォルトの名無しさん
2007/05/13(日) 18:41:57eaxだと1バイト長い。
0676デフォルトの名無しさん
2007/05/13(日) 18:51:190677デフォルトの名無しさん
2007/05/13(日) 18:59:380678デフォルトの名無しさん
2007/05/13(日) 19:03:50ゴミコンパイラ発覚。
0679デフォルトの名無しさん
2007/05/13(日) 19:08:400680デフォルトの名無しさん
2007/05/13(日) 19:09:250681デフォルトの名無しさん
2007/05/13(日) 19:10:50>Express Edition
0683デフォルトの名無しさん
2007/05/13(日) 19:19:310685デフォルトの名無しさん
2007/05/13(日) 22:20:27> mov edx, [eax]kernel._run
> ↓
> mov ecx,dword ptr [eax]
> mov edx,dword ptr [eax+8]
>となりました。
コンパイラ(アセンブラ)の仕事はラベルのアドレス解消しかないわな。
0686デフォルトの名無しさん
2007/05/14(月) 18:33:10popをしていってリターンすると、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-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スタックポインタをあまりよくわかっていませんでした。
汎用データ・レジスタをすべてpopすると、
eip(ステータスレジスタ)に書かれているアドレスに分岐されるんですね。
たまたま、↑の場合はSPを切り替えたため、
eipが、funcの呼出しもとでなかったために
task_Aが実行されたんですね。
わかりました。
0690デフォルトの名無しさん
2007/05/14(月) 22:38:12> eip(ステータスレジスタ)
もっとちゃんと仕様書を読む癖つけた方がいいぞ。
0691デフォルトの名無しさん
2007/05/15(火) 09:18:130692デフォルトの名無しさん
2007/05/15(火) 09:23:30call で保存されてるのが
0694デフォルトの名無しさん
2007/05/24(木) 09:57:32とても困っています
キーボードより入力した文字列(少なくとも2文字以上)を
逆順に並べ替え、一括して出力するプログラム
例:「abc」と入力して、「cba」と出力する
ってどうしたらいいんですか?教えてください
POPとPUSHを使うみたいなのですが・・・
0695デフォルトの名無しさん
2007/05/24(木) 10:41:570696デフォルトの名無しさん
2007/05/24(木) 10:45:40とんでもなく初心者なのでよくわかりません・・・
INを使うってことですか?
0697デフォルトの名無しさん
2007/05/24(木) 10:59:34普通にpushしてpopすれば逆になるんじゃなかったっけ?
0698694
2007/05/24(木) 11:19:41STARTで始まってENDで終わるということぐらいしかほとんどわかりません
よかったらソースを御願いしますm(__)m
0699デフォルトの名無しさん
2007/05/24(木) 11:36:55CASL�Uか?
0700694
2007/05/24(木) 11:46:25御願いします
0701デフォルトの名無しさん
2007/05/24(木) 12:04:50IN マクロ1回で全部の文字が入るわけ?
それともターミネータが既定されてて、その文字まで1文字づつINで入力してゆくの?
0702694
2007/05/24(木) 12:10:58一回で「abc」と入れたのが
「cba」と出てくればそれで
大丈夫だと思うのですが
0703デフォルトの名無しさん
2007/05/24(木) 13:59:07並べ替えに入る。それまでは入力した順にpushしてく、という書き方すべきじゃね?
あと、popしながら戻ってくるときに「終わり」を知るためには、最初に何か特別なコードを
pushしとかないと。
0704デフォルトの名無しさん
2007/05/24(木) 14:41:480705694
2007/05/24(木) 15:08:45教科書のINとOUTのプログラムの例はこんな感じです。
MACR START
TOP IN AREA,LL
LD GR1,LL
JZE FIN
OUT AREA,LL
JUMP TOP
FIN RET
AREA DS 256
LL DS 1
END
これの入れたものが逆に出てくるバージョンが知りたいです
0706694
2007/05/24(木) 15:15:03MACR START
TOP IN AREA,LL
LD GR1,LL
JZE FIN
OUT AREA,LL
JUMP TOP
FIN RET
AREA DS 256
LL DS 1
END
0707694
2007/05/24(木) 15:16:30スペースたくさん入れても一つになってしまいますね
0708デフォルトの名無しさん
2007/05/24(木) 15:27:34REV 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厄介だねえ IN 命令では何バイト読まれるか判らないのか
A 1バイト又は終了なら0バイト
B Nバイトが一気に読まれる
なら比較的楽なんだけどなあ
0710気まぐれアナスイ
2007/05/24(木) 15:37:37『((++) != (\/n)a) == 1』
0711デフォルトの名無しさん
2007/05/24(木) 15:40:04げ、バグがある。やっぱ無しっつうことで。
0712デフォルトの名無しさん
2007/05/24(木) 16:23:48REV 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
0713694
2007/05/24(木) 16:41:09よくわかりませんが、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
そんな感じだとは思うのですが、エラーが出ていても
どこが間違っているのかも全然わからない素人なのです(汗
0714694
2007/05/24(木) 16:52:05Address 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
0715694
2007/05/24(木) 17:28:41ちなみにこんなかんじでした
MOVE START
IN RE,LE
LAD GR1,0
LD GR2,LE
LAD GR2,-1,GR2
LD GR3,LE
SRA GR3,1
LP JZE LIST
LD GR0,RE,GR1
LD GR4,RE,GR2
ST GR4,RE,GR1
ST GR0,RE,GR2
LAD GR1,1,GR1
LAD GR2,-1,GR2
SUBA GR3,C1
JUMP LP
LIST OUT RE,LE
RET
LE DS 1
RE DS 30
C1 DC 1
END
0716デフォルトの名無しさん
2007/05/24(木) 17:51:49SUBをSUBAに、R0をGR2にして、余分な空白は消さないと動かないね。
ENDの位置も間違ってる。
0717モンキーJ
2007/05/24(木) 17:57:09課題なのですが問題あるでしょうか?ご教授お願いします。
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:590719デフォルトの名無しさん
2007/05/24(木) 21:39:45スタック使ってないやん…
0720デフォルトの名無しさん
2007/05/26(土) 03:21:480721デフォルトの名無しさん
2007/05/26(土) 03:27:12MIPSのアセンブラって皆こうなん?
$とかすごく入力しにくいぞ
0722デフォルトの名無しさん
2007/05/26(土) 11:08:090723デフォルトの名無しさん
2007/05/27(日) 00:12:290724・∀・)っ-○◎●
2007/05/27(日) 00:48:170725デフォルトの名無しさん
2007/05/27(日) 02:09:030726デフォルトの名無しさん
2007/05/27(日) 23:22:21誰も答えないようなので一応答えてみる。
勝手に想像をめぐらすと変数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:390728webmaster@気まぐれアナスイ
2007/05/29(火) 15:14:19全てclear.出来る筈です…
0729デフォルトの名無しさん
2007/05/30(水) 21:20:42期限が明日に迫っていて間に合いそうにありません。
図がズレる可能性もあったのでtxtであげました。
http://www.csync.net/service/file/view.cgi?id=1180527442
よろしくお願いします。
0730デフォルトの名無しさん
2007/05/30(水) 21:45:130731デフォルトの名無しさん
2007/05/30(水) 23:31:190732デフォルトの名無しさん
2007/05/30(水) 23:46:410733デフォルトの名無しさん
2007/05/31(木) 00:02:030734デフォルトの名無しさん
2007/05/31(木) 08:47:1612時までには終わらせるから待っとけ。
0735デフォルトの名無しさん
2007/05/31(木) 10:22:47とりあえずやってみた。
コメントの形式がこれじゃダメな場合は、自分で書き直してくれ。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4116.txt
0736デフォルトの名無しさん
2007/05/31(木) 11:14:23ありがとうございます!
コメント形式も完璧で本当に助かりました。
0737デフォルトの名無しさん
2007/05/31(木) 11:17:36二人が同時に家から出て互いに向かって走ってったら同じ場所になるのは何秒後?
0738デフォルトの名無しさん
2007/05/31(木) 11:47:4820/4.5=4.44444444・・・・秒後
A君は自分の家から8.88888888・・・・mの場所
B君は自分の家から11.1111111・・・・mの場所
両方の距離を足すと19.99999999・・・・m
検算でもだいたい合ってるのでこれでいいでしょう
0739デフォルトの名無しさん
2007/05/31(木) 11:50:43ありがとう
本当に助かった
0740デフォルトの名無しさん
2007/05/31(木) 11:52:050741デフォルトの名無しさん
2007/05/31(木) 12:31:310742デフォルトの名無しさん
2007/05/31(木) 12:40:11循環しますが
0743デフォルトの名無しさん
2007/05/31(木) 21:53:30接続した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秒間の時間稼ぎをするのか、とか。
添削はそれから。
0745743
2007/05/31(木) 22:29:23ORG 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>JP NZ,LOOP3 ;0でなければLOOP3に戻る
無意味無駄無様なコメントだな。
で、dec deはいつからフラグに影響するようになったのかね。
0747デフォルトの名無しさん
2007/05/31(木) 23:11:350748デフォルトの名無しさん
2007/05/31(木) 23:30:25こういうところは妙にテクってたりするw
0749デフォルトの名無しさん
2007/05/31(木) 23:38:12これは時間稼ぎループの中に入れないとまずい。
それにしてもループで時間稼ぎとは前時代的だなw
0750デフォルトの名無しさん
2007/06/01(金) 05:15:198000Hから始めて、終わったら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:451行ずつ命令の動作をそのままコメントに書かせる奴はいる。
0752デフォルトの名無しさん
2007/06/02(土) 13:10:390753デフォルトの名無しさん
2007/06/02(土) 15:53:100754デフォルトの名無しさん
2007/06/03(日) 10:55:410755デフォルトの名無しさん
2007/06/03(日) 13:27:19ゼロになるとかいろいろあると思う。計算の途中なら先を続けないとか、数値として編集するなら
「計算できません」的な表示を作るとか、要するに「正しい答以外の場合」の後始末が必要でしょ
0756デフォルトの名無しさん
2007/06/03(日) 17:25:43なんだか難しく考えすぎていたようです。>>755 ありがとうございました。
0757デフォルトの名無しさん
2007/06/04(月) 05:35:340758デフォルトの名無しさん
2007/06/07(木) 23:35:21の組み合わせはデータラベルを識別子とする変数や配列を定義してるようなものだと思えばいいんでしょうか?
0759デフォルトの名無しさん
2007/06/08(金) 01:53:300760デフォルトの名無しさん
2007/06/08(金) 02:00:17hoge DB "hanage",0
はC言語でいうところの
char* hoge = "hanage";
かなぁ。
0761デフォルトの名無しさん
2007/06/08(金) 03:57:59>>760は hoge: DW peke
peke: DB "hanage",0 になる。
0763デフォルトの名無しさん
2007/06/16(土) 12:01:130764デフォルトの名無しさん
2007/06/16(土) 12:04:200765デフォルトの名無しさん
2007/06/16(土) 13:20:140766デフォルトの名無しさん
2007/06/17(日) 02:26:32なんかいい名前かんがえようぜ
0767デフォルトの名無しさん
2007/06/17(日) 05:32:01組み立て作業(誰にでも出来る簡単なお仕事です!未経験者歓迎)
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:130772デフォルトの名無しさん
2007/06/25(月) 14:35:58文字列を入力させて、それをキューを使用して格納し、
順に出力するというプログラムを組んでいるのですが、
具体的にどのように書けばよいのでしょうか?
例えば、使用者が「PLAYSTATION」と入力した場合、
←|P|L|A|Y|S|T|A|T|I|O|N|←
となるので、Pから順に出力されていき、出力画面にはPLAYSTATIONと出力されます。
0773デフォルトの名無しさん
2007/06/25(月) 15:18:51読みこみ $t0,配列アドレス
ラベル1:
戻れるジャンプ read_char
アドレスに保存 $t0,$v0
加算 $t0,1
比較 $v0,キャリッジリターン
同一じゃなければジャンプ ラベル1
アドレスに保存 $t0,0
読みこみ $t0,配列アドレス
戻れるジャンプ print_string
0774デフォルトの名無しさん
2007/06/25(月) 16:49:23C言語の文字列処理のようなものでしょうか?
このような感じでしょうか?
#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を使う */
0775772
2007/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とりあえず>>773-774の情報をもとに自分で考えようと思わんのかな?
ハナから人任せじゃなかなか理解が進まないもんだよ。
ま、いいんだけどね。
0777772
2007/06/25(月) 19:47:10何度もやってみたのですが、うまくいかないもので・・・
自分で書いたコードです。
ttp://bebe.run.buttobi.net/up/src/be_1239.txt
0778デフォルトの名無しさん
2007/06/25(月) 20:32:16貼られた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:570780772
2007/06/25(月) 20:57:43貼った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:17spimに依存した話、って事でいいのかな?
0782772
2007/06/26(火) 02:51:50でOKです。
0783772
2007/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と同じやり方で
文字を取り出して表示、「末尾」ならおしまい。
0785772
2007/06/27(水) 12:18:30レスありがとうございます。
スタック二つ目を作ってみたのですがエラーが出てしまいます。
ttp://bebe.run.buttobi.net/up/src/be_1276.txt
何か悪い点があるならご指摘お願いします。
0786772
2007/06/27(水) 12:21:07>「末尾」文字なら次へ、そうでなければ前へジャンプ
とは、どうやれば良いのでしょうか?
0787デフォルトの名無しさん
2007/06/27(水) 12:32:54君さ。今までに出された物を理解しようとしてるか?
また使おうとしてる言語の仕様は把握してるか?
人から貰った回答をそのまま提出しても自分の身に付かないぞ。
0788デフォルトの名無しさん
2007/06/27(水) 13:17:43わからない部分の模範解答を見て覚えるというのは初心者には身になる事だよ。
0789772
2007/06/27(水) 13:22:15すいません。理解しようとしているのですが、
一番最初のメモリアドレスをスタックポイントに保存させて、
スタックの状態が「noitatsyalp」になるまでpushする、というのは分かったのですが、
次:覚えておいたスタックポインタからpushと同じやり方で
文字を取り出して表示、「末尾」ならおしまい。
の意味がやり方が分かりません。「noitatsyalp」となっている状態で、
スタックポイントに保存している状態だと、pの方から文字を取得できるのでしょうか?
こんな感じかと作ってみたのですが、文字を入力した瞬間、エラーが出てしまいます。
ttp://bebe.run.buttobi.net/up/src/be_1279.txt
0790784
2007/06/27(水) 13:40:32俺はこの石のASMはいじったことないが、add $10, 1 の後、bneってのは変だと思う。
何かとコンペアして、beかbneでなきゃおかしいでしょ。 で、その比較するものは、
「今格納した文字が特定の何かの文字か?」と判定するんじゃないの?'n'だったら終わり、
っていうんじゃあまりにもプログラムらしくないでしょ。"hellow"を入れたら動かないことになる。
ふつうは復帰(0Dh)か改行(0Ah)を入れたら1行分の文字列の終わり、と認識するもんだ。
0791つづき
2007/06/27(水) 13:48:53789はpush/popの概念解ってる? スタックポインタ(SP)という特定のレジスタがあって、自分で
初期化する場合もあるし、789が書くプログラムにきたときに特定の値にそれが初期化されてる
こともある。それは処理系依存。
push-->SPの指すメモリにレジスタの1語を書き込み、SPを1語分減らす、
pop -->SPの指すメモリから1語レジスタに読み出し、SPを1語分増やす、 君の処理系でもそう?
0792デフォルトの名無しさん
2007/06/27(水) 13:53:34分岐命令と比較命令が一つになってるだけだから、これ自体は別におかしくはないと思うけど。
スタックは使ってないように見えるね。
1.配列は下位アドレスから上位アドレスへ向かって使うが、スタックは上位から下位へ使う。
2.スタックポインタは$29(別名:$sp)で操作できる。
3.残念ながらスタック操作専用命令はないので、$spは自分でやる必要がある。
こんな感じで。
push操作
addi $sp,$sp,-4
sw $12,0($sp)
pop操作
lw $12,0($sp)
addi $sp,$sp,4
0793784
2007/06/27(水) 14:04:18789のやり方なら、最初に$10にarのアドレスを入れるところで、$10に$SPをコピーしておく。
で、newlineを識別したところでは$SPは何語分か減っているが、最初のコピー$10の指す
メモリから順に取り出せば入力した順に文字が取り出せる、というわけ
0794772
2007/06/27(水) 15:00:14書いてくださった事を元に、今書き直しています。
0795772
2007/06/27(水) 15:15:44教科書には、
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の方でいい。つまり、spは「次に値を格納する場所」を指すことになる。
0797772
2007/06/27(水) 15:26:54つまり、この場合、playstationを後ろからpushしていき、
pからpopするという事でしょうか?
0798772
2007/06/27(水) 16:13:06先生がサンプルのプログラムをWebにアップロードすると言って音信不通(メールを送ってもすべて無視)になり、
教科書にもデータストラクチャの分野はさわりしか書いてない状態で、インターネットで情報を補完しているのですが、
参考にして組んだプログラムもまったく動かず、八方塞状態です。orz
ttp://bebe.run.buttobi.net/up/src/be_1280.txt
0799デフォルトの名無しさん
2007/06/27(水) 16:32:540800772
2007/06/27(水) 16:40:17???
ttp://www.cs.uaf.edu/~cs301/notes/Chapter8/node9.html
このWebページを参考にして普通に出力されるように書いているのですが、
見た目はスタックのように見えるのですが、これはただ配列を参照しているだけでしょうか?
0801デフォルトの名無しさん
2007/06/27(水) 16:49:37けど、マシンそのものがスタックを提供してるんだから、配列でスタックを実装する意味なんかないよね。
0802772
2007/06/27(水) 17:02:28>>792さんのコードを参考にして、
ttp://bebe.run.buttobi.net/up/src/be_1281.txt
このようにPushとPopを逆にしてみたのですが、まったく動作しません…
いったいどのようにやれば、このような構造でplaystationと入力した場合、
playstationと普通に表示されるのでしょうか…
0803デフォルトの名無しさん
2007/06/27(水) 17:59:35逆順には表示されたの?
0804772
2007/06/27(水) 18:10:24逆順には表示されました。
後、課題が表示されているWebページを見たら別にスタックでなくても良いらしく、
>>773さんの手順で書いてみたのですが、それでもエラーを吐いてきますorz
ttp://bebe.run.buttobi.net/up/src/be_1282.txt
0805772
2007/06/27(水) 18:46:050806デフォルトの名無しさん
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文字で説明しても混乱するだけだろうから、コード書いてやった方がいいんじゃね
0808デフォルトの名無しさん
2007/06/27(水) 20:05:00はじめはキューでやらなければいけないと言い、
次にスタックを2回つかわなければならないと言い、
最後にはスタックは使わなくてもいいと言う。
からかわれてただけなのか?
0810772
2007/06/27(水) 20:18:57>>806
ありがとうございます。ご指導の通り作ったら、playstationの最初の1文字だけは表示されるようになりましたorz
書いたコードですが、どこが>>806さんの手順に沿ってないのでしょうか?
ttp://bebe.run.buttobi.net/up/src/be_1283.txt
>>808
最初課題が出されたときはキューでやれ、だったのですが
クラスメートの誰かがキューとスタックを勘違いし、スタックで作って
それがリバースオーダーの段階までいっていたので、スタックに急遽変更(その時点でキューでの提出者0)
になり、提出日が近づいてもクラスの3分の2が提出できなかったのでもう何でもいいから、
入力した文字をそのまま出力できれば良い、になっていました。
0811デフォルトの名無しさん
2007/06/27(水) 20:23:260812772
2007/06/27(水) 20:40:48大学院生がクラスを教えてるんですが、最近子供が産まれたとかで
質問のメールを送っても無視ですorz 返信がきたことありません。
オフィスにいるはずの時間も基本いなくて、授業の後に質問したら「メールで送れ」と言うだけで…
ただやってる研究が凄いらしく、大学側に文句を言っても何も起きません。、
研究者、技術者としては最高だと思われるのですが指導者としては最悪だと思いますorz
0813デフォルトの名無しさん
2007/06/27(水) 20:44:36入力ルーチン:
1文字入力
バッファ先頭+インデックスレジスタの位置に格納
インデックスレジスタ+1
入力された文字が改行でないなら入力ルーチンへループ
インデックスレジスタを0に初期化
出力ルーチン:
バッファ先頭+インデックスレジスタの位置から文字を取り出す
取り出した1文字出力
インデックスレジスタ+1
出力した文字が改行でないなら出力ルーチンへループ
終了
入力されたのが出力されりゃいいだけなら、こんな感じじゃあるまいか。
getsとputsを使って手抜きしてもいい気がする。
0814772
2007/06/27(水) 21:09:49ttp://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いや、自分で考える習慣を付けさせてるんだから最高の教官だと思うが。
0816772
2007/06/27(水) 21:29:35まともな教官なら提出期限3時間前の時点で、未提出3分の2という状況はないと思いますorz
個人的にはプログラム板の人に講義をしてもらいたいところです。
>>814のコードですが、lb $9, A($8)がエラーを起こしているみたいです。
readで保存したsb $9, A($8)を呼び出しているだけだと思うのですが、
何がいけないのでしょうか?
0817デフォルトの名無しさん
2007/06/27(水) 21:57:10デバッグ作業が勝利の鍵だ。
0818デフォルトの名無しさん
2007/06/27(水) 21:58:17そこは問題ない。814のコードは忘れて、810のコードに戻れ。
printの前で$8を別のレジスタに保存 が問題。
別のレジスタに$8が保存されてないからループが始まった瞬間、
0以下になりループから脱出するので一文字しか出力されない。
0819772
2007/06/27(水) 22:05:38動きました!早速提出してきます。
本当にありがとうございました!
0820デフォルトの名無しさん
2007/06/27(水) 22:10:53おめ。810の時点で物凄くコード書きたかったが、手淫しながら待っててよかった。
0821デフォルトの名無しさん
2007/06/27(水) 22:33:31S1: .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俺がゆとりだった罠。
0823デフォルトの名無しさん
2007/06/28(木) 19:24:290824デフォルトの名無しさん
2007/06/28(木) 22:05:52トの構成とMIPSの命令セットの構成の違いを教えていただきたいのですが、お
願いします。
0825デフォルトの名無しさん
2007/06/28(木) 22:06:410826デフォルトの名無しさん
2007/06/28(木) 22:32:260827デフォルトの名無しさん
2007/06/28(木) 22:33:15大体マルチじゃないよ。
0828デフォルトの名無しさん
2007/06/28(木) 22:48:440829デフォルトの名無しさん
2007/06/28(木) 23:56:10質問を打ち切ります。
0830デフォルトの名無しさん
2007/06/29(金) 00:17:070831先に後悔するなら大変だが
2007/06/29(金) 07:55:55大丈夫、後で後悔するなら当たり前だから。
0832デフォルトの名無しさん
2007/06/30(土) 09:33:24どうやればいいのでしょうか?
0833デフォルトの名無しさん
2007/07/01(日) 05:23:18最初の20個の整数?素数?テーブルの中身? 何bitの情報?
0834デフォルトの名無しさん
2007/07/01(日) 07:20:201から20までの数値の二乗を足していって、その結果を表示するプログラムです。
説明がわかりにくくて申し訳ありませんでした。
テーブルの中身、何bitの情報というのは説明されていないので分かりません。
とにかく、結果が表示されれば良いと思います。
ここまで作ってみたのですが、エラーを起こしてしまいます。
悪い点があればご教示お願いします。
ttp://doiob.net/doiob/uploader/src/up7205.txt
0835834
2007/07/01(日) 07:22:50ttp://doiob.net/doiob/uploader/src/up7206.txt
0836デフォルトの名無しさん
2007/07/01(日) 08:32:42ニモニック知らないで指摘するけど。
・「エラーを起こす」とは?
・$0は何に使っている? その初期値は何?
・$5にロードしているらしい0x1001は適切? 仮にセグメンテーションフォルトならここで起きてない?
・結果は$2に入っていると思うのだけど、どうやって出力しているつもり?
・最後のsyscallはなに? プロセス終了か何か?
0837834
2007/07/01(日) 08:57:45・「エラーを起こす」とは?
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と違うわけだが。
0839834
2007/07/01(日) 09:24:44numints、分かりやすいようにと付けたんですが、
まったく必要ないですね…
addi $v0, $0, 4等の横のコメントは今付け加えました。
これを高水準言語でやると、
int count = 0;
int i = 1;
while(i<20){
count += i * i;
i++;
}
//出力count
となると思われるのですが、アセンブラだと思い通りにいかないですね。
0840834
2007/07/01(日) 09:31:37元となったプログラムです。
こちらの方は出力はされる事はされるのですが、数値ではなく
■が表示されます。おそらく、ASCIIテーブルの関係上、
そんな数値は存在しない、と返してくると思うのですが
どうやったらきちんとした数値が表示されるのでしょうか…
ttp://doiob.net/doiob/uploader/src/up7208.txt
0841デフォルトの名無しさん
2007/07/01(日) 10:17:41put??= put ?????(整数)
0842834
2007/07/01(日) 11:28:23>>840のプログラムは♂が表示されるようになりました…。
見やすいようにコメントを付けてみました。
ttp://doiob.net/doiob/uploader/src/up7210.txt
実行すると、エラーは起きないのですが、結果が何も表示されません…。
0843834
2007/07/01(日) 13:17:092870と表示されるサンプルコードを書いてはいただけないでしょうか?
int count = 0;
int i = 1;
while(i<20){
count += i * i;
i++;
}
ずっとやっているのですが、全然出来ません。
0844デフォルトの名無しさん
2007/07/01(日) 14:00:52>840にはputsってのがあるのに今度はまたそれがない。
putsで出力しているんじゃないの?
あんたへのレスに、ヒントになりそうなことは山ほどあるんだけど全然理解できてないだろ。
いい加減に行き当たりばったりで振り回さないでくれるかな。
0845デフォルトの名無しさん
2007/07/01(日) 16:03:330846あほかい
2007/07/01(日) 16:26:110847デフォルトの名無しさん
2007/07/01(日) 21:32:400848デフォルトの名無しさん
2007/07/01(日) 22:49:43# 使用レジスタ
# $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:20UC BerkleyのFreshmanか?似たような事を61Cでやった事がある。
どちらもプログラムのコードはOK。でも、それでは一文字しか出力されない。
ASCIIでバイアス調整する必要もあるし、出力を自分で導かないといけない。
こんな感じで書けばいいと思う。出力確認済み。
ttp://doiob.net/doiob/uploader/src/up7298.txt
>>844
この場合、文字列、整数じゃなくて文字だろ。
puts,putiじゃなくて使うのはputc。$v11。
>>848
理論はあってるけどそれでは無理。SPIMでは出力されない。
0850834
2007/07/02(月) 06:09:57完璧です!きちんと表示されました。ありがとうございました!
0851834
2007/07/02(月) 06:13:030852デフォルトの名無しさん
2007/07/02(月) 11:09:170853デフォルトの名無しさん
2007/07/02(月) 15:33:13> >>848
> 理論はあってるけどそれでは無理。SPIMでは出力されない。
えぇと?spim ver. 7.3で出力を確認済みなんですが?
SPIMでは出力されないという根拠を聞かせてもらいたい。
0854デフォルトの名無しさん
2007/07/02(月) 19:31:38834のコードからしてspimsal使ってるんだろう。
spimsalだとそのコードでは0としか出力されない。
0855デフォルトの名無しさん
2007/07/02(月) 21:09:38はて、何でじゃろか?madd使ってるせい?
0856デフォルトの名無しさん
2007/07/04(水) 12:03:20print_intを使う事は何も問題がなさそう。
0857デフォルトの名無しさん
2007/07/07(土) 14:21:30レジスタ1の値をレジスタ2の値で割った余りをレジスタ1に格納して戻るプログラム
を作成してください
0858デフォルトの名無しさん
2007/07/07(土) 19:03:460859デフォルトの名無しさん
2007/07/07(土) 19:49:07REMAIND SUBA GR1,GR2
JMI LEND
JUMP REMAIND
LEND ADDA GR1,GR2
RET
0860デフォルトの名無しさん
2007/07/09(月) 06:57:000861デフォルトの名無しさん
2007/07/09(月) 12:08:25サッパリわかりません
CPUはathlon64 3000+
メモリ1GB
VGA:Geforce6600GT
です
ヨロシクお願いします
0862デフォルトの名無しさん
2007/07/09(月) 13:36:50ごめんな
0863デフォルトの名無しさん
2007/07/09(月) 13:51:42取り敢えず、x86でいいから作ってみてよ。漏れがx64にコンバートするから。
0864デフォルトの名無しさん
2007/07/09(月) 14:22:110865デフォルトの名無しさん
2007/07/09(月) 14:27:09「オセロ」って言う名前のコンピュータのアルゴリズムってなんだ?
0866デフォルトの名無しさん
2007/07/10(火) 10:54:49データ構造決めて、cならこんなコードになる、こんなルーチンが欲しい程度までバラしてから
ここで聞くなら解るが。
0867デフォルトの名無しさん
2007/07/10(火) 22:18:29縦横16ビットの2進数2値を使ったビットマップ表示を考える問題なんですが
全体で0のビット数より1のビット数が多い場合とそうでない場合とで条件分岐
させたいのですがどんな条件をつければいいのでしょうか?
説明下手ですみません…
0868デフォルトの名無しさん
2007/07/11(水) 00:09:380869デフォルトの名無しさん
2007/07/11(水) 04:56:23君の使用している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どのような値になるか求め数値を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自分の使っているアセンブラ以外にこの世にアセンブラはないと思ってるだろ?
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書き方もいろいろあるみたいですね。
私は
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決められていなければデータをどこに置くかは好みとか気分次第だから
STARTの後のラベル名がついたアドレスは実行のエントリポイントを表す
ラベル名を指定しなければSTARTの次から実行が始まる
CASLIIの仕様書を見れ
0876デフォルトの名無しさん
2007/07/12(木) 20:23:27仕様書読みました?
0877デフォルトの名無しさん
2007/07/12(木) 23:20:59命令行のラベルは無くてもいい(2.1(4))
2.2の表のほうが間違いじゃないか?
実際のところ本家のセンターのシミュレータはラベル無しSTARTを通す
ラベルありEND命令は通さないところを見ると省略可能にはあってはいけないの意味も含めるらしい
0878デフォルトの名無しさん
2007/07/12(木) 23:51:19C=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:230880デフォルトの名無しさん
2007/07/13(金) 14:30:16Cコンパイラを使ってコードを生成しろ。
以上。
0881デフォルトの名無しさん
2007/07/14(土) 22:13:26同じように見えるっていうのが困る。俺も早く低いとこ触らないとな・・!(チラシの裏)
0882デフォルトの名無しさん
2007/07/14(土) 22:26:06あまり気にしなくてもいい気がする。
0883デフォルトの名無しさん
2007/07/15(日) 02:19:030884デフォルトの名無しさん
2007/07/25(水) 21:12:23っつーか、+αの給料欲しいならアセンブラの知識も必要だぜ?
ホラ吹き営業でも給料高いけど。
なんか、質問くれくれ厨みたいな俺。
0885デフォルトの名無しさん
2007/07/26(木) 00:49:47のエラーの意味を教えてください
0886デフォルトの名無しさん
2007/07/26(木) 00:55:23CPUのマニュアル読め
せめて型式を提示すること
0887デフォルトの名無しさん
2007/07/26(木) 01:26:060888デフォルトの名無しさん
2007/07/26(木) 01:27:330889デフォルトの名無しさん
2007/07/26(木) 21:40:16CPU名とコンパイラを教えてくれないと・・。
4番目は割り算の除数が0という意味です。
3番目は、アドレス、レジスタなど入力したい対象に代入したい定数の範囲が超えたのでは?
っていうか、質問が欲しいとは言ったが、困ってるのかな?>>885
0890デフォルトの名無しさん
2007/07/27(金) 00:11:40問題文:
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#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:250893デフォルトの名無しさん
2007/07/27(金) 04:06:20実行環境は正確に。
単にMIPSと書いたらMIPS32であるとみなすからね。
0894デフォルトの名無しさん
2007/07/27(金) 08:07:12すみませんでした。
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:05J科じゃないのか
0898デフォルトの名無しさん
2007/07/27(金) 23:53:37なんでそんな冷たいのよwww
0899デフォルトの名無しさん
2007/07/28(土) 01:49:49二人とも同じ非常勤講師のテストを受けてるんじゃないか?
あるいは
どっちかがパクったんじゃないか?
そしたら、まだ解答を渡されてない方は、解答を渡された方と同じプリントをもらえるよ。
よかったな!
0900デフォルトの名無しさん
2007/07/28(土) 10:25:12とりあえず895がその答えとやらを書いてあげればいいじゃないか
0901デフォルトの名無しさん
2007/07/28(土) 14:00:25頑張って解いて、リロードしたら解答が貼られていた、とか嫌だよな。。。
0902デフォルトの名無しさん
2007/07/28(土) 14:24:190903デフォルトの名無しさん
2007/07/28(土) 22:33:42.spaceじゃだめなのか?
0904デフォルトの名無しさん
2007/07/30(月) 21:52:33が、素直に書きすぎたせいか実行速度が無茶苦茶遅いんだ。
なんとか高速化できないもんかね?
0905デフォルトの名無しさん
2007/07/31(火) 02:51:15アセンブラなんですが
OUT命令で
文字を出力したんですが
そのあと
もうひとつ出力命令すると
改行されず連続で出力されてしまいます。
例えば
ワタシ
アナタ
と出力したいのに
ワタシアナタ
なってしまいます。
ご存知の方お願いしますm(_ _)m
0906デフォルトの名無しさん
2007/07/31(火) 03:03:34お使いの環境に関するマニュアルに、出力するポジションを指定する方法か
改行する方法についての記述はございませんでしょうか。
手前どもにはそちらさまのお使いのCPUも出力機器も皆目見当がつきませんので。
0907デフォルトの名無しさん
2007/07/31(火) 03:05:57申し訳ございませんでしたm(_ _)m
CASLです。
マニュアルは手元にございません。
0908デフォルトの名無しさん
2007/07/31(火) 04:21:26情報処理技術者試験センターのページからダウンロードしろ。
試験受けるならマニュアルくらいは手元に持ってろ。
改行コードくらい出したいときに自分で出力しろ。
COMETだけでなくどんな環境だろうと、いつ改行したら良いか機械は知らない。
0909デフォルトの名無しさん
2007/07/31(火) 04:48:21OUTは文字データを1レコードとして書き出すとしか規定されていないから、
CASLの処理系によっては改行を加えないものもあるかもしれない。
試験センターで配布されているやつは改行されたよ。
出力されない処理系なら>>908の言うように改行コードを自分でOUTするしかないね。
0910909
2007/07/31(火) 04:57:26でも正確には定義されていないな。こんなにあやふやでいいのか?
仕様通りならレコード末尾のINで格納されない符号がOUTで付けられるはずだけど、
CASLの処理系って結構いい加減なものが多かったりするから。
0911デフォルトの名無しさん
2007/07/31(火) 23:45:09一回計算して、結果をディスクにぶち込む。
本番プログラムはそれを読み出すようにすれば桶。
0912rikuu
2007/08/01(水) 11:56:28入力された最大256桁の10進正整数について9の倍数か否かを判断し、結果を
出力するプログラムを作成せよ。とあるのですが、よろしくお願いします。
0913rikuu
2007/08/01(水) 13:03:071.入力を受け付ける。入力文字数が0なら終了。
2.各桁の2進数を求め、加算してゆき、合計を求める。
3.各桁の合計を9で割った剰余が0になるか調べる。
4.結果を出力する。
5.1.に戻る。
0914rikuu
2007/08/01(水) 13:15:20COMET�Uには除算命令がないので、9での割り算は9(または9の倍数)を
引くことにより行う。何回か引いた結果、ちょうど0になれば9の倍数
である。最大256桁の整数であるから、最大256回引くことになる。
演算回数を減らす方法として、90を引いてゆき、0になれば9の倍数、
負になれば9を足していき、0になれば9の倍数、正になれば9の倍数
でないとして終了する方法があるらしいです。
0915デフォルトの名無しさん
2007/08/01(水) 17:05:240916デフォルトの名無しさん
2007/08/01(水) 18:53:17まさかな・・・
0917デフォルトの名無しさん
2007/08/02(木) 02:01:36もうこのスレは宿題スレとして機能していないし、
真面目に勉強して自分の能力にみあった評価をしてもらった方がいいよ。
0918896
2007/08/02(木) 09:39:51確かに略称はJ科ですが…
昼間主と夜間主で違うとか?
もしよければその答えを書いていただけると助かります
参考にしてそこから自分なりのものを作りたいので
0919デフォルトの名無しさん
2007/08/02(木) 18:17:590920rikuu
2007/08/02(木) 20:47:040921デフォルトの名無しさん
2007/08/02(木) 20:55:48フローチャートは書けるんだろうな?
0922デフォルトの名無しさん
2007/08/02(木) 21:50:47>>917 自分の能力にみあった評価をしてもらった方がいいよ。
0923デフォルトの名無しさん
2007/08/02(木) 22:48:09何が分からないんだ。
ヒントの1〜5のどれが分からないんだ。
CASLIIの入力仕様が分からないのか?
それとも、10進数を2進数に変換する方法が分からないのか?
剰余という言葉が分からないのか?
0924923
2007/08/02(木) 23:32:24これは知ってるか?ゆとり。
ある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自分の能力にみあった評価をしてもらった方がいいよ。
0926デフォルトの名無しさん
2007/08/03(金) 22:33:30入力された数値が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:370928デフォルトの名無しさん
2007/08/04(土) 00:52:23自分の能力にみあった評価をしてもらった方がいいよ。
0929デフォルトの名無しさん
2007/08/04(土) 08:03:410930デフォルトの名無しさん
2007/08/04(土) 13:00:12アセンブリ言語の仕様として、
論理演算実行時にゼロフラグと符号フラグを0にリセットするような仕様は
非標準的ですか?
演習で出されたアセンブリ言語の仕様がそうなっていて、
もし非標準的なら文句を言おうと考えてますので参考までに。
0931デフォルトの名無しさん
2007/08/04(土) 13:01:060932デフォルトの名無しさん
2007/08/04(土) 13:08:14論理演算を行うことで、算術演算の結果なんて捨てちゃっても。
そんなことは言語レベルで判断するようなことじゃないわけだし。
0933デフォルトの名無しさん
2007/08/04(土) 13:26:030934デフォルトの名無しさん
2007/08/04(土) 13:26:260935デフォルトの名無しさん
2007/08/04(土) 14:44:20符号フラグはともかくゼロフラグまで常にクリアはありえねぇと思う。
あるビットが0か1かどうかAND命令で判定する場合とかどうすんのよ。
ハード的にも論理演算だけフラグ更新をしないなんて仕様は回路が複雑に
なるだけ不利なのは目に見えてる。
0936デフォルトの名無しさん
2007/08/04(土) 14:46:460937930
2007/08/05(日) 00:30:42どうもありがとうございます。
ゼロフラグをクリアするのはちょっと変ですよね。
その旨伝えようと思います。
また、そういう仕様のプロセッサもあるということを教えて頂き
勉強になりました。
0938デフォルトの名無しさん
2007/08/05(日) 01:25:02人間が石にあわせる他ないんだ。
0939デフォルトの名無しさん
2007/08/05(日) 06:03:190940デフォルトの名無しさん
2007/08/05(日) 09:26:26どこかで妥協しなけりゃならんのさ。
0941デフォルトの名無しさん
2007/08/06(月) 00:55:05はぁ?今、自衛隊に入っても同じ事言われますが何か?
0942デフォルトの名無しさん
2007/08/06(月) 22:29:510943デフォルトの名無しさん
2007/08/07(火) 22:08:090944デフォルトの名無しさん
2007/08/08(水) 17:46:15ここは宿題(丸投げ)スレじゃない。
宿題質問スレなんだ。
質問スレとしては、そこそこ機能してるように思う。回りくどい回答ばかりだけど。
# アセンブラの宿題隔離スレとしてはかなり機能してるかなw
0945デフォルトの名無しさん
2007/08/08(水) 17:52:280946デフォルトの名無しさん
2007/08/08(水) 17:59:48こんな広く浅い分野じゃ「アセンブラの宿題は俺にやらせろw」みたいな奇特な奴も少ないだろうし。
こんなとこじゃねえの?
0947デフォルトの名無しさん
2007/08/09(木) 06:18:270948デフォルトの名無しさん
2007/08/09(木) 07:00:330949デフォルトの名無しさん
2007/08/09(木) 07:54:08宿題お願いします。
CPUはZ80、MSX1用の機械語モニタを2K以内に収まるように作ってください。
メモリダンプ、逆アセンブル、一行アセンブルの3つが出来るだけでいいです。
単価は30円/1行(コメント行除く)でお願いします(嘘)
0950デフォルトの名無しさん
2007/08/09(木) 11:45:150951デフォルトの名無しさん
2007/08/09(木) 14:49:551桁違うな。「あたりまえにできる」ことが判っていて1000行書くだけで\60マソぐらいがプロの相場。
「できるかどうかわからない」/「受け手のスキル次第でできるかもしれない」 のコストを加味
したら、\100〜\150ぐらいまでになりそうなもんだ。 宿題丸投げにしてはデカすぎる。
095288000 なら知ってるが。
2007/08/10(金) 00:29:24どこの CPU ? > 86000
>>951
妙に安いな > \100〜\150ぐらいまでになりそうなもんだ。
0953デフォルトの名無しさん
2007/08/10(金) 01:52:040954デフォルトの名無しさん
2007/08/10(金) 02:27:45完成しなかった時の責任はだれが取る?
バイト君が給料泥棒になる可能性はかなり高い
0955デフォルトの名無しさん
2007/08/10(金) 02:42:57たしかIntelのRISCだ >86000
Motorola の 88000と同時期くらいだったと思うけど。
0956955
2007/08/10(金) 02:52:54元の質問の86000は68kの間違い?
0957デフォルトの名無しさん
2007/08/10(金) 04:30:200958デフォルトの名無しさん
2007/08/10(金) 08:55:190959デフォルトの名無しさん
2007/08/10(金) 11:15:580960デフォルトの名無しさん
2007/09/05(水) 01:37:42そんな私が学校から頂いた宿題ですが、
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命令表を見ながらやれば悩む要素なんざどこにもない。
0962デフォルトの名無しさん
2007/09/05(水) 20:53:25t1<-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:490964デフォルトの名無しさん
2007/09/05(水) 23:04:110965デフォルトの名無しさん
2007/09/06(木) 03:56:44素人ながらにナイスファイト。
一度Cコードを何らかのソフトでコンパイルして出てきたAssenblyを閲覧するというのも手だよ。
0966デフォルトの名無しさん
2007/09/06(木) 05:54:50int 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:09DSEG
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:000969デフォルトの名無しさん
2007/09/06(木) 14:49:360970デフォルトの名無しさん
2007/09/06(木) 21:07:540971デフォルトの名無しさん
2007/09/06(木) 21:46:35ebpは保存しておきたいから。
0972デフォルトの名無しさん
2007/09/14(金) 03:38:500973デフォルトの名無しさん
2007/09/14(金) 12:29:120974デフォルトの名無しさん
2007/09/15(土) 11:58:250975デフォルトの名無しさん
2007/09/21(金) 05:12:360976デフォルトの名無しさん
2007/09/26(水) 14:37:23誰か助けて下さい。
0977デフォルトの名無しさん
2007/09/28(金) 16:51:100978デフォルトの名無しさん
2007/09/28(金) 18:55:530979デフォルトの名無しさん
2007/09/28(金) 21:29:220980デフォルトの名無しさん
2007/09/28(金) 21:37:020981デフォルトの名無しさん
2007/09/28(金) 23:47:38かなづちで粉砕→水100ccを加え冷凍庫へ
0982デフォルトの名無しさん
2007/10/01(月) 18:10:44出来ました!ありがとうございました!
0983デフォルトの名無しさん
2007/10/02(火) 05:33:39string 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:180985デフォルトの名無しさん
2007/10/03(水) 02:53:03・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:03pushはプリデクリメント、popはポストインクリメントが一般的。
Cっぽく書くとこう。
Push : *(--StackPointer) = Data;
Pop : Data = *(StackPointer++);
0988デフォルトの名無しさん
2007/10/03(水) 07:23:16だと思う。
もちろん、そういうアドレッシングモードが用意されていれば、だけど。
例えば8086は無理でも、その元となった8080(Z80)にはあったはず。
0990デフォルトの名無しさん
2007/10/03(水) 10:50:020991デフォルトの名無しさん
2007/10/03(水) 12:36:520992デフォルトの名無しさん
2007/10/03(水) 14:16:20アセンブリ言語好きのお兄さん・お姉さんに尋ねるスレ。
・必ずCPUの名前を書くこと!
・情報を小出しにしない。書ける情報は全て書いた方が得だよ。
前スレ
アセンブラの宿題質問スレ
http://pc11.2ch.net/test/read.cgi/tech/1161097445/
これで誰か新スレを!
0993デフォルトの名無しさん
2007/10/03(水) 14:30:02スタックポインタの演算とロード・ストアをアトミックにやる必要がないからじゃないの?
0994デフォルトの名無しさん
2007/10/06(土) 15:32:54http://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:150996デフォルトの名無しさん
2007/10/07(日) 05:20:080997デフォルトの名無しさん
2007/10/07(日) 05:23:020998デフォルトの名無しさん
2007/10/07(日) 05:23:390999デフォルトの名無しさん
2007/10/07(日) 05:26:281000小倉優子 ◆en0rG2J.f6
2007/10/07(日) 05:27:0210011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。