アセンブラの宿題ができないときに、 アセンブラ好きのお兄さんに尋ねるスレ。 ・必ずCPUの名前を書くこと! ・情報を小出しにしない。書ける情報は全て書いた方が得だよ。
HLT
ファミコンアセンブラはまじで楽しい。 それ以外のアセンブラなんて人間にすすめるもんじゃない。
質問で失礼します。 [8085h]←[8051h]+[8052h] を計算し、符号付2進数加算としてのオーバーフローを判定する 8085プログラムで書けという問題なのですがまったく分かりません。 どなたか分かる方教えてください。よろしくお願いします。
パリティーフラグでオーバーフローを検出できるのはZ80からだっけか。 まあまず、8bitの2の補数を足したときにオーバーフローする条件を考えてみれ。
7 :
デフォルトの名無しさん :2006/10/18(水) 03:12:34
nop
盛り上がらないよなやっぱ
>>5 LDA 8051H
MOV B,A
LDA 8052H
ADD B
PUSH AF
STA 8085H
POP BC
MVI A,02H
ANA C
JNZ OVERFLOW
10 :
デフォルトの名無しさん :2006/10/22(日) 11:20:40
Verilog-HDLを使った下記URLの問題で悩んでいます。
プログラム全体は自分で頑張って作ってみようと思っているのですが、
32ビットの整数値を予め用意しそれを操作する方法が分かりません。
命令自体が32ビットなのに32ビットの数なんて操れるのでしょうか?
addi命令でも操れるのはせいぜい24ビットだったような気がしますし、
5個も足したら普通にオーバーフローしてしまうんじゃないかとorz
http://www.za.ztv.ne.jp/yosi-h/v6010005ffffff.jpg
キーボードから正整数n を入力し、n の階乗n!を計算してディスプレイに出力せ よ。ただし、n!の計算にはACC に結果をセットするサブルーチンを用いること。 [解答例] .EQU @,$000 .EQU stk,$700 LDS# stk JSR GET_NUM PSHA JSR fact JSR PUT_NUM HLT .EQU @,$100 .EQU n,2 fact: PSHF TSF POPX do: LDA! n CMA# 0 JLE end MUL res STA res DEC! n JMP do end: LDA res POPX POPF RTN res: .WORD 1 .END これってもっと簡単に書ける?
キーボードから正整数n(>0)を入力し、1〜n番目のフィボナッチ数f<1>〜f<n>の各々を サブルーチンで計算し、全て呼び側(caller)でディスプレイに出力せよ。 ただし、f<I>は次のように定義される。 :f<1> f<2> = 1, f<i> = f<i-1> + f<i-2> (i>=3)。 また、iとfibonをcallerの局所変数とするとき、フィボナッチ数f<i>を計算するサブルーチンは 2つのCBA引数iとfibonを受け取り、f<i>を変数fibonにセットして戻るように作れ。 お願いします。
せめてクピュ名をかけy
14 :
デフォルトの名無しさん :2006/10/23(月) 00:31:10
すみません教えてください 問題 もしコンピュータが直線的な処理しかできないとすると、0番地から計算を始めても主記憶の最後の番地までの命令をただ実行するだけでそこで終わってしまう。 1GBの主記憶であるとして、全ての命令が仮に2バイトで表せたとして、 ・何命令収容できるか ・全部の命令を実行するのに、どれくらいの時間がかかるか PDP11のプログラムカウンタとかについての問題です 答えだけじゃなくて説明をしなければならないので、できるだけ解説もお願いします よろしくおねがいします
>>14 1命令2byteだから1GBで0.5G命令、つまり2^29命令、
1命令に1クロックかかるなら2^29クロック。
1MHzなら、これは537秒くらい。
と、書いてはみたが、俺は勘違いしているような気がしてきた。
PDP-11のプログラムカウンタって16bitじゃなかったっけ、とか プログラムカウンタの上限までいったら次は0番地に戻るんじゃないか とかいうツッコミはダメですか?
17 :
デフォルトの名無しさん :2006/10/23(月) 00:50:37
ちょ待って・・w わけわかりません・・・ 勘違いって?
18 :
15 :2006/10/23(月) 00:53:58
>>17 俺は
>>16 みたいなことを考えずに書いちゃったわけ。
出題意図がイマイチわからんしな。
19 :
デフォルトの名無しさん :2006/10/23(月) 00:55:24
0番地に戻る・・?16・・? すみませんわかりません
20 :
デフォルトの名無しさん :2006/10/23(月) 01:10:36
どなたか教えてください。。。
21 :
デフォルトの名無しさん :2006/10/23(月) 01:34:54
お願いします!
23 :
デフォルトの名無しさん :2006/10/23(月) 02:31:10
すみませんが急ぎなので教えてください・・ そもそもここはそういうスレですし 基礎的で申し訳ありませんがよろしくお願いします
気が向いた人が答えるスレ 他の人が課題に挑戦するスレ だよ。 おまえの単位を取るためのスレじゃないのだけは確か。
>>23 問題が意味不明
GBを理解してるか、の問題?
どんな命令を実行するのかわからないのに、
どれくらいの時間がかかるかなんてわからない
直線的な処理しかできないってのは、仮にプログラムカウンタが存在しなくて、 0番地から順に命令を実行できるのみだとしたら、と考えるんだろう? 命令数は簡単だから省く。 1命令って、どういうプロセスで実行されるんだっけか? 読み出しに1クロック、解釈に1クロック、実行に1クロックで、合計3クロックか?
書き戻しもあるぞよ
いまどきのプロセッサはそう単純にはなってないだろうが 昔は、fetch, decode, execute, writeback の4つに分類されてたな。
29 :
デフォルトの名無しさん :2006/10/23(月) 08:36:07
Verilog-HDLを使った下記URLの問題で悩んでいます。
プログラム全体は自分で頑張って作ってみようと思っているのですが、
32ビットの整数値を予め用意しそれを操作する方法が分かりません。
命令自体が32ビットなのに32ビットの数なんて操れるのでしょうか?
addi命令でも操れるのはせいぜい24ビットだったような気がしますし、
5個も足したら普通にオーバーフローしてしまうんじゃないかとorz
http://www.za.ztv.ne.jp/yosi-h/v6010005ffffff.jpg
2つだけでもオーバーフローは起きる
31 :
デフォルトの名無しさん :2006/10/23(月) 12:51:32
>>14 です!
教えてくださいお願いします
問題は書いた通りです
補足です
学習範囲は実行制御にかかわる命令というところで、GBとかも習いました
教科書によるとプログラムカウンタは2ずつ増加していくけど、直線的な処理にとどまるらしいです
そこでジャンプ命令と条件分岐命令が用意されており、柔軟な処理が可能になると書いてあります
急ぎですのでなるべく早くお願いします!
33 :
デフォルトの名無しさん :2006/10/23(月) 14:38:55
結局自分で考えて提出しました‥ 答えも教えてもらいましたが全然違いました‥このスレの人のも もうかなりヤバイです(ノд`) 答え1問目は5億何ちゃらというとんでもない数字でした 2問目はそれに10の-9乗掛けたものです そもそもクロックとかまだ習っていませんでしたし‥ 皆さん難しく考えすぎだったのでは‥
2^29=5億何ちゃらだから
>>16 で合ってたじゃん。
それに10^-9をかけるということは1GHz動作だったんだな。
問題に1GHzって書いてなかったん?
2^29=536870912だろ。何がヤバイんだ?
答えを教えてもらっても駄目な奴っているんだな
クロック習ってないのにどれくらいの時間がかかるか、なんて問題出るの?
0.5秒で1GB処理するのか
40 :
デフォルトの名無しさん :2006/10/23(月) 16:34:35
>>34 書いてないです
>>36 間違えた答えで提出してしまったことです
>>38 出ましたね‥
クロックは教科書のその20ページ後ぐらいに初めてでてくるようです
全ての命令が一秒待つとかだったら17年かかるな。
>答えも教えてもらいましたが全然違いました‥このスレの人のも
だから
>>15 で合ってるじゃん。何が違うの?
もしかして2^29=5億何ちゃらって理解してなかった?
43 :
デフォルトの名無しさん :2006/10/23(月) 20:10:49
問題です。お願いします。 ラベルA、B、Cにそれぞれ、10、20、5という整数値が格納されている。 A−B+Cの値を計算してラベルDに格納するプログラムを作成する。 ただし、プログラムの先頭4桁は次の形式(54*****は学生番号、 YAMADA TAROUは氏名)とすること。 54***** YAMADA TAROU EXIT START
なんでクピュ名かかないやつ多いんだ
わからない人のために補足しておくと、 クピュとはCPUのことです。
dc.b 54xxxxx label_a: ds.b 1 label_b: ds.b 1 label_c: ds.b 1 clr.b d0 loop: add.b #1, d0 cmp.b #10, d0 bne loop move.b d0, d1 add.b d1, d1 move.b d1, d2 lsr #1, d2 move.b d0, label_a move.b d1, label_b move.b d2, label_c あー、アセンブラなんか書いたの 13年ぶりぐらいだから lsrの意味がよく思い出せねえんだけど右に一桁ずらすんだっけ?w ワードしかだめなんだっけ?
お願いします。 8085CPUで _ _ A←B・C+D ・ E (論理演算) という問題なんですが、さっぱりわかりません。プログラムのキーポイントと一緒に解説をおねがいします。
>>47 その形式ならサイズ指定してやればバイト/ワード/ロングワードのどれでもいける。
lsr -4(A0)とか、lsr $C00000とか、lsr LABELとかやると、ワード限定になる。
あと、漏れならこう書く。
.include DOSCALL.MAC
.text
moveq #4, d0
lea D, a0
loop: swap d0
addq.w #1, d0
swap d0
dbra d0, loop
swap d0
move.w d0, -(a0)
lsl.w #2, d0
move.w d0, -(a0)
lsr.w #1, d0
move.w d0, -(a0)
swap d0
add.w (a0)+, d0
sub.w (a0)+, d0
add.w (a0)+, d0
move.w d0, (a0)
addq.w #1, (a0)
DOSCALL EXIT
.data
A: ds.w 1
B: ds.w 1
C: ds.w 1
D: ds.w 1
>>48 キーポイント:何も無し
MOV A,B ;アキュームレータにBを転送
ANA C ;アキュームレータとCの論理積をとる
MOV B,A ;結果をBへ待避
MOV A,D ;アキュームレータにDを転送
ORA E ;アキュームレータとEの論理和をとる
CMA ;結果の否定をとる
ORA B ;アキュームレータとBの論理和をとる
HLT ;プログラム停止
>>50 詳しい解説付きでどうもアリガトウ御座います。
52 :
47 :2006/10/25(水) 21:52:00
>>49 DOSCALL.MACってなつかすぃものを見たーーーーーーw
ところで学生って、デバッガ使わせてもらえないの? オレは自力で覚えたから知らんが、全部、紙とか黒板で理論のみ習うわけ? んなわけないと思うけど デバッガで遊んでレジスタの変化とか見てれば、各命令の動作なんてすぐ覚えられると思うんだけど。。。
54 :
デフォルトの名無しさん :2006/10/26(木) 08:59:47
MINIPSアセンブラです。jalr命令(jalr r1,r2:プログラムをr2レジスタの値の示す アドレスへ分岐させる。その際に、復帰アドレスがr1レジスタに格納される) を使って再帰的に以下のCプログラムをアセンブラにしたいのですが、 C言語を作るまでで若干力尽きております。ご教授いただければ幸いですorz int func(int j){ if(j==0){ return j; } return j+func(j-1); }
>>54 gccがその環境にあるかしらんけどコンパイラオプションに
アセンブラコードをはかせるよう指定してみたらいかがかと。
gccの場合
#gcc -S test.c
#vi test.s
・test.cの中身
nt func(int j){
if(j==0){
return j;
}
return j+func(j-1);
}
//コンパイラを通すためのダミーのmain
main(){
return(0);
}
56 :
54 :2006/10/26(木) 11:07:08
>>55 ご回答ありがとうございました。
gccってそんな機能があったんですねorz
使えると思いますので、学校に行ったら試してみたいと思います。
>gccってそんな機能があったんですね というか、C言語をアセンブリ言語に落とすのがCコンパイラの仕事だが。
58 :
55 :2006/10/26(木) 11:34:48
質問しようと思ったら、全く同じ問題があってワラタ
60 :
デフォルトの名無しさん :2006/10/28(土) 19:58:33
誘導されてきました。 VerilogHDLを用いたMINIPSアセンブラについてですが、テキストに 1: initial begin 2: InstMem.mem_data[0] = 32'h20011234; // addi $1, $0, 0x1234 3: InstMem.mem_data[1] = 32'hac030004; // sw $3, 4($0) 4: InstMem.mem_data[2] = 32'hfc000000; // halt 5: end という書き方と ADDR: Instruction #Mnemonic 0000: 20010001 # addi $1, $0, 1 0004: 0061202a # slt $4, $3, $1 0008: fc000000 # halt という書き方(InstMem.mem_data[]= があるかないか?)があるのですが、 これらはどういった違いがあるのでしょうか?
61 :
デフォルトの名無しさん :2006/10/30(月) 23:22:20
宿題です、分かる方お願いします。 ラベルAに整数(たとえば10)が格納されている。 Aを4で割ったあまりをラベルBに入れ、さらにAを9倍した値をラベルCに いれるプログラムを作成せよ。
答えがわからないなら書き込まなくていいです
頭おかしい奴だなw
65 :
62 :2006/10/30(月) 23:44:53
>>63 確かにCPUによっては俺は答えられない。
だが、CPU名が書いてないと、
答えを書きたい人がいても答えられないんだ。
>>1 も読めないような奴だから、こんな問題も解けないんでしょう。
ほっとけばいいよ。
>>60 前者はシーケンシャルに実行される、ってことは、代入するコードが生成される。
後者はプロセッサの初期化時に値がロードされる。
FPGAなんかだと外部からロードされるデータの中に値が含まれてる。
ってことだと思う、 VerilogHDLは経験が無いけどきっとそう。
なんだよアセンブラって。
>>62 に禿同。
んじゃ
>>63 と
>>66 に問題だ。
ldi r30,low(0x60)
ld r16,r30
ldi zl,16
ld r17,z+
cp r16,r17
brne NG
rjmp OK
意味書け!
もちろんアセンブラですけど。
なんだろう、レジスタが30本以上(おそらく32本であとはPCとSP) でzlがレジスタっぽいし、分岐がbrってことは、AVRかな?
どうでもいいが痛い奴二人の 「どっちがより痛い奴か」 の競争にしか見えません俺には。
はい次の方、質問をどうぞ。 CPUと環境を明記してね。
72 :
68 :2006/10/31(火) 00:55:51
>>69 正解。だが、お前の発言は面白くもなんともねぇ。
何故なら、お前には聞いてないからだ!ボケ
73 :
69 :2006/10/31(火) 02:04:57
>>72 だから質問にある「意味」には答えてないだろ、
よくよめカス!
>>73 意味についてでなく
CPUが解らなければ
答えられないということを解らせなければいけなかった。
ということではないかな?
そういう流れだと思うが。
ソースだしたらCPU解かっちゃうからなぁ
>>62 を見た時点でCPUでも書いてりゃよかったのに
開き直っちまうからこんなことになる
77 :
デフォルトの名無しさん :2006/10/31(火) 18:28:24
MINIPSアセンブラ(?)です。 FFFFFF00番地に1→11→111と値を変えながら入れていくプログラムなのですが、 bne前後でエラーが起こって1周目で終了してしまいます。 もしかしたらプログラム以外の問題である可能性もありますが、 プログラム、アルゴリズムに問題はありますでしょうか? addi $1, $0, FF00 luiと合わせて、$1にFFFFFF00を入力する処理 lui $1, FFFF addi $2, $0, 1 $2=1 addi $3, $0, 0 $3=0 addi $4, $0, 500 $4=500。この数字は大きければいいだけで特に意味なし slt $5, $4, $2 ←L1 bneと合わせて、$4<$2になったらhaltへ行く処理 bne $5, $0, L2 add $3, $3, $2 $3に$2を足し込んでいく sw $3, 0($1) $3の値をFFFFFF00へ add $2, $2, $2 $2は繰り返しのたびに2倍に beq $0, $0,L1 halt ←L2
ググッたら、教育用のCPUか>MINIPS 分岐命令の後ろに、nop入れろ
ここでFPGAにMINIPSコアを乗せている
>>60 が登場!
>>79 そんなやつおらんやろー。
そもそも、架空のCPUコア乗せてるのが信じられない。
ARMや8051とかならまだしも。
COMET も架空かな
「オレほどCPU持ってるやつはいない。100個持ってる。」
教育用の架空のコアだから、FPGAに乗せるのも学習の一環だと思うな。 ソフトウエアでのエミュレータなら普通にアリだろ?
計算機基礎 アセンブラ・プログラム演習問題
1.キーボードから上底、下底、高さを入力し、台形の面積をディスプレイに出力せよ。
2.キーボードから底面の縦・横の長さ、高さを入力し、四角錐の体積の体積をディスプレイに出力せよ。
3.キーボードから整数を入力し、その値の偶数/奇数を判定し、「odd」/「even」をディスプレイに出力せよ。
4.キーボードから整数nを入力し、を求めて、結果をディスプレイに出力せよ。 Σ=nii1
ただし、ループを使う方法と2)1(+nnの2通りで計算し、両方出力すること。
5.キーボードから西暦(1868≧)を入力し、年号に変換しディスプレイに出力せよ。
(参考)
明治(m):1868-1912
大正(t):1912-1926
昭和(s):1926-1989
平成(h):1989-2006
(例)
入力 出力
1900 → m33
1926 → s1 (新しい年号優先で表示)
誰か一問でも出来たらやってください!
授業では
ttp://www.k.hosei.ac.jp/~i05r4102/までやりました 。
疲れるし、つまんないから仕事じゃなきゃやらなーい。 出来たから何って感じだし。 スレ違いだし。
86 :
85 :2006/11/01(水) 22:56:14
あ、すまん。
>>84 じゃないよ。
FPGAやらの話してるやつへのレスね。
>出来たから何って感じだし。
>>84 とりあえずCUSPエミュレータとアセンブラを貰っといた。しばらくは楽しめそうだ。
で、ちょっと読んで書いたのが↓。
問1.
.EQU @,$000
JSR GET_NUM
STA uhen
JSR GET_NUM
STA lhen
JSR GET_NUM
STA h
LDA uhen
ADA lhen
MUL h
JSR PUT_NUM
HTL
uhen: .WORD
lhen: .WORD
h: .WORD
.END
問2 .EQU @,$000 .EQU StkTop,$700 JSR GET_NUM STA h1 JSR GET_NUM STA h2 JSR GET_NUM STA h LDA h1 MUL h2 MUL h DIV# 3 JSR PUT_NUM HLT h1: .WORD h2: .WORD h: .WORD
問3 .EQU @,$000 .EQU StkTop,$700 JSR GET_NUM SHRA JOV putodd LDA 'e' JSR PUT_CHR LDA 'v' JSR PUT_CHR LDA 'e' JSR PUT_CHR LDA 'n' JSR PUT_CHR HLT putodd: LDA 'o' JSR PUT_CHR LDA 'd' JSR PUT_CHR LDA 'd' JSR PUT_CHR HLT .END
問4 .EQU @,$000 .EQU StkTop,$700 LDS# StkTop ←問2と3もこの行追加して JSR GET_NUM STA n PSHA LDA# 0 loop: ADA n ←ここからloop版 STA a DEC n JNE loop JSR PUT_NUM POPA ←ここからn(n+1)/2版 STA n INC n MUL n DIV# 2 JSR PUT_NUM HLT n: .WORD .END
問5 入りきらないんで複数行を一行に纏めた箇所がある。(一目でわかるよね) .EQU @,$000 .EQU StkTop,$e00 LDS# StkTop JSR GET_NUM PSHA CMA# 1989 JGE PutH CMA# 1926 JGE PutS CMA 1912 JGE PutT LDA# 'm'←問3の似た行LDA ' 'をLDA# ' 'に直して JSR PUT_CHR LDA# 1867 STA y JMP PutN PutT: LDA# 't' JSR PUT_CHR LDA# 1911 STA y JMP PutN PutS: LDA# 's' JSR PUT_CHR LDA# 1925 STA y JMP PutN PutH: LDA# 'h' JSR PUT_CHR LDA# 1988 STA y PutN: POPA SBA y JSR PUT_NUM HLT y: .WORD .END
94 :
デフォルトの名無しさん :2006/11/02(木) 15:01:17
久しぶりに宿題板みたいになってきたな♪(゚д゚)ウマー
95 :
デフォルトの名無しさん :2006/11/02(木) 23:57:40
微妙にスレ違いかもしれませんがここに書きます。 アセンブラの課題が出たのでWinXPにcygwinを入れてその動作や命令について勉強しようと思ったのですが、 cygwin自体は何とか入った(?)もののソースを書いて〜.sとして保存後、 $ gcc 〜.s としてコンパイルしようとしても /usr/lib/gcc-lib/i686-pc-cygwin/3.3.3/../../../../i686-pc-cygwin/bin/ld: cannot find -luser32 collect2: ld returned 1 exit status と表示され実行ファイルは何も作られません。 これは〜.sファイルをコンパイル出来るパッケージ(?)が入っていないせいで、 それを入れれば上手く行くのか、cygwinのインストールが上手く行っていないのか、 それとも単純にコマンドを間違えているのか、何か根本的に間違えているのか… 全く手詰まりになってしまったので何か助言をいただけないでしょうか…。
ありがとう。 ということはインストールが上手く行っていないのか…。 確かにインストールの途中で固まって以後すすまなくなってた。 アンインストールインストール…と繰り返すうちに訳が分からないことになってる…。
98 :
95 :2006/11/03(金) 03:32:32
ダメだ…何度やってもインストールの途中で固まってしまう。 w32apiパッケージのlibuser32.aというのを入れれば動くという事は分かっても入れ方が分からない…。 他の質問者の人はインストールし直すと正常に動くようになったとあるけれど 自分の場合はインストールし直そうとするとほぼ確実に途中で固まってうまくいかない。 どうすればいいんだ…。
>98 どこでどう止まるの? ファイルのダウンロード中?コピー中? 何のファイルでとまる?
100 :
95 :2006/11/03(金) 05:33:41
>100 それは普通「正常に終了」とは言わないケド… …でも何で止まるんだろ。 ごめん。訊ねたけど判らないっす。
普通にCygwinのサイトからダウンロードしてきたら? 遣り方についてはスレ違いにつき割愛。
103 :
95 :2006/11/03(金) 15:18:10
cygwinのサイトから入れてみました。 エラーメッセージが増えましたorz $ gcc 〜.s /cygdrive/c/DOCUME~1/(user)/LOCALS~1/Temp/cchKzoMI.o:fake:(.text+0x9):undefined reference to 'printf' /usr/lib/gcc/i686-pu-cygwin/3.4.4/../../../libcygwin.a(libcmain.o):(.text+0xab): undefined reference to '_WinMain@16' collect2: ld returned 1 exit status
printf() と main() ガ見つからない、ってさ
要するにやっぱライブラリがみつかんねぇってこった。
解決案その1 gccを介さず、素直にasとldを自分で呼び出して使う。 解決案その2 gccに-nostartfilesオプションを指定する。 あと、ソースは公開しよう。
107 :
デフォルトの名無しさん :2006/11/05(日) 17:31:28
で、何を教えりゃいいの? LC-3 Simulatorとマニュアル、命令セット&アーキテクチャ資料の入手法?
109 :
デフォルトの名無しさん :2006/11/05(日) 19:58:31
教授によると、その画像(数式)をアセンブラで作成せよ ということでした、
110 :
デフォルトの名無しさん :2006/11/05(日) 21:15:03
ある特定のメモリ番地の値がディスプレイに出るだけのハードウェアを使って その値を変えることで様々な表示をさせることを実習でやったのですが、 もっと複雑なハード(PCのキーボードやマウス、ディスプレイ)もCPU(アセンブラ)から駆動できるそうです。 どのような方法で実現されているのでしょうか?若干スレ違いになるようで申し訳ないoですrz
>>110 >どのような方法で実現されているのでしょうか?
いろいろ。
その実習のようにメモリ空間に周辺機器のI/Oをマッピングしたり、
CPUによってはI/O専用のアドレスを持ってるのでそこに配置したり。
>>111 ありがとうございました。皆さん物知りで大変助かります^^;
いや、あんたが物を知らないか調べる能力がないだけだ。
プログラマーになるつもりなのか知らんが 希望する情報を自分で探し出せない能力は プログラマーに必要な素質がかけてるようなきガス 昔に比べりゃ、googleなんて便利なものがあって なんで探し出せないか不思議だわ。 やる気ないとしか思えん。
教えてgoo!で、ググって出た答えを書いてあげると感謝されるもんね!
>メモリ空間に周辺機器のI/Oをマッピング >I/O専用のアドレスを持ってるのでそこに配置 これ、理解してて書いてるならタダモノではない気配。
メモリマップドI/Oとか、I/OマップドI/Oとか言ったかな。 昔8bit機いじってたヤツなら結構知ってるんじゃね?
どっちもメモリマップドの話にしか見えない。
>>116 いや、君が何を言いたいのかそれだけじゃよくわからんが、
たぶん君が無知なだけだと思うよ。
120 :
デフォルトの名無しさん :2006/11/06(月) 21:09:35
>>108 遅レスですみません、さきほど教授に聞いたら、問題は
Task: write a program (in machine code for LC3) which does the following:
1) creates an array of 30 numbers, A[i]=(i+3)*(1+(-1)^i), writes
this array into the memory, and then
2) reades the integer numbers A[i] from memory, and sums them up,
i.e. R=Sum(A[i], for i=1,..,30).
だそうです、どなたかお願いできないでしょうか?
だからね、LC3が何者か提示しないと話が進まないと思うのだが。
>>114 日本語大丈夫か?
>>120 そのLC3やらの言語と俺らが知っている一般的なアセンブラは必ずしも同じじゃないんだよ。
あと、その問題のどの辺りが分からんのかも教えてくれ。一から作らす気か?w
>>120 ここは宿題が分からないときに質問するスレであって変わりに宿題してもらうスレじゃないんだよ。
誤解するな。
そもそも問題の内容自体理解してない様だから、もう1年受け直した方がいいな。
>>119 IOマップドは普通「I/O専用命令」の下りがあるもんだ。
メモリマップドとの区別ついてないだろ?
あと
>>110 はDMAの可能性もある。
127 :
デフォルトの名無しさん :2006/11/07(火) 01:27:36
質問者が納得してるんだからいいんじゃねーの?
【ちょっといいですか?】 不勉強な人が不勉強な人にでまかせを教えるのはやめましょうw 最悪ですw 本当にどうもありがとうございました。
131 :
デフォルトの名無しさん :2006/11/09(木) 00:43:33
初めまして、最近アセンブラを始めました。 現在、アセンブラでの計算に悩んでいます。 今回出た課題はw=x+5*y*z+4と言う式があり、 キーボードからインプットされた数字をx、y、zにいれてwを出したいんです。 先程、自分で入力された数が正の数だったらちゃんとした答えが出るようには出来たのですが、 答えが負の数になると何か変な数値が出てきます。 どうか教えて頂けると幸いです。 CPU:Intel Pentium 4 CPU 3.00GHz
>>131 まず、負の数を表示すること自体ができるか(出力だけが間違ってる)、
次に、乗算でmulでなくちゃんとimulを使っているか(計算が間違ってる)、
この2つは大丈夫ですか?
と思ったが、
Nbitの整数同士を掛け算した結果の下位Nbitは、符号付きかどうかに関係ない
のだった。mul使っても普通は大丈夫だね。
>>131 の掛け算を見てふと思い出した。
2次元配列の値をアセンブラで出したいのですが、例えば
A[0][0] * A[1][1] - A[0][1] * A[1][0] = 3000 * 300 - 2000 * 400
のように結果的な値はある程度小さくなっても途中の計算が大きくなる場合、
効率的に計算するにはどのような方法がありますでしょうか?
A[1][1]の回数A[0][0]を足し込んで・・・とかやってたらアホみたいなサイクル数になったorz
>>133 掛け算もないCPUなの? Z80かなんかの8ビットCPUとか?
だとしても、その程度の話ならCで足し算で掛け算を実装してみればいいじゃん。
掛け算の両辺の大小見たりシフトで代用できないか検討したりするだけ。
#8ビットCPU用のCコンパイラのアセンブル出力覗いてみてもいいね。
135 :
133 :2006/11/09(木) 17:18:45
>>134 CPUはFPGAというのでしょうか?作ったら使えるのかもしれませんが残念ながら掛け算はありません。
大小を見るというのは繰り返し回数に持ってくる方の変数は小さい方がいいからということでしょうか?
シフトについても、シフトを使うことでサイクル数が少なくて済む処理があるということを
聞いたことがある程度なのですが、どういったアルゴリズムなのでしょうか?
3000*300を300000*3にするようなイメージでしょうか?
質問ばっかりになってしまって申し訳ないですorz
>>133 A≒C、B≒Dという場合にはこれが使えるかも。
A*B-C*D=(A-C)*B+(B-D)*C
ていうかCPU名を書いてくれないと答えようがない。
普通の32bitCPUならこんな小細工は全くの無意味だし。
>>134 例えばimul eax,8の代わりにsal eax,3とするとか。
これもCPUによって素直にかけ算した方が速いことがあるから注意。
138 :
134 :2006/11/09(木) 18:38:35
>>135 FPGAか、納得。それじゃこったことは何もできないと思った方がいいねぇ。
#つーか、それこそノウハウの塊だから先人に教えを乞う方がよくね?
スレ違いかもしれませんが・・・ CPUに関して勉強中なんですが、2バイトや4バイトでメモリに1回でアクセスするのに 番地は2や4の倍数である必要があるらしいんですが、なんでですか? 奇数アドレスの2バイトアクセスは、どの辺が困るのかわかりません。 CPUはARMです。
>>139 こういう風に16byteのメモリがあったとする。
00──┐
04──└─→CPU(アドレス00から4byte読む)
08──
12──
00──
04────→CPU(アドレス04から4byte読む)
08──
12──
こういう配線になってたらアドレス02から4byte読めないだろ?
こういう制限が出てしまうくらい配線が大変だということだ。
バスがエラーだ、電車を使え
142 :
139 :2006/11/10(金) 10:15:08
>>140 1バイト用、2バイト用、4バイト用の配線があるというわけですね?
CPUじゃなくてバスの制約に引っかかるんですか。 ありがとうございました。
>>142 いや、たとえば4バイト境界から一度に4バイト読む配線だけ用意した場合、
02番地から4バイト読む時は2回読んでくっつけなくちゃいけない。
読み出しのコストが倍かかっても読んでくれるCPUと、「それ、おかしいだろ」
ってエラーにするCPUとがある。
ARMさんはちょっとわがままなRISCプロセッサなので 「ちょっと!メモリの読み出しに2回もコストをかけたら、一定速度での命令実行なんて出来ないじゃない!」 「私に読んで欲しかったら、アドレス境界を4の倍数に合わせなさい!さあ、はやくっ!」 と文句を言ってしまうのだ。許せ。
145 :
139 :2006/11/11(土) 00:00:04
>>143 >一度に4バイト読む配線だけ用意した場合
これはメモリスペックで言うバス幅が32ビットであるということでしょうか?
んでこれが境界を決めているというわけですか?
バス幅が16bitなら2バイト毎のアドレス、64bitならば、8バイト毎のアドレス、みたいな感じで・・
>>145 >メモリスペックで言うバス幅が32ビット
CPUアーキテクチャでいうバス幅が近いかな、とおもう。
最近のCPUはキャッシュや内部RAM/ROMを持ってたりするから
単純にこ〜だ、とは言えない。
設計する時に決める事、ってかんじ。
バス幅128ビットにしました、けど互換性確保したいから
4バイト境界です、って可能性もある。
かつてIntelは8085の後継として16ビットCPUを開発していた。 16ビットCPUとは言え、メモリが今とはビット単価も占有面積も違う時代。 まして8ビットバス版の8088の存在もある。当然の如く命令長は1バイトからの可変長とされた。 そこではたと気付く。「命令長が奇数だったら、次の2バイト命令がワード境界を跨ぐじゃん。」 斯くして現在にまで続く可変命令長の際物CPUができあがったというわけ。 一方Motorolaは68000の開発に当たって素直に命令長を2の倍数のみとした。 そのために3ビットイミディエイト加減算なんて命令までできることになったが、 それはまた別のお話。
バカ基本的な質問をさせてください IA-32 on NASM です サブルーチンの先頭でよく見かける push ebp mov ebp, esp は、何をしてるんでしょうか? ebp を push する意味って esp を ebp に mov するためですよね? この mov って必要なんですか? 引数とからんでる気はするんですが・・・ 教えてください><
ばかぁ><
>>139 どうせこんなスレでまじめに聞いてやしないだろうけど、
あんまりこのスレの連中のいうこと真に受けない方がいいよ。
俺も本当の理由をソース付きで答えられるわけじゃないけど、
それは恐らくCPU側の都合というよりもアドレスをデコードする側(つまりメモリとか
デバイス)側の問題でしょう。
任意アドレス指定でアドレスされても常にバス幅のデータを正しく吐き出すような
回路が複雑になることってなんとなく想像できるでしょ。
152 :
デフォルトの名無しさん :2006/11/11(土) 14:56:38
>>151 thx!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
153 :
139 :2006/11/11(土) 15:10:34
>>146 >バス幅128ビットにしました、けど互換性確保したいから
>4バイト境界です、って可能性もある。
メモリのバス幅が128ビットで、CPU−メモリ間のデータバス幅が32ビットという場合ですね?
データバス幅を32ビットにすると、メモリアクセスは、4の倍数のアドレスから4バイトだけ、
という方法しか許さなくなるわけですか。
>>150 結構収穫ありました。 ググってもさっぱりわかりませんでしたし。
>任意アドレス指定でアドレスされても常にバス幅のデータを正しく吐き出すような
>回路が複雑になることってなんとなく想像できるでしょ。
回路のことはさっぱりわかりませんで、想像出来ませんでした。
わけわかめ
>>153 >147
>150こそ滅茶苦茶だから。
設計次第でバス幅は関係ない。 ハードにその機能があるかどうか。
158 :
139 :2006/11/11(土) 16:10:03
>>156 メモリに
・2の倍数のアドレスから2バイトアクセスする
・4の倍数のアドレスから4バイトアクセスする
みたいな機能があるってことですか?
そんな訳のわからんこと言ってる奴ほっとけってw 古典的なISAバスでも何でもいいから、メモリやデバイスのアドレスデコード回路が どうなってるかを調べれば自ずとわかるよ。
>>156 そう作るのが大変だから今の設計はほとんどそんな風に
作ってないって話だろうが。
メモリ読みだし単位は決まってた方が作るのに便利って事。
大体から、昔から1ビット単位じゃなくて1バイト単位でアクセスするって
お約束もあっただろ?
ARMの命令長は常に1ワード=4バイト。Thumb命令なら1ハーフワード=2バイト。 素直に並べりゃ絶対にアドレス境界を跨がない読み出しになるんだから、 奇数アドレスから読めないことで一体何が困るのか逆に理解できない。
>140 >143 あたりで説明おわっとるがな
139<どうしてぼくの思ったとおりにならないんですか?
164 :
139 :2006/11/11(土) 17:44:07
CISCでも境界を跨げないなら、その境界ってのはどこの制約なのか気になったのです。
>>140 を見る限り、境界はメモリの構造によるものと考えていいんでしょうか。
だからメモリというよりバスというものの構造から来る制約だといってるだろw っていうかどうせHW勉強する気がないんだろ? だったらそういうことにいちいち疑問を持たず、そういうものだと思う態度が正解。 勉強する気もないのにいちいちドチテ坊やするのは愚の骨頂っていうんだよ。
>>164 >147も書いているが、各々のプロセッサ設計段階での事情を反映しているだけ。
制約云々は二の次。
はぁ。 それ優先順位としては逆だと思いますが。。
っていうか、任意アドレスにアクセスできるようにしようと思ったら どんなハードにする必要があるのか考えれば自明だろうに。。 データバス8本ごとにアドレスデコーダ付けるような冗長な回路が一つの方法だが、 そういう冗長な回路が必要になるだろ
>>167 設計・製造コストと機能のトレードオフは、工業製品としてはあたりまえ。
宿題クル?
m|||-_|||m<キットクル〜
172 :
デフォルトの名無しさん :2006/11/13(月) 09:19:40
>>173 失礼しました。誘導ありがとうございます。
定数(75と37)を確保しその輪をGR1その差をGR2に算出せよって問題わかりますか?
75と37の輪?
和の間違いでした
>>175 data1 db 75
data2 db 37
GR1 ds 1
GR2 ds 1
entry:
mov [data1], [GR1]
add [data2], [GR1]
mov [data1], [GR2]
sub [data2], [GR2]
end
脳内アセンブラだから汎用性ないけどね。
>>175 LD GR1,A
ADDL GR1,B
LD GR2,B
XOR GR2,=-1
LAD GR2,1,GR2
ADDA GR2,A
RET
A DC 75
B DC 37
180 :
175 :2006/11/16(木) 00:02:06
ありがとうございます!
181 :
デフォルトの名無しさん :2006/11/17(金) 23:42:48
R2<-0 R2<-R2+15 R2<-R2+15 R3<-0 R3<-1 R1<-0 R4<-0 R6<-0 R6<-R3 AND 0x1 if R6=1 go to PC+3 R4<-R3+3 R1<-R1+R4 R1<-R1+R4 R3<-R3+1 R2<-R2-1 if R2!=0 go to PC-8 これだけでこのプログラムが何をやってるかわかりますか?
R2 ← 15 R1 ← 0 R4 ← R2 + 3 R4 ← R2 + R4 R1 ← R1 + R4 R1 ← R1 + R4 R2 ← R2 - 1 if R2 != 0 go to PC-6
183 :
デフォルトの名無しさん :2006/11/18(土) 02:40:27
184 :
デフォルトの名無しさん :2006/11/18(土) 17:14:07
何が分からないのか分からない。
186 :
デフォルトの名無しさん :2006/11/18(土) 19:54:00
ハンドアセンブルっておもしろいな。ちゃんとプログラムが動いたときの 快感度は他の言語の比にならないぜ。
んじゃ、一生やってれば? でもそれ、ちゃんと動いていると思ってるの自分だけかもよ。
ご一緒にポテトはいかがですか?
>186 げー、VC2005必須かよ…
Express Editionて、Freeで配ってる(配ってた?)だろ?
でもアセンブラの為にVC++入れるのアホらしくね?
手動で解凍したらFL_ml.exeが出てきたが、 これって使えるん?
194 :
デフォルトの名無しさん :2006/11/24(金) 00:43:01
.pos0x100 irmovl$15,%ebx rrmovl%ebx,%ecx loop: rmmovl%ecx,-3(%ebx) addl%ebx,%ecx jmploop このアセンブリプログラムをアセンブルすると、どんなバイト列が出てくるか。 y86シミュレータ
質問はなんですか?
なんかもうアセンブラがどうこう以前に日本語でおk、な質問が多いな
>>193 ml.exe にリネームすれば普通に使える。
ただしそれだけじゃリンカもライブラリもないから
本当に「アセンブル出来るだけ」になるがな。
199 :
デフォルトの名無しさん :2006/11/30(木) 13:52:24
前回は私の回答に答えて頂きありがとうございました。 今回もまた質問させてください。 mov edi, offset var1(もしくはvar2) mov al, '-' mov ecx, lengthof var1(もしくはvar2) cld repne scasb jz(もしくはjnz) と、言う上のコードを使って、C++などでは □if(var1 < 0) □□if(var2 < 0) □□else □else □□if(var2 < 0) □□else と現すifelse文を作りたいのですが、どうjzやjnzを使えば良いのか思い浮かびません。 上のifelse文使って、ASCIIで入力された数字の足し算をしたいのですが、 正数同士の足し算はできるのですが、負数同士、もしくは片方が負数でもちゃんと答えが出るようにしたいのです。 取りあえずはifelse文を作りたいです。 助けて頂けるとありがたいです。
手元にあるIA-32インテルアーキテクチャ・ソフトウェア・デベロッパーズ・マニュアル中巻と にらめっこして考えてくれ。 REPNE SCASBで終了する時の条件は2つ。 ECX=0になった時かZF(ゼロフラグ)が立った時。 ALの内容が見つかればZF=1、見つからなければZF=0になるんだろう? REPNE SCASB JNZ L1 見つかったときの処理 JMP LE L1: 見つからなかったときの処理 LE: ここまででif〜elseは表せると思うけど。 68系とその派生系の石しか扱わないから間違ってるかもだけど。
201 :
199 :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の使い方が分かりません。 助けて頂けると幸いです。
AAA - アンパックBCDの加算結果ALを補正する。繰り上がりが発生するとAH <- AH + 1 CF=1 AF=1 AAS - アンパックBCDの減算結果ALを補正する。繰り下がりが発生するとAH <- AH - 1 CF=1 AF=1 ADDの時みたいに下桁からSUBしてってAASで補正してけばいいんじゃない?
203 :
199 :2006/12/01(金) 15:14:05
その方法で試してみたのですが、Var1の値を正数に直して、Var1>=Var2ならば正常な答えが出ました。 ですが、Var1<Var2の場合は答えがおかしくなります。 CMP、jmp、などを使って別の所に飛んでから別の計算式を書いた方が良いのでしょうか…。
204 :
デフォルトの名無しさん :2006/12/06(水) 18:58:54
宿題です! どのようなc言語プログラムをコンパイルすると、ここで示したアセンブラ言語のプログラムになるか 示せ。また、c言語プログラムとアセンブリ言語の対応関係を示せ。 と言う宿題を出されました。どなたか教えてください! かなり初歩的なのかもしれませんが;
205 :
デフォルトの名無しさん :2006/12/06(水) 19:00:30
>>204 の続きです
fibo:
subu$sp,$sp,40
sw$31,32($sp)
sw$fp,28($sp)
sw$16,24($sp)
move$fp,$sp
sw$4,40($fp)
lw$2,40($fp)
beq$2,$0,$L3
lw$2,40($fp)
li$3,0x00000001# 1
beq$2,$3,$L3
j$L2
$L3:
lw$2,40($fp)
j$L1
j$L4
206 :
デフォルトの名無しさん :2006/12/06(水) 19:01:16
>>205 の続きです
$L2:
lw$3,40($fp)
subu$2,$3,1
move$4,$2
jalfibo
move$16,$2
lw$3,40($fp)
subu$2,$3,2
move$4,$2
jalfibo
addu$3,$16,$2
sw$3,16($fp)
lw$2,16($fp)
j$L1
$L4:
$L1:
move$sp,$fp
lw$31,32($sp)
lw$fp,28($sp)
lw$16,24($sp)
addu$sp,$sp,40
j$31
質問はなんですか?
208 :
デフォルトの名無しさん :2006/12/07(木) 10:40:36
今CASLの授業をやっているんですがメインルーチン?が自力で作れません。よかったら電卓のプログラムなんですが作っていただけますか!? 画面から3桁以内(符号なしビット)の2つの数字と、1つの演算子を入力して四則演算を行い、結果を画面に表示するプログラムです。 演算子は+, -, *, /を使います。 よろしくお願いします。
209 :
デフォルトの名無しさん :2006/12/07(木) 10:49:26
質問はなんですか?
210 :
デフォルトの名無しさん :2006/12/07(木) 11:05:04
208です。 どうやって作ればいいのかがわからないんですが。 例えば、GR1に何を入力したかをチェックするやりかたとかです。 CAP GR1、MOJI JZE TADASII 正しいときにジャンプする 正しくなければ通過とかの部分です。 わかりにくくてすいません。
ターゲット:Pentium4 2.7GHz コンパイラ VS2005 現在オセロのプログラムを製作しているのですが アセンブリ言語レベルの事で疑問がでたので教えてください 白石:-1,黒石:1としたとき配列の添字を得るために白石:0,黒石:1 と言う数字を得たいのです ここでxを石に対応する数字が格納させた変数だとして (1+x)/2 という計算を行わせて数字を得るのと if(x == 1){}else{} で条件分岐させるのではどちらの方が高速なのでしょうか? あと現在の打ち手を保持している変数を反転させるために(白石を-1としているのはこのためです) turn *= -1 としているのですがimul命令は遅いとかいう話を聞きました これはif文で条件分岐させて代入した方がいいのでしょうか?
>>211 小手先の愚作を労せず、最適化はコンパイラに任せなさい。
上の条件なら例えばif (x > 0) {...; } else {...;}とすれば適当なコードを出してくれるだろうし、
下の処理ならturn *= -1と書かずにturn = -turnすればよかろう。
尤も、その程度の内容だとどのように書いたところで処理速度が問題になるとも思えないが。
#もし本当に処理速度が問題になるのなら、プロファイリングとアセンブラ出力を読む作業は必須だ。
213 :
211 :2006/12/07(木) 22:05:41
ありがとうございます、最適化はコンパイラに任せます アセンブラのコードは読めないので、これから勉強してみます スレ違いすいませんm(_ _)m
ビットフィールド使って、最初から白=0、黒=1を得られるようにしとけばいいんじゃない? MSXとかCPUが極度に貧弱なマシンでもないかぎり、気にするような事じゃ無いとは思うけど。
215 :
211 :2006/12/08(金) 00:13:37
ビットフィールドははじめて知りました 書き換えてみます ありがとうございます
216 :
デフォルトの名無しさん :2006/12/08(金) 14:49:09
どの部分?
>>216 質問は日本語で頼むよ。
マジメな話、あんた自分が書いたその文章、自分以外の他人が読んで意味がわかると思うか?
エスパーを期待しても無駄だよ。
ここはムーの投書欄じゃねえからな。
219 :
たくや ◆TakUyA81FM :2006/12/08(金) 18:42:53
db 0eah; dw process dw 60h とか mov ax,60h mov ds,ax mov si,mes processとかmesのアドレス指定で0600h分足されてる気がするんだけど・・・ もしかして勘違い?
何がわからんのかわからんが、ひょっとして開始アドレスが0000:0000だと思ってるのか?
221 :
デフォルトの名無しさん :2006/12/08(金) 19:05:34
なんで0600h分足されてるのかがわからないです
だからお前の日本語の方がわからんてw
>>221 どういう処理を行ってる(と思う)のか、ソースを順に説明してみてくれないか?
とりあえず、おまえさんがどこで思い違いをしているのか理解できんとエスパーでも無い限り誰も回答できんと思うよ
224 :
デフォルトの名無しさん :2006/12/08(金) 19:31:50
割り込み禁止にして DFをクリアして スタックを使えるように07c00hにポインタを置いて siに7c00hを入れて dsとesを0にして 割り込み許可 07c00hから256バイト分、00600hに転送 0600h:processにジャンプ ←ここの0600hが何で必要なのかがわからない dsに0600hを入れる siにmesのアドレスを入れる ds:siの1バイト分の内容をalに入れる siのアドレスを1バイト分ずらす alが0なら終了 siの内容をスタックに入れる バイオスコールでディスプレイにalの文字を表示 スタックから取り出したデータをsiに入れる
225 :
デフォルトの名無しさん :2006/12/08(金) 19:36:20
ds:siの1バイト分の内容をalに入れる に戻る
226 :
デフォルトの名無しさん :2006/12/08(金) 19:41:53
訂正 0060h:processにジャンプ ←ここの0060hが何で必要なのかがわからない dsに0060hを入れる
わからんな。farジャンプがわからんわけでも無さそうだし、コピーしてるのは理解してるようだし。何がわからんのかわからん。 コピーやジャンプ自体が不要とかいうんだったらまだ質問の意図が理解できるんだが。 >←ここの0060hが何で必要なのかがわからない 何で不要だと思うんだ? それを無くしたらどうなると思う?
228 :
デフォルトの名無しさん :2006/12/08(金) 20:31:52
無くしたらどうなるのかわからないです jmp processじゃあだめなんですか?
>07c00hから256バイト分、00600hに転送 これが何をコピーしているか具体的にわかってるよね?
230 :
デフォルトの名無しさん :2006/12/08(金) 20:44:31
このソース全部をコピーしているんですよね?
231 :
デフォルトの名無しさん :2006/12/08(金) 20:58:44
BIOSがフロッピーのプログラムをメモリの07c00hに置いて 次に読み込むプログラムをメモリの07c00hに置くために メモリの00600hに位置を変えるんですよね? processとかの位置も変わるんですよね? でも、jmp processじゃあprocessには飛べないんですか?
232 :
デフォルトの名無しさん :2006/12/08(金) 21:14:23
0060h:mesもなんで0060hが必要なのかわからないです
>このソース全部をコピーしているんですよね? ソースというかコンパイル後のバイナリね。 >BIOSがフロッピーのプログラムをメモリの07c00hに置いて >次に読み込むプログラムをメモリの07c00hに置くために >メモリの00600hに位置を変えるんですよね? そう。 >processとかの位置も変わるんですよね? >でも、jmp processじゃあprocessには飛べないんですか? >0060h:mesもなんで0060hが必要なのかわからないです jmp processだとCS:processにジャンプする事になるぞ。 コピー先(0060:process)に移動するにはfarジャンプじゃないと。 このコードはprocess以前は07c00以降、process以前は直前にコピーされた00600以降のアドレスで動く(far Jumpするからね)。 ラベルの位置は先頭を0としたオフセットになるから先頭を0060:0000にしないとmesの位置とかがずれてくる。
234 :
デフォルトの名無しさん :2006/12/08(金) 21:53:54
もしかして86系の石ってリロケータブルなコード書けない? ・・・んなわけないよなぁ。
>>235 完全にとは云わないが、書ける筈だけど。
セグメント・レジスタも有ることだし。
jump命令は、普通セグメント内ジャンプしか
使わないだろ。
C言語でインラインアセンブラを使って動作中のプログラムの グローバル変数やstatic変数が格納されてる定数領域の 開始アドレスとサイズを取得したいんだけど、可能ですか? どなたか知恵をお貸しください。 ちなみにスタック領域のアドレスとサイズの取得は 以下のコードでできました。 NT_TIB* getTIB(void) { NT_TIB* pTib; __asm { mov eax, dword ptr FS:[18H]; mov pTib, eax; } return pTib; }
>>237 C言語つーのはgccのってことでいいんかい?
239 :
237 :2006/12/13(水) 22:27:30
240 :
237 :2006/12/13(水) 22:49:56
連投すんません。 gccでもVCでもWindows上で動作するんであればおkです。
241 :
デフォルトの名無しさん :2006/12/14(木) 21:13:48
超低レベルな質問です 同じ内容の数値計算をさせた場合Fortranとアセンブラじゃどちらが速いですか?
242 :
241 :2006/12/14(木) 21:15:02
アセンブラじゃなくてアセンブルですね・・・
アセンブリ:アセンブル:アセンブラ =プログラミング言語:コンパイル:コンパイラ
>>241 本質的にはアセンブラが負けることはないが、
実際にはそうもいかないのが難しいところ。
結局はコードを書く人の能力による。
つーかアセンブラで数値計算なんてやりたくねーな
アセンブラの宿題質問スレ コンパイラの宿題質問スレ
このスレ見直したらやっぱ誤用が多いね。
言っとくが、スレタイのアセンブラは アセンブリ言語のことだからな。
事務計算だとアセンブリ言語使った方がマシだったりすることもあるよな。 石によるけどさ。
宿題がサッパリ分からないのでお願いします。CPUはARMです。 digitsDCB"1024",0 のように0で終わっている数字だけの文字列を見て、それで表される10進法の数値と 同じになるデータを作ってbinary番地に入れるプログラムを書け。今の例ではそのデータは2進数としては 100 0000 0000 である。このような変換は10進2進変換と呼ばれる。そのプログラムを使って digitsDCB"123456789",0 のときにbinary番地に入る値を16進表示で答えよ。 (ヒント)"1024" = '1', '0', '2', '4' = 0x31, 0x30, 0x32, 0x34 であるから文字'1'から数値1を得るためには、その文字のコードと0x0fのandをとればよい。また、 1024 = 1*103+0*102+2*10+4 = ((1*10 + 0)*10 + 2)*10 +4 であるから、1文字を読むたびに、その文字コードから数値を作り、 それまでに計算しておいた値(上記の最後の式の括弧内の値)を10倍したものに加えればよい。 int result = 0; int index = 0; while ( (byte b = digits[index++]) != 0 ){ result = result*10 + (b & 0x0f); } binary = result;
わからないってどういう事? ヒントの所に回答そのものが日本語で書いてあるのに。
252 :
CASL :2006/12/15(金) 22:18:59
>>237 ifで使われているptr_SE[i].Characteristicsのフラグについては↓に書いてある
ttp://www.geocities.jp/winapi_database2/special/2001_10_11/page7.html あと、const宣言は.rdata、static宣言は.data(初期値あり)、.bss(初期値なし)に配置されたと思う‥‥
って、全然アセンブリ言語じゃないや。
#include <stdio.h>
#include <windows.h>
int main(int argc,char *argv[])
{
PIMAGE_DOS_HEADER ptr_MZ;
PIMAGE_NT_HEADERS ptr_PE;
PIMAGE_SECTION_HEADER ptr_SE;
int i;
ptr_MZ = (void*)GetModuleHandle(0);
ptr_PE = (void*)ptr_MZ + ptr_MZ->e_lfanew;
ptr_SE = (void*)ptr_PE + sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER) + ptr_PE->FileHeader.SizeOfOptionalHeader;
for(i = 0 ; i < ptr_PE->FileHeader.NumberOfSections ; i++) {
if(!(ptr_SE[i].Characteristics & IMAGE_SCN_MEM_WRITE)) {
printf("Address: %p\n",ptr_MZ + ptr_SE[i].VirtualAddress);
printf("Size: %d\n",ptr_SE[i].Misc.VirtualSize);
}
}
return 0;
}
254 :
237 :2006/12/16(土) 14:10:03
>>253 レスありがとうございます。
まさにコレのようです。
当方の環境(Visual Studio 6.0)ではエラーがでるので、
修正しつつ参考にさせて頂きたいと思います。
数日間探しても見つからなかったのでとても助かりました。
ありがとうございます。
255 :
250 :2006/12/18(月) 23:55:11
>>251 それをプログラムでどう書けばいいのか分からないんです・・・
MASM32を入れて、アセンブラの勉強もしてみようとおもったのですが
良い入門書は無いですか?
高級言語プログラマのためのアセンブラ入門と
http://www5c.biglobe.ne.jp/~ecb/assembler/assembler00.htmlのページを 見ながら勉強しようと思ったのですが、高級言語プログラマのためのアセンブラ入門は
なんか辞典みたいな感じで、アセンブラのページを読むと
なんとなくわかるにはわかるけど、なんでセグメント全部同じ名前にしてんだろ
とか、21hみたいな命令の意味とか、よくわからないのがやっぱ多いです。
で、やっぱり入門書を買おうと思うのですが、お勧めを教えてください。
CPUはIntel(R)Celeron(R)Mです。
>>256 >なんでセグメント全部同じ名前にしてんだろ
EXEファイルでは無くて、COMファイル作る為?
>21hみたいな命令
「int 21h」これは、MS-DOSのシステム・コールを
呼出す為だと思う。
LD GR2,A LOOP SUBA GR2,B LAD GR1,1,GR1 CPA GR2,B JPL LOOP RET A DC 200 B DC 10 caslで上みたいな割り算をした時、割り切れる場合 GR1が19までいくと終了してしまうんですがどうすればいいでしょうか? 金種計算みたなのを作りたいんです
>>258 「JPL LOOP」の「JPL」が悪いみたいだけど。
JPLって、Jump largeの意味?
「JPLE LOOP」とすべきでは。
JPLEは、Jump large or equal。
260 :
258 :2006/12/21(木) 01:04:18
JPLEって言う命令は無いみたいなんですが… エラーが出てきます
>>258 ゴメン、一応考え方として書いただけで、
CASLはやった事がない。
無い場合は、その命令と等価となるような
処理に作り換えるとか。
262 :
デフォルトの名無しさん :2006/12/31(日) 23:33:16
宿題でなくてすみませんが、質問です。 とりあえずi386以降のニーモニックは分かるのですが、MASMの擬似命令とか 宣言の使い方を例題で詳しく説明したサイトや本のお勧めはありますか? セグメントがどうこうとか考えずにNASMで楽してたので、MASMは全然分かりません。
今累乗のプログラムを作成しようとしているのですが,うまく動作しません. 具体的には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
>>265 Sparc 知らんから間違いの指摘はできないけど、
デバッガでステップ実行してみればいいんじゃないか?
>>265 .umulが%o0 * %o1の結果を、%o0 %o1のどちらかに代入してると思うのだが、
もう一方も何かしらの値が代入されているということはないかい?
あと、それだとxにxをy回掛けることになって、x^(y+1)になると思うのだが?
268 :
265 :2007/01/02(火) 23:55:07
>>267 どうもアドバイスありがとうございます.
指摘された通り%o1が.umulを実行した後に0になっていたのが原因でした.
かける回数も直せました.
本当にありがとうございました.
どう動かないんだよ。
とりあえずダウンしてみたけど 漏れには必要無いことが分かったので消した
>>269 俺ならば、「addi」みたいな命令は、registerを初期化してから
使用するけど。
273 :
269 :2007/01/04(木) 02:01:06
ありがとうございます。 なんか__startに異常があるみたいなメッセージが出てくるのですがそれがよくわかりません。 loadすら出来ないです。
じゃあそのメッセージをここに貼るとかそういうことを思いつきませんか
標準のトラップハンドラを読み込んでるからだな。 トラップハンドラを読み込まないか、 __startではなくmainにすれば良いと思うよ。
276 :
269 :2007/01/05(金) 03:30:24
>>274-275 ありがとうございます。
無事に実行できました。
ものすごく低レベルな質問をしているのかもしれませんが、
プログラムのmain以下14行目の
lw $t4, 0($a2)で、
その上のaddの行実行前に$t8に00000000、$gpに10008000が入ってる状態です。
addにより$a2にはその和の10008000が入るというのは理解できるのですが、
その後のlwの行の操作で
$t4に00000063が代入されるのが何故か分かりません。
どうかご教授ください。よろしくお願いします。
(プログラム
>>277-278 )
277 :
269 :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
278 :
269 :2007/01/05(金) 03:32:53
後半部分 loopj: slt$t3, $t1,$t0 beq$t3, $zero,loopiend mult$t1, $t7 mflo$t8 add$a2, $gp, $t8 lw$t4, 0($a2) add$a3, $a2,$t7 lw$t5, 0($a3) slt$t6, $t5, $t4 beq$t6, $zero,loopjend sw$t4, 0($a3) sw$t5, 0($a2) loopjend: addi$t1, $t1, 1 jloopj loopiend: sub$t0, $t0, $t9 jloopi progend:
279 :
デフォルトの名無しさん :2007/01/05(金) 03:39:05
これだろ .data0x10008000 .word100 .word99
280 :
269 :2007/01/05(金) 03:53:20
>>279 申し訳ないです。。さっぱり…
なぜ63が出てくるのかという点から掴めませんorz
加えて、質問箇所の下のadd $a3. $a2, $t7では
$a2に10008000, $t7に4が入ってるので$a3は10008004になったのですが
その下のlwで$t5に何故63が入るのでしょう…?
その63って16進数だろ、10進数に直せば99だ。
282 :
269 :2007/01/07(日) 07:15:25
何度もすみません。。 10008000の内容は64(100)だと思うのですが、 何故63が入るのでしょう…?
>>282 1008004の内容が63(99)だから。
sw$t5, 0($a3)
$a2じゃないぞ、$a3だぞ?
0が一個抜けたorz
lw $t4, 0($a2)で、 その上のaddの行実行前に$t8に00000000、$gpに10008000が入ってる状態です。 addにより$a2にはその和の10008000が入るというのは理解できるのですが、 その後のlwの行の操作で $t4に00000063が代入されるのが何故か分かりません。
$t4に00000063が代入されたとき、10008000はいくつになってる?
287 :
ふぃb :2007/01/11(木) 20:48:30
ご教授願いますm(_ _)m MacOSでアセンブラを勉強し始めたのですが、再帰関数のところで フィボナッチ数列の実装ができません・・・ CPUの名前がよくわからないのですが、↓こういう アセンブラです .text .align 2 .globl _fact _fact: # linkage area mflr r0 stw r0, 8(r1) mfcr r0 stw r0, 4(r1) # create stack frame stwu r1, -64(r1) # action cmpi cr7,r3,1 bgt cr7,CALL li r3,1 b RET CALL: stw r3, 88(r1) subi r3,r3,1 .....................
CPUが分からないって? ???
>287 PCの機種名でもアセンブラの名前でも良いから書いてみそ
マック使いってみんなこんなレベルなんだろうか。 自分が使ってるマシンのMPUもわからないなんて・・・。
機種名モデル名購入日OS名その他知らない香具師もかなりいる
MacOSでのスタックフレーム処理を理解する or 再帰を諦めてループを使って実装する どっちか好きな方を選んでくれ。
293 :
ふぃb :2007/01/12(金) 13:45:18
>298 すみません。アセンブラはgccです。 >292 スタックフレーム勉強します><
つーか自分の機種すら分からないのは開発やる人間として大問題
PowerPCか何かかな?
NASM
297 :
ふぃb :2007/01/15(月) 13:08:49
自己解決しました。 すいません
298 :
デフォルトの名無しさん :2007/01/18(木) 14:48:39
15-1 再帰的に階乗を計算するサブルーチンを作れ。(注: 階乗F(n) はF(n) = n × F(n − 1) で計算する。) 15-2 自分の作ったサブルーチンで計算できる最大のn を求められるようプログラムを改良し、n を求めよ。 FLOAT1 START LD GR0,F CALL EXT ST GR2,SIGN ST GR3,EXP ST GR1,SIG RET EXT LD GR1,GR0 (1-1) (1-2) LD GR2,GR1 LD GR1,GR0
299 :
続き :2007/01/18(木) 14:49:26
(2-1) (2-2) (2-3) LD GR3,GR1 LD GR1,GR0 (3) RET F DC #7C00 SIGN DS 1 EXP DS 1 SIG DS 1 END 16-1 (1-1),(1-2) を埋めよ。 16-2 (2-1),(2-2),(2-3) を埋めよ。 16-3 (3) を埋めよ。 初心者です。よろしくおながいします。
>>298 初心者でも何でもいいけど、処理系(CPU,アセンブラ)くらい書かないとエスパーしか答えられないよ。
これは多分CASLだな。 問16は問題文が欠けてないか? せめて何を目的にしたプログラムかは書くべきだと思うんだが。
F CPL GR1,=2 ;階乗サブルーチン15-1 引数:GR1 戻値:GR0 JMI FRET1 ;入力が0または1ならば、1を返す SUBL GR1,=1 CALL F ;再帰呼び出しでF(n-1)を求める ADDL GR1,=1 PUSH 0,GR1 ;GR1とGR2を待避 PUSH 0,GR2 LD GR2,GR0 FMUL SUBL GR1,=1 ;乗算ループ CPL GR1,=0 JZE FEND ADDL GR0,GR2 JUMP FMUL FEND POP GR2 ;GR1とGR2を復帰 POP GR1 RET FRET1 LD GR0,=1 RET
303 :
ゆー :2007/01/21(日) 18:21:22
ARMアセンブラについて質問です。 CMNは符号を反転させて比較するものですよね? たとえば r0番地に3、r1番地に-5 があるとします。 そして CMN r0,r1 と書いたらどっちの符号が反転されるんですか? 両方されたら意味ないですよね? お願いします!!!
304 :
デフォルトの名無しさん :2007/01/21(日) 18:35:32
305 :
ゆー :2007/01/21(日) 18:40:29
N Z C V のことですか?あまり詳しくないのでよくわかりません・・・
ARMアーキテクチャリファレンスマニュアルが無料で配られてるから それをもらってきてよく読むように。 まず、CMPとCMNは比較命令だから、オペランドに指定したレジスタの内容は変化しない。 そして、CMNでも2番目のオペランドは符号反転しない。 CMPが1番目から2番目を減算した結果で条件コードフラグを変化させる命令なら CMNは1番目に2番目を加算した結果で条件コードフラグを変化させる命令。 CMP基準でみると動作が「1番目から符号反転させた2番目を減算させた結果で変化してる」ように見えるだけ。
307 :
ゆー :2007/01/21(日) 19:59:32
どこで配られてるんですか? そういうことですか! ありがとうございます。
309 :
ゆー :2007/01/21(日) 21:11:22
ダウンロードしました!!! ありがとうございます。
310 :
ゆー :2007/01/21(日) 22:58:25
すみません。 MOVとMOVSの違いがいまいちわかりません。 マニュアル見てもよくわかりません↓ お願いします><
アセンブラの条件分岐命令で BLEとBGTの意味がわかりません。 どういう意味でしょうか?
>>312 ニモニックセット依存。
恐らくは、前者はbranch if (register) less than or equal to (operand)の意で
後者はbranch if (regster) greater than (operand)の意だろう。
ありがとさん
315 :
デフォルトの名無しさん :2007/02/15(木) 15:09:01
SEP-3についての質問です。 C言語のprintf()は、printf("10\n")ともprintf("%d\n#",10)とも書くことが できる。つまり、引数の数はいくつあってもよい。このようなサブルーチン を実現するには、サブルーチンprintfをどのように記述し、どのようにして 呼び出せばよいだろうかっていう問題です。 よくわかりません。
#include <stdarg.h> int vprintf(const char *format, va_list ap); int vfprintf(FILE *stream, const char *format, va_list ap); int vsprintf(char *str, const char *format, va_list ap); int vsnprintf(char *str, size_t size, const char *format, va_list ap);
317 :
デフォルトの名無しさん :2007/02/15(木) 15:51:24
315追記です アセンブラ言語でどのように書けばよいかっていう問題です。
スタックに積まれている情報を変換子(%何とか)に対応させてアクセスするんでしょ。 vsprintf(wk,format,int1,int2,int3) なら、後ろからpush5回、call だから、スタックポインタの すぐ後は復帰アドレス、その次からwkのポインタ、formatのポインタ。format解析の中で %何とかに出会うたびにSP+2ワード+nワードをアクセスすればいい。
#もう〜 #つまんなすぎっ!
320 :
デフォルトの名無しさん :2007/02/19(月) 11:40:14
お願いします。 68HC11で8BIT、MPUなのですが、 逆アセンブラがありません。 ダウンロードサイトに、DOS環境で動くものはあるのですが、 使い方がわかりません、 アセンブルする方法教えてください、初心者ですみません
>>320 初心者だから知らなくても仕方ないが、逆アセンブラがなくてもアセンブラがあればアセンブルすることは可能だ
322 :
デフォルトの名無しさん :2007/02/19(月) 13:40:24
>>321 レスありがとうございます
プログラムが16進数で書いてあり、読める形にしたいのですが
どうしたら、ふるいMPUなのでコード表もありません、
ウインドウズ環境で動く逆アセンブラのソフトないですかね?
323 :
デフォルトの名無しさん :2007/02/19(月) 14:21:22
>>322 > どうしたら、ふるいMPUなのでコード表もありません、
英語でいいならフリースケール・セミコンダクタの英語サイトに行けば無料配布してるぞ。
ProduntsからHC11ってのを選べばいろいろ出てくる。
Productsな。cが横にこけた。
実行コードしか残ってないソフトを逆アセンブルして修整したい、とかそういう事情? 8bitのソフトなんてちっちゃいんだから、作っちゃったほうが手間要らないのでは?
6809の正常進化版? 6809用だったら古いフロッピーに一式入っているんだが。 問題は、今時5.25"を読める環境がないことだなw 勉強がてら、自分で作るのお勧め。 なーに、バイナリモジュールを16進ダンプかHEXフォーマットかSフォーマットにしてやって、 それを入力に使えばスクリプト形言語でちょちょいのぱーだよ。
328 :
デフォルトの名無しさん :2007/02/20(火) 13:47:34
>>326 >>327 ご指導ありがとうございます
初心者すぎて、ちょっと無理みたいです、
データアップロードしますので、どなたかお願いします
まて、今時初心者が何で6811なんか触る?
330 :
デフォルトの名無しさん :2007/02/21(水) 03:11:50
331 :
デフォルトの名無しさん :2007/02/21(水) 03:15:42
すいません ファイル名”バイナリーファイル68hc11”でした
Disassembler拾ってきて試してみたが これってプログラムじゃなくて何かのデータなんじゃ・・・?
確かに、3/4はデータっぽいね。
334 :
デフォルトの名無しさん :2007/02/22(木) 02:57:35
335 :
333 :2007/02/22(木) 06:43:42
アップも何も、私ゃダンプ眺めただけだがね。 32KBのうち、オフセット0x1d1cから0xffが集中して入っているし、 オフセット0x20e0からは3バイト+1-2バイトのタグ型データ構造に見えるし、 他にもいかにもデータって感じでバイト列が並んでいるがね。
一応RTSを中心にしてその前後を見て回ったけど、意味のあるコードが見つからなかった。 全部Bxxとかの条件分岐だけで飛んでたりしたら嫌だなぁ。 眺めてるとだんだん無圧縮のスプライトパターンデータとかに見えてくる。 これの出所ってどこ?
337 :
デフォルトの名無しさん :2007/02/23(金) 02:33:30
>>336 ボッシュの8ビットCPUです。
なんとかなりませんか?
経緯も何も判らんでなんとかなりませんか言われても、なんともなりませんがな。
ECUのROMか?
340 :
デフォルトの名無しさん :2007/02/23(金) 03:29:25
ECU?車のコンピュータみたいですが。 エンジンコントロール用みたいです、
だとしたら暗号化ぐらいされてるかもよ。ROMから逆アセンブルされることも想定して。 もしそうなら暗号化キーがなきゃお手上げ。
っていうか、昔から勘違いしてる奴が多いけど(PC-8001の例の事件の影響だろうけど) 逆アセンブルしたソースを人が読める形に修正する、なんて殆どの場合不可能だよw 可能な場合なんてむしろ例外的。 それは人的資源の質や量の問題と無関係に、ね。
いや寧ろ、逆アセンブルしたものが読めるようになってもハード構成やOSの仕様などが判らんとお手上げなケースが多いわけで。
>>337 エンジンコントロール用と言ったって、アクセル開度制御しかしないのと空燃比から加給器の制御までするのとでは全然違うわけだが。
少なくとも可読文字で数字が並んでたりするので、自分でダンプくらい眺めなさいよ。
345 :
デフォルトの名無しさん :2007/02/24(土) 03:47:57
>>341 暗号キーは無いみたいです、
土日でイロイロ調べてみます、
お世話になるかもしれませんがよろしくお願いします
犯罪の手助けをしろと言うのですね。
347 :
デフォルトの名無しさん :2007/02/25(日) 05:15:02
経過報告します。 ハンドアセンブルしようとデータシート探しても見つからず、、、、 鬱
>>348 逆アセ自体を禁止しているものであれば、、ということだろう。
まあ普通契約で禁止されてるな。 少なくとも「是非やってください」と言うところはない。
契約で禁止されてたって、契約違反にはなっても犯罪にはならないでしょ。 法律で禁止されてるのを破るのが犯罪。
すごい斬新な発想だなw
>>352 ,353が認識している犯罪の定義を知りたい。
MIPSアセンブリを使って $f12にあるfloat型のインプットをASCII ストリングに変換する 関数を書きたいです。 $a0に変換されたストリングを保管するアドレスが渡されるという前提です。
関数の名前はitofです
358 :
デフォルトの名無しさん :2007/02/27(火) 18:08:50
逆アセンブラて、してはいけないのですか? アセンブラの勉強のために、質問してただけなんですけど。 大丈夫ですよね、、、、、 で、結果報告です、 ハンドアセンブラしようとデータシート探しましたが見つからず おまけに、68hc11ではなくて、6803?の疑問が浮上しました 1993年に68hc11発売されていましたか?教えてください
360 :
デフォルトの名無しさん :2007/02/27(火) 23:17:56
問題 a=b+cを実現するためのアセンブラを示し、その横にマシン語を示すこと ただし、aは100h番地、bは10h番地、cは20h番地に割り当てられているとする(hは16進数の表現の意味) おねがいします
>>355 まったく・・・
犯罪:罪を犯すこと。また、犯した罪。
罪:法律的・道徳的・宗教的な規範に反する行為。など
つまり、違法かどうかと犯罪とは必ずしも対ではない。
おいおいアホだろw 激しくスレ違いだけど、契約って行為そのものが法律行為だから これを履行しないことは違法性を構成するに決まってるじゃんw っていうか、法的拘束力のない契約にそもそも何の意味があるんだよw
エンジニアが逆アセンブルするのは必然だが 素人が趣味で解析したがるのは迷惑。 自分のマニアっぷりを自慢するために解析結果を公開したりするし。
>>358 心配ならメーカに問い合わせたら?
つーか、アセンブラの勉強のためなら逆アセンブルするのは無意味だよ。
前から何人も書いているけどコード部とデータ部の区別やら環境やらが判らんと意味を為さないし。
そんなことよりも、アセンブラの勉強のためなら素直にアセンブラで書かれたソースを読めばいいじゃない。
>>360 こんなんでいいの?
; a=b+cを実現するためのアセンブラを示し、その横にマシン語を示すこと
; ただし、aは100h番地、bは10h番地、cは20h番地に割り当てられているとする
CSEG
0000 2A1000 lhld 010h ; b
0003 EB xchg
0004 2A2000 lhld 020h ; c
0007 19 dad D
0008 220001 shld 0100h ; a=b+c
000B END
>>366 ありがとうございます!
とても助かりましたー
368 :
デフォルトの名無しさん :2007/03/02(金) 19:32:51
68hc11のコード表 激希望 アップロードお願い
検索しろよ
372 :
デフォルトの名無しさん :2007/03/03(土) 13:34:21
373 :
デフォルトの名無しさん :2007/03/04(日) 23:58:34
ウザ
勉強が目的なのに楽ばかり考えてどうすんだ? 逆アスくらい自力でできるだろうよ。 って、元辿って読んだらリバースエンジニアリング目的かよ。
最終的には、俺たちにチューンしてくれと泣きついてな
6×10の計算なんですがどうしても答えがでません。 修正お願いします。。 (3回目のLOOPでゼロフラグが立たない理由もお願いします) ORG 8000H XOR A LD B,06H LD C,0AH LOOP: LD D,A LD A,C AND 01H JP Z,SKIP LD A,D ADD A,B LD D,A SKIP: SLA B SRA C JP NZ,LOOP LD A,D LD (8200H),A JP 0000H END
実行してないけど、多分こうじゃない? LOOP: LD D,A LD A,C ↓ LD D,A LOOP: LD A,C JP Z,SKIPでZが立ってる時って、A=0だろ。そのままJP NZ,LOOP → LD D,A(D=0) になってるように思う。 あとSRA Cって10→5→2→1→0
素直にCをB回足せばいいのに
↑馬鹿
先生からもらった関数が動かないんですが・・・
>>380 だって6×8ならそのほうがクロック少ないじゃん(w
訂正されたのを実行しましたがやっぱり答えがあいません。 ちなみに答えは12+24+48=84になってしまいます。 24を足しているのがおかしいのです。 3周目のAND 01Hで0010Hと0001HをANDした結果Zフラグが立って スキップにいけば問題解決なんですが、スキップに飛びません。 Aレジスタの中身を見てみるとちゃんと0000HなのですがZフラグが 立ちません。今みてみるとHフラグは立っていました。 なぜZフラグが立たないのでしょうか
そりゃぁあんた、ZフラグはANDなんかじゃ勃たないだろよ。
そもそも何のニーモニックなのか最初にはっきり言えよw
Z80?
>>385 A=0で立たないフラグはもはやゼロフラグじゃないだろw
ANDなんかじゃダメなんだ。もっと奮い立つようなものじゃないとw
>>384 アセンブルしたコードを貼って味噌。HEX出力でもバイナリダンプでもいいから。
#つーか、なんでjr使わないでjp使っているんだろ。
8085じゃないの?
Zilogニモニックで8080/8085はないだろうよ。 #8080は互換性あるけど、8085は(8085で追加されたインストラクションが)互換性ないし。
392 :
390 :2007/03/08(木) 07:59:33
ニモニックはZ80らしいですね。Hフラグってハーフキャリーフラグのことかな? lstをそのまま貼ると崩れちゃうんで、スペースを全角に直して貼ってみます。 ORG 8000H 8000 AF XOR A 8001 0606 LD B,06H 8003 0E0A LD C,0AH 8005 57 LOOP: LD D,A 8006 79 LD A,C 8007 E601 AND 01H 8009 CA0F80 JP Z,SKIP 800C 7A LD A,D 800D 80 ADD A,B 800E 57 LD D,A 800F CB20 SKIP: SLA B 8011 CB29 SRA C 8013 C20580 JP NZ,LOOP 8016 7A LD A,D 8017 320082 LD (8200H),A 801A C30000 JP 0000H 801D END
393 :
390 :2007/03/08(木) 08:22:45
論理の流れはよさげですけどねえ・・・ LOOP:時点での D C B 足し算 1回目 0 1010 000110 足さない 2 0 0101 001100 足す 3 0Ch 0010 011000 足さない 4 0Ch 0001 110000 足す 足したあと、Cregを右シフトで0になるから 3Ch 0000 1100000 こういう展開を期待してるわけですよね?
元質以外が貼って何の意味があるんだよ。
元質の人はパニクっててそれどこじゃないかと思って。元質の人の参考になるかどうか 判らないけど、同じ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
みなさんありがとうございます!!
やりたいことは
>>393 さんの通りです。
正直どう修正すればいいのか分からずじまいでした。
手直しまでしてもらいましてありがとうございます!
今から参考にして直してみます
判ったら結果書いてね♪
リテラルについての質問なんですが、 たとえば、論理加算で、 ADDL GR1,=100 これはできますよね? ADDL GR1,=#FFFF こんなように16進数を使うことはできるんですか?
だからさあ、何のニーモニックかぐらい書けよ 俺様がやってることが世界の全てとでも思ってるのか?w
16進のリテラルは0ABCDhのように頭ゼロ、末尾にhをつけて書くことが多いですよ。 頭のゼロで「数値リテラルであってラベルでない」とアセンブラが認識できるから。 cみたいに0xで始まる書き方も許せばいいのにと個人的には思うけど、あまり見かけません。
>>400 >0xで始まる書き方も許せばいい
これは逆に、c で0Ahや10bという書き方を許さないのが疑問なんだが。
だからアセにもcにいろいろあるんだよ。 自分の身近な物が世の中の全てだと思う奴のことを「セカイ系」って言うらしいけど 最近確かにこういうセカイ系タイプって増えてるな。 リテラルの書き方なんてアセのメーカーによってマチマチじゃん。 マイコン系ならcでもビットワイズのリテラルを許すものもあるし。
>>402 ここでいってるcはANSIだろう。
asmはいろいろだが。
>>398 まあ、エスパーの漏れ様が答えてやると、
仕 様 く ら い 読 め
ってことだな。
2.5 機械語命令
adr
アドレスは,10 進定数,16 進定数,アドレス定数又はリテラルで指定する。
リテラルは,一つの10 進定数,16 進定数又は文字定数の前に等号(=)を付けて
記述する。CASLUは,等号の後の定数をオペランドとするDC 命令を生成し,そ
のアドレスをadr の値とする。
まあ、アセンブラ=CASLとかアセンブラ=x86とか思ってる馬鹿には来て欲しくないね。
アセンブラ=6809
アセンブラ=プライスレス
俺なんか、[]つけるのか#つけるのかHつけるのか0xつけるのか$つけるのか ソースとデスティネーションが右左のどっちか、 リテラルとメモリのラベル、オフセットなどの区別の仕方はどうなってるのか、 そういうのは必ずマニュアルを見て確認してるぞ。 たまにアセンブラのマニュアル忘れてくれる営業さんがいるんだが、 インラインアセンブラとか使うときにどーしろっつーんじゃい。 アセンブラを勉強するなら、環境によってみんな文法が違うってことをまずはじめに覚えろ。 それができたら質問してよろしい。 簡単に言うと、「まず、どのCPUを使うのかを書け!わからなかったらアセンブラに手を出すな!!」
409 :
デフォルトの名無しさん :2007/03/14(水) 05:12:06
アセンブリ言語の標準規格って全然ないのかな。 dest/src の順番すらアセンブラによってまちまちだし。
アセンブラどころか命令によってまちまちだったりするぞ
412 :
デフォルトの名無しさん :2007/03/14(水) 15:22:06
まま、それがASMのいいところ・・・
へたに標準規格作られてもさぁ、gas使う時みたいな違和感を感じるだけなんじゃないかね? 個人的にはソース・デストの順が好き。
IBMが←だったので、当時の互換機はそれを真似したが、 その後マイコンの時代になると→がメジャーになってきたね。
mov 系と LD/ST系があってだな
load reg, mem store reg, mem の類は同じニモニックセットでも矢印の向きが変わる典型って訳だな。
レジスタとアドレスを要求するOPでは 左レジスタの方が感覚に合うなあ
左レジスタって意味わかんないだろw
お前だけだろ。 「右」「左」が区別できる奴なら普通わかると思うが。 一般的な言い回しとは思わないけど。
そんなことないでしょ。分かるのは恐らくエスパだけ。もちろんこれ逆説的表現ね。 左srcとか左destなら話も分かるが、左レジスタって一体何だよw
>>419 /::::i::::、:::ヽ、:::::\:ヽ:\::::::ヽ:::、::ヽ::、:',
/::i|::l::ト、ヽ::、:::ヽ:、::::::\::ヽ::::l::::ヽ::i:::i:::!
/:/:!:::!:|::ヽ:\ヽ::::、:\::::ヽ:::ヽ!::::::i::|:::!::!
!ハ::|::::i::l:|心、:ヽ::\:ヽ_\、\:::ヽ:::|!::|:|i 駄目だ こいつ・・・
i、:!:|:、N{、ヒjヽゝ\ヾイ ヒj >、ヽi:、|!:|:l
ヽ:!::トヽ ̄ l! ` ` ̄´ |::l::|:|j:,!:! 早くなんとかしないと・・・
ト、::! u j |::/lj:::!リ
ヾ、 丶 - u リイ:|リ
リヽ ‐、ー- 、_ /イ:::i
rー'"ト:l゙、  ̄ ./ , |::!
/ ヘ ヾ ヽ、 _,. ' / |:
左・・・レジスタ・・・? たぶんCASLだろうけど、あれは気持ち悪い。 左src右destが一番美しい。
>>418 =
>>420 =>422
思考の柔軟性がなさそうだから、アセンブラなんて変態的なものは
あきらめることをお勧めする。
いや僭越ながら「思考の柔軟性」とやらは持ってるつもり。 持ってないのはESP能力ねw
425 :
デフォルトの名無しさん :2007/03/18(日) 21:49:16
× 持ってないのはESP能力ね ○ 持ってないのは常識 + 話の流れを読む力 まあ、日本語が理解できないようだから ESP に頼る必要があるのかもしれないけど。 (w
アセンブラが変態なのではなく 特定の石が腐ってるだけ。 なんでそれがわからない?
src/dstの並び順はgasでもアーキテクチャによってまちまちですよ。
話をまとめると、 mov 系の命令は 移動方向は同じ mov src,dst と mov dst,src が混在する事はあまりない(絶対にないとはいえないが) LD/ST系は、src/dstではなく、レジスタ/アドレッシング が固定。多くは左にレジスタ、右にアドレッシング レジスタが1個や2個しかない場合は、 LDA STA のように命令にレジスタが含まれるものもある ただ mov系とLD/ST系が混在する場合はありえるかも
という話に
>>415-416 でなってる所に、 417がLD/ST型で左にレジスタ書くスタイルが好きだと発言
それに418が mov系の話と勘違いしてツッコミ中
>>426 石が腐っているのではなく、適切に利用出来ないだけだろ。
PICでキャリーフラグが無くて辛かったり
高性能なDSPなのにインデックス修飾が出来なくて辛かったり、
そりゃコレくらい用意しとけよと思う事は山のようにあるけどな
431 :
デフォルトの名無しさん :2007/03/22(木) 11:55:09
アセンブラの質問?なんですけど 「PCエンジンのCPUの方がメガドライブの奴より高速だとゲーム製作会社の人間が言っていた。 だからCPUの速度も性能も6502(21MHz相当) > 68000(8MHz)。68000は8ビットCPUより遅いゴミ。」 と言い張る人がいるんですがこれって本当なんですか?
そりゃクロックあたりの命令実行数でも 6502が高いのに クロックが違うんだから、 ゲームに使う話なら高速な方がありがたいだろう でも68000は内部32bitだから、使い易さは段違い。
レゲー板の論争はレゲー板で処理しろよ。
>>431 その理屈で行くと、8086(クロック5MHz)も当然ゴミなんだろうな。
石とかクロックなんて、「こういうソフトを作る」と決めてからそれに合わせて選ぶだけだから、 それ自体で良い悪いを語ることはナンセンスでしょ。3MHzの8085でもいまだに現役ですよ。
え?まだ生産終了してなかったの?
箱作るたびに、アキバで買い漁ってます(w
6502ってハーバードアーキテクチャ的な奴だっけ? だったら(昔の)ゲームとか単純な制御には68kなんかより圧倒的に有利だろうね。
知ったか乙。 ハーバードアーキテクチャがどういうものか調べてこいよ。
>>439 なんでもいいけどどうせ反論するなら具体的にやってみたら?
いや、できないなら無理することないよw
ちなみに俺は仕事で8052互換コアのコード書いてるから
ハーバードアーキテクチャの利点も欠点もある程度分かってるつもりだけどね。
御託はいいから、6502 のどの辺がハーバードアーキテクチャ的か語ってくれよ。(w
ゼロページ、いやいやメモリマップドI/Oの事だったり・・・ まさかな。
6502と8052を間違えてるんじゃね?
それだっー!
6502は当時多くの命令を2クロックサイクルで1命令を実行出来るというクロックあたりの実行性能で他を凌駕していた。 シンプルな命令体形でパイプライン処理を導入したおかげだろう ただ、Accが1個しかなく(まあゼロページ全部がレジスタとも言えるが) AddWithCF しか無い等、命令数は他のCPUより若干増え気味だが ソコに色々工夫の余地があった
ハーバードアーキテクチャは、1チップマイコンでよく利用される 4ビットマイコンとか PICのように命令ビット幅がデータビット幅より大きいものは、こうするしかない事情もある 8051のように両方同じビットサイズのものは逆に珍しい DSPの多くで採用されるのは、速度的な問題から DSPは積和を高速に実行する為、 命令と掛算のソース2つで3つに別けたり 積和は繰り返すので、 命令そのものはキャッシュに入るとして acc += 命令*データが出来るようにしたものが多い こうする事で、2倍の速度が得られるわけだ
ディスレキシア?
451 :
デフォルトの名無しさん :2007/04/11(水) 00:25:42
今日はじめたばかりでまださっぱり意味がわかりませんが CMP DWORD PTR DS:[EAX-C],1 の意味がわかりません。 EAXからCを引く???
俺も判らん。 何のCPUで、どこで見た結果? EAXって名前からすると IA32だとすると [EAX-0Ch] を省略表示したんだろうなと、
453 :
デフォルトの名無しさん :2007/04/11(水) 19:43:27
Intel Windowsアプリです。 EAX-0Chって結局どこのアドレス指すんでしょうか? +ならまだしも-ってどこになるんだろう
EAXの値から12引いた数値のアドレス。
>>453 別にマイナスでもいいじゃん。
最適化のため先にポインタをインクリメントしているかもしれないし
スタック上の変数かもしれないし。
>>451 C言語なら
eflags.zero_flag = (*(unsigned long*)(eax-0xc) == 1)
PUSH PUSH RET
質問です。 1語8ビットとして、1の補数の求め方がわかりません。 00110101なら11001010を作りたいのです。プロセッサの演算命令は DEC,INC,SHL,SHR.ROTL,ROTR,ADD,SUBのみ使えます。 おながいします。
なんか痛い質問だなw 本人マジだったら悪いけど
ANDもORもXORも無いの? どんな石なんだろ?
4bitマイコンであるよ subr #n っていう 定数-acc の命令で not の代用させるのは
質問失礼します。最近8085アセンブリ言語プログラミングを習い始めた者なのですが、 「9000H番地の1バイトデータをa、9001H番地の1バイトデータをbとしたとき、 a×bを16ビットで求め、下位1バイトを9002H番地、上位1バイトを9003H番地に 格納するプログラミングを作りなさい。またこのプログラムの実行時間を計算しなさい。」 という問題がわかりません。 どなたか教えて頂けないでしょうか?
たぶんね、大昔のi8085を知っている人は少ないと思う。 だれかZ80マスターいませんかー?
昔は使いこなせてたけど、いまはもうだいぶ忘れちまったよ。>Z80
>>464 何でもいいから適当な例を一つか二つほど晒してくれ。
8085アセンブリ言語の文法知らんから始まらない。
乗算自体は難しいことはないんだが。
つーか8085てシフト命令ないのかよ...
習い始めの宿題なら足し算+ループでいいじゃん。
470 :
464 :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
>>470 取り敢えずHLレジスタに0を入れて、DEレジスタにaを入れてb回足せばいい。
擬似コードだとこんな感じ。
HL = 0
D = 0
E = [9000h]
C = [9001h]
loop:
HL += DE
--C
if NZ goto loop
[9002h] = HL
しかし、「プログラミングを作りなさい」って……
16bit加算があれば楽だけどって思ってたんだが、あったんだな・・・ てっきりないと思って苦労してたorz
>>464 こんなのでどう?
lda 09001h
mov e,a
mvi d,0 ; de<--(9001h)の値
lda 09000h
mov c,a
mvi b,0 ; bc<--(9000h)の値
; ここから掛け算:HL <-- HL*DE (16bit)
lxi h,0000
mvi a,10h
LBL1: dad h
xchg
dad h
xchg
jnc LBL2
dad b
LBL2: dcr a
jnz 0108
shld 09002h ; 答
474 :
473 :2007/04/17(火) 05:35:57
解説:シフトしながら1が立っているときだけ足すのが掛け算の常套手段なのね。 8bitの数の場合最初の8回は足し算が起こらないからムダだけど、16bit同士の掛け算にも そのまま応用できる。aをb回足す手法と比べて、bが10hより大きいときループ回数の点で 有利、という利点がある。これは実際に8085のclibに使われている手法です。
石自体なくなってるのに、何に使うんだろう? 専門学校の課題、っていうだけ?
こんな流行らないこと教える専門学校ってある?
工業高校か高専ってとこじゃない?
学校の宿題なら
>>473 の方法でいいと思うけど、実際の現場ではニブルXニブルの
look up tableを使うんじゃないかな?
まあ8085使ったことないんで知らないけど。
ちなみに8085は無くなってないんじゃないかな。
ニブルXニブルで 8x8の掛け算でも4回のテーブル引きと加算が必要になるから
>>473 の方法で8x8を書くのに比べて速度出すのも難しい。
コード量は増えるしね
478 :
473 :2007/04/17(火) 18:00:36
無くなってはないけど、生産中止になってだいぶ経つ。俺の客は弁当箱作る度に秋葉で買朝・・
479 :
デフォルトの名無しさん :2007/04/17(火) 22:23:39
メモリ上におかれた二つの2の補数表示整数(8ビット)の積(16ビット) を求め、連続する2語のメモリ上におけ。 という問題です。今期からはじめたばかりです。 もし出来れば $a : 100 $b : -10 $sum1 : 0 &sum2 : 0 から続けれる形でお願いします。よろしくお願いします、。
>>479 東工大情報工学科3年情報実験第3履修生乙wwwww
最近は日本語読めない奴でも東工大入れるのか
483 :
479 :2007/04/17(火) 23:16:07
リナックスです!
そのネタまじ秀逸 ハライテェw
485 :
479 :2007/04/17(火) 23:19:23
486 :
デフォルトの名無しさん :2007/04/17(火) 23:26:03
480=481=484は何故そこまでいじめるww てかあまり自分の大学名とか言わないようにww
488 :
479 :2007/04/17(火) 23:32:38
>>487 すみません、わかりませんが、先の書き出しの形式で、
ADDとかADDIやら使う形式のOSです。。
>>486 480 = 484 != 481
俺はただ単純に>483がツボっただけ
さすがに東工大の学生なら
>>479 のレベルの質問はしないだろう。
仮に分からないとしても。(このレベルがわからないってかなり重傷だが)
だってそれなりにプライドあるだろ?
工業高校の生徒だって解ける問題だぞ
491 :
464 :2007/04/17(火) 23:40:17
>>471 さん
>>473 さん
詳しい解答、解説ありがとうございました。
とても助かりました。
>>476 さん
やっぱり流行らないことなんですね。
一応地方の大学なんです..。
今の大学生なんてそんなもののような気がするぞ。 俺は大学行ってないからわからんが、大卒だからこそ全然 書けないのばっか。ハードには一切触れないとこも多いらしい ペン持って理論ばっか勉強しているんだろう。 てか490は馬鹿にすることで学歴コンプ解消しようとしてんだろ?
誰も馬鹿にしてないと思うんだが。。
っていうか、学歴コンプなんて今日日流行らないよ。
自分より優れている人間は素直にリスペクトした方が精神衛生上楽だし健全でしょ。
っていうか、煽り抜きで、本当に東工大で
>>479 がわからんとしたらかなり痛いと思うよ。
どこの学校か関係なしに自分の習ってるCPUの名前すらわからん様ではいかんわ。
どっかで見たような、それでいて思いだせない文法。 あれ、なんだかわかる人いる?
496 :
479 :2007/04/18(水) 00:01:18
gas形式でx86です・・
x86なら話は早い。 mov al, [a] imul byte [b] mov [sum1], al mov [sum2], ah だが俺はgas使えん。
て言うか、勉強もせずににちゃんに書き込む時点でアウトじゃね?
ふつう勉強しない奴が2chにくるんだろ
もうこれでいいじゃん gcc hoge.c -S
コンパイラの性能については詳しくないが、機械翻訳だと冗長なコード吐きそうな悪寒。
.data a: dc.b 100 b: dc.b -10 .bss sum1: ds.b 1 sum2: ds.b 1 .text kkzn: movem.l d0-d1,-(sp) move.b a(pc), d0 move.b b(pc), d1 muls d1, d0 move.w d0, sum1(pc) movem.l (sp)+, d0-d1 rts .end
東工大とか神じゃんか・・・
アセンブリ言語ってwindowsはwindowsで、macはmacで別物なんでしょ 今はwindowsが一番メジャーだからいいけどさ、 必死で覚えても仮にwindowsがなくなってmacが主流になったら またアセンブリmac.verを覚えなくちゃいけないわけでしょ?そこらへんどうなのよ
そのまえに、アセンブラだと、GASとMASMで既に表記方法が違う。 そして、毎年チップが新しく作られる都度、命令も増えている。 でもさ、それがアセンブラなんだ。
どれか一つきちんと覚えればやってることはどれも大して変わらないし。 パソコンに限って言えばアセンブラで書く(書ける)処理はかなり限定されるし。
>>506 じゃあお前さんはGASでもMASMでも書けるかい?無理だろうよ
片方が書ければ、トランスレータ作っておいて、自分で書くスタイル内ならそれで変換すりゃいい
トランスレータ書ける奴ならこんなところに質問しない
> トランスレータ Cって最高のトランスレータだと思いませんか
>>507 別に片方わかってりゃ GAS でも MASM でも書けるだろ。
習熟にはちょっと時間が必要かもしれないけど、無理ってことはないと思うぞ。
>>510 「最低の」の間違いだろ? (w
まぁあれだな、なんだかんだでアセンブラはプログラムの中では ダントツで効率が悪いよな 将来性がないっていうの? その分簡単だからいいんじゃね まぁ長年使っていけるプログラムなんてそうないけどね
GASのコードって慣習的にCプリプロセッサマクロ使うから トランスレータかけようと思ったら全部展開せにゃならんよ、たしか 性能の要求と人件費を天秤にかければ アセンブリ言語できる技術者の需要なんて糞みたいなもんだよ、 月100万でロートル数人雇うより、CPUメーカー謹製の最適化 コンパイラ買った方が圧倒的に安上がりだし。 最近はIntrinsicsでCでも低レベルの部分触れるようになってるから絶滅の一途。 読んで理解できるに越したことはないけど、書ける必要は全くないね。 命令の並びをどうこうするよりもアルゴリズム自体の改善で性能改善できるケースも多い。 そしてそれは構造化言語のほうが圧倒的にやりやすい。 >その分簡単だからいいんじゃね 何がどう簡単なの?機械が解読・変換しやすいって意味?それなら納得。
>>507 どっちかしか書けないの? 頭を切り替えられない馬鹿?
それとも、アルファベットを見ただけで拒否反応を起こしちゃう英語嫌いと同じ手合い?
コード・スニペット使うからアセンブリ言語で書いても昔ほど効率は悪くない。 違う命令覚えなきゃいけないとはいっても、結局やることはメモリかレジスタを 弄るだけだからすぐに慣れちゃうし。 どうせ資料見ながら作業するから暗記する気最初から無かったりする。 命令なんか使ってりゃ自然に覚えるし、覚えなくてもさほど困らない。
一応ここ宿題スレなんだよな
>>514 今時 アセンブラ = 高速化 だけ で語ってる奴がいるとは...
519 :
デフォルトの名無しさん :2007/04/19(木) 18:44:26
せっかくの宿題スレなので… PIC16F84Aを使っているのですが… CALLでサブルーチンとしてジャンプした後、RETURNせずに スタックから戻り番地ひとつ消してサブルーチン外にGOTOすることってできませんか?
>>519 適当なレジスタにPOPできない?
z80辺りだと常套手段だけど。
>>519 適切な答えが欲しければやりたいことをもう少し具体的に詳細に書いた方がいいと思う。
例えば「スタックから戻り番地ひとつ消してサブルーチン外にGOTO」とあるが、
これは常にそういう動作をしたいの?
それとも条件によっては呼び出し元に戻りたい場合もあるわけ?
まあ、個人的にはそもそも何かトンチンカンなことをやりたがってるような
印象を受けるけど。
まともな質問ができない人ってのは、自分で自分のやりたいことをよく把握してない
場合が多いからね。
残念だけど PICのスタックは別領域で、スタックポインタも操作出来ないし push/popとか他のスタック操作命令もない。 だから出来ないよ。 基本的に専門系スレには知識も技術も無いのに、 妙な口出しするのが良く出没するけど、それはどこでもそうだから気にしないように。
というわけで、設計の見直しをしてください。
恥ずかしいやっちゃなあw そもそもCALLやスタックの操作は手段に過ぎず目的ではないはず。
リターン飛ばしは、 アセンブラで書く時は良く使うテクニックだからやりたい事は良く判るよ。 PICの場合は、スタックポインタが無いし、スタックは循環するから この場合、単にgotoで飛んでしまえば問題ない。 スタックの勘定は合わないけどね。 ただそれだけだから。
>>520 それの方法がよくわからなくて…
>>522 ああ、やっぱりそうなんですか。
POP動作はRETURNとRETLWしか使えないんですね…
素直にRETLW使います。
>>525 あ、飛ばしてOKなんですか?
スタック循環させてかまわないんですね…
今後PIC以外でアセンブリやるときに、こういうコトする癖がつくとマズい気もしますが…
ああ、そういうレベルか。 なら注意を書くと、 飛ばしていいけど、戻れるのはmain と同じレベルね。 一つ前とか2つ前というような戻り方は出来ない。 他のCPUで言えばスタックポインタの初期化するのと同じね。
>>525 おいおいどう考えても
>>519 みたいのは「よく使うテクニック」なんかじゃないだろう。
call routine
ret
を
jmp routine
に置き換えるような、構造化プログラミングの作法に反しない最適化なら
ごく普通のテクニックだと思うけど。
っていうか、519みたいな手段をとる目的もわからずによく回答できるよなこのスレの連中は。
阿呆に限って偉そうに大嘘こくから困る
>>529 アセンブラで書く理由は、それが低レベルだから。
低レベルで書くから可能な手法があって、その一つがコレってだけの事。
C言語でいう longjmp 他の言語での例外を実装したかったのだろ ただ、まともにコンテクスト保存しようとしたら大変だから代替手段として 飛ばしリターン。 普通に使うと思うが?
質問でつ。 アセンブラで再帰関数っぽいものは如何表現すればよいでしょう。 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)) } みたいなのを作りたいぉ。
末尾再帰だからそのままループにすれば? と思うが PICのようにスタックが無かったら再帰は無理だが 汎用CPUなら、再帰はそのままCALL/JSRで呼び出せばいいだけ
呼び出せばいいだけって何だよw
>>533 の質問の肝は、要はローカル変数や引数や返り値を再帰呼び出しが
可能なような実装にするにはどうしたらいいかってことだろうに。
俺は悪いけどそんな複雑なことやったことないんで知らない。
まあ、かなり石のアーキテクチャに依存する問題のような気がするけど。
>>533 スタックがもったいないので再帰なんて使うな。
>>535 引数や帰り値は、レジスタ渡しでいいだろう
普通に書けば問題ない。
この場合、末尾再帰だからレジスタが壊れる事を心配する必要さえない
HOGE START LAD GR7, STK LAD GR1, 10 ST GR1, 0, GR7 LAD GR7, 1, GR7 CALL SIGMA ; DREG ='*END*' RET SIGMA LAD GR7, 1, GR7 XOR GR0, GR0 LD GR1, -2, GR7 JZE SKP0 ST GR1, -1, GR7 LAD GR1, -1, GR1 ST GR1, 0, GR7 LAD GR7, 1, GR7 CALL SIGMA ADDL GR0, -1, GR7 SKP0 LAD GR7, -2, GR7 RET STK DS 100 END
京大電電の実験で使いました。kuechip2です。 アセンブリ言語でソートなどを書かなければなりません。 equはどうやって使うんですか? #defineのようなものだと調べて知りましたが。 N: equ 80H とすると80(16進法)番地にNという整数が用意されることは分かりましたが どうやって値を設定するかが分かりません。 これが分かればあとはBccで分岐させるやりかたが分かればいいのですが。
080hてなんですか? あと、分岐の実験中ですが ld acc, 0 lp1: add acc, 1 cmp acc, xxx bn lp1 end このプログラムがxxx=100の時は動くのにxxx=150の時は動きません。 どうしてですかね
>080hてなんですか? 16進数の80ってことだろ。たとえばcbhと書いたら16進数字か識別子か区別が つきにくくなるから、先頭に0を書くこともある。 >このプログラムがxxx=100の時は動くのにxxx=150の時は動きません。 2の補数表現って知ってるか? 8ビットだと10進数で127までは正の数だが、128以上だと負の数扱いになる。
学校の宿題は自力でやらなアカンやろ。 つーか、チミには相談できる友達はいないのかい
>>543 なるほど。
アセンブラが分かる友達はさすがにいないので・・・
おれもrubyしか分からない。Cすら不明
>>544 まあ宿題スレだから
それに>539宿題丸投げってわけでもないからね
今シェルソートしています。 質問ですが ld acc, [j] と ld acc, (j) はどう違いますか? たぶんですが、[]はその番地にある値、()はその値そのもの という解釈でよろしいでしょうか? つまり()は即値代入、[]は、絶対アドレス代入ということで。
違うかも・・・やべえ
oh thnx
不親切なアセンブラだな 定数dを定義する時に DATA/CODE を修飾しておくとかさ DATA[d] CODE[d] みたいにかけた方が判りやすいだろうに
教育用なので。 しかし挿入ソート、どう考えてもレジスタが足りない・・
メモリに適当に退避するしかないでしょ しかしAcc1個にIX1個、CALLもRETもPC操作命令もないんだね
ふぅ、せめてレジスタが3つあればかなり楽なんですけどね。 いちいちメモリに退避ldやstを繰り返してうんざりです。 挿入ソートどうやら書けました。 負数や同じ数にも対応、朝から飯食ってませんよ・・・ もうこの言語にはうんざりです 54321の並びかえに 195 steps, 896 clocks ふつうのソートよりはずいぶん早いけど・・・微ですね
a0: equ 80H a1: equ 81H a2: equ 82H a3: equ 83H a4: equ 84H *個数 n: equ 85H i: equ 86H j: equ 87H *基本的にx->accにld x: equ 88H *初期条件 ld acc, -96 st acc, [a0] ld acc, 48 st acc, [a1] ld acc, -80 st acc, [a2] ld acc, 96 st acc, [a3] ld acc, 96 st acc, [a4] ld acc, 5 st acc, [n] lp0: ld ix, 0 st ix, [i]
lp1: ld ix, [i] st ix, [j] ld ix, [j] ld acc, [ix+a0+1] st acc, [x] lp2: ld acc, [x] ld ix, [j] ld ix, [ix+a0] cmp acc, ix *xの保存 *st acc, [x] bzp lp4 *a[j+1]=a[j]のphase ld ix, [j] ld acc, [ix+a0] st acc, [ix+a0+1] lp3: ld ix, [j] sub ix, 1 st ix, [j] bzp lp2 lp4: ld acc, [x] ld ix, [j] st acc, [ix+a0+1]
lp5: ld ix, [i] add ix, 1 st ix, [i] ld acc, [n] sub acc, 1 cmp ix, acc bnz lp1 end a0=-2, a2= -1くらいだと正常に動くのですが -96, -80だと動きません。オーバーフローですか? どこをどうすりゃいいんだろ・・・
dataという擬似命令が使えるようだけど org に相当するのがわからんから巧く使えんね
bge(=greater or equal) を起用したらなぜか通った。やはりoverflawか・・・ イミフ
引き算で計算してるから -64-65 = -129 だけど 16進で書くと $7F =127 になってしまう だからaccの符号だけみて判定するとミスする事になる
overflowってなんですか?ueでoverflawとかいってるけどまさしく今のおれですね・・・ overflowとcarryの違いが分からない
演算結果の符合が正しくない状態がoverflow 具体的にはプラスとプラスを足した結果がマイナスだったり、 マイナスとマイナスを足した結果がプラスになった場合をoverflowという。 っていうか、これ宿題以前に持ってないとマズい知識のような気がするけど。。
ここでは、 overflow : 桁あふれ carry : 桁あふれなどの結果の識別子 じゃないか。
ココもアソコもない話だと思いますが。。
>>565 プログラム板の外では、桁あふれ、とは取ってくれないってことね。
先生が overflowがでてもcarryがでない場合がある(うーん逆かも) とか言ってた気がする。 負数がどうとか、他の班員は理解してたけどおれは????でした。 苦手なんだけどこの分野に進みたいんだよね・・・いらない子になりそう
255に1を足したら キャリーも出てオーバーフローも立つ -100に-1を足したらキャリーは出るがオーバーフローはたたない
128から1を引いたらオーバーフローは出るがキャリーはたたない
なんとなく把握した。 演算上、異常な事態がoverflowで、ふつうだけど表示不可な時がcarry でおk?
キャリーは符号無しで加算した時のオーバーフローってのでどうだ?
>>570 なんとなくじゃなくてテキスト読めよw
学生なら教科書ぐらい持ってるだろ。
っていうか、キャリーは文字通り桁上がりだよ。
機械語の世界では便宜上桁借りもキャリーに含める場合があることには注意がいるけど。
数学苦手なら10進数の世界に置き換えて考えればいいんだよ。
算数できない子がお金の勘定に置き換えて理解するように。
10の位までの計算しかできないアホの子(=CPU)がいるとする。
この場合1 + 99や1 - 2がキャリー(やボロー)になるわけだ。
ところで、5 + 99 = 4だから、このアホの子の世界では99を足すことは1を引くことに
等しいとみなせる。(5 + 99 = 5 - 1)
同様に98は-2とみなせ、97は-3とみなせ、96は-4とみなせ……
これが補数による負の数の表現方法の考え方の基本だよ。
二進数の世界だって一緒だ。
8ビットの世界なら0x01に0xFF足したら0x00になるから、0xFFは-1と等価とみなせる、というわけだ。
もちろん上の例えを「0xFFに0x01を足すと0x00になる」と変形すると0x01を-255ともみなせるわけだが
それだと話が複雑になるので普通は0x80を堺に、それ未満の数を正とみなし以上の数を負とみなすようにする。
こうすると最上位ビットが符号を表すことになっていろいろ都合がいい。
このように補数による負の数の表現方法を決めたときに、
>>563 みたいに
演算結果の符合が正しくなくなった場合がオーバーフローだよ。
具体的には0x50(= 80) + 0x50 = 0xA0(= -76)みたいな場合だな。
プラスとプラスを足したのに答えがマイナスになってるのはおかしいでしょ。
>>572 非常にわかりやすかった。俺にとってお前は神。
575 :
デフォルトの名無しさん :2007/04/25(水) 05:06:52
H8/2000シリーズでeepmovという命令があります。マニュアル見ると、R4の転送バイト数が ゼロのときは転送しないように書かれていますが、ゼロだと「最大」(バイトなら256、ワード なら65536)の転送するんじゃないか、って気がするんです。 誰か試した人いませんか?
島根県のみなさん、パチンコをするなら、 優良パチンコ店 エイト○ン に行こう! 遠隔(※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万人
コピペ君って馬鹿だな、まで読んだ。
578 :
デフォルトの名無しさん :2007/04/25(水) 12:40:57
逆アセはスレ違い?だれか誘導してくれるとうれしい
逆アセはスレ違い以前に板違いかも
エヴァンゲリオンだと文字数が合わないよなぁ?と思った。
ハ ン ソ ロ H
582 :
お願いします :2007/04/26(木) 20:43:03
アセンブラ言語を使ったPICにプログラムをしたいんですが、SW1を変化させるとLEDの点灯を変えるというものなんですがBTFSSをつかってやりたいんですがBTFSSの使い方を教えて下さい おねがいします
584 :
お願いします :2007/04/26(木) 23:28:31
SW1のポート番号とは例えばどんなものがありますか あとGPIOとはなんですか?
マニュアルを読む手間くらいは人任せにしない方が身につきますよ
>>584 ピン数によって GPIO一つしかなかったり PORTA PORTBがあったりする
SW1のポート番号は、どのポートを使ったかって事
RB1 なら GPIOの所は PORTB で ポート番号のところは1になる
>>585 別に身につかなくてもいいんです
結果さえ得られれば
588 :
デフォルトの名無しさん :2007/05/02(水) 20:21:06
初めまして、最近、アセンブラ言語を始めたものなんですが、 基礎からできるお勧めのアセンブラの本とかないでしょうか? command operatorの多さにびっくりで、まずは最初にそれに慣れるなければいけ ません。簡単なcommand の使い方がから徐々にステップアップできる本を 探してます。心当たりのある人、レスをお持ちしてます。
>>588 まずはZ80でも覚えなさい。基本的な考えとかはそんなに変わりゃしないから。
68000 プログラマーズ・ハンドブック 技術評論社 Z80みたいな酷い石をいまさら学ぶ必要なんか無いよ。
酷いってことは全然ないだろ。8bit CPU だから超シンプルで覚えやすいから 勉強に最適だと思うし、確か、Z80 とその互換CPUは世界でもっとも使われて いるCPUじゃなかったか?
世界で最も使われてるのは、たぶん4ビットCPUだろうけど その中で一位は統計が無い 4ビットはリモコン、時計、電気ポットと、Z80なんかに比べたら数だけは凄いぞ
4bitはトータルでは勝てるだろうが品種が多すぎる。 一昔前なら6502だろ。なんといってもファミコンで世界6千万台。ブッチギリ ただ PS1が1億台代以上売ったから塗り替えられたかもな
>>591 Z80は変な制限が多いしオペコードマップが汚すぎる。
8bitでもいまさらZ80なんかを選ぶ理由はない。
32bitだけど68000でもやった方がマシ。ずっと素直だしね。
>>594 Z80 は組み込み系で現物を使う機会が僅かながらにあると思うんだが、68000 はどうなんだ?
x86
>>597 MSXエミュレータを忘れもらっちゃ困るw
x86 CPUの累計出荷数は2003年に10億 2007年までにさらに10億で20億の予定だそうだ ただ、x86はアセンブラで書く事は殆どないだろう。 一部高速化の為に使うか、コンパイラ製作者が使うだけだ
1bitCPUが超シンプルだろ
おまえらPICとAVRを忘れてるぞ
それなに? バンク切り替えて命令の後半が置いてきぼりになったり うっかりヒューズ切って二度と書き込めなくなったりしない のなら知ってるけど。
68000は16ビットCPUだろよ。レジスタ豊富だし、オペコードの直交性が高いからアセンブラで書くのは楽でいいよ。
32bitを見据えた16bitなアーキテクチャ。 プログラマから見たときはほぼ32bitとして見ていい。 あと、CPUとか言わない。ちゃんとMPUって言うべき。
そういう綺麗なCPUは、コンパイラも綺麗なコード出して来るんで、 アセンブラの出番はあんまり無い事になる。 直交性が無い、使い難い方が、アセンブラの出番があるという事になる
x86のMASMのASSUME擬似命令を実際のニーモニックで書いてみたいんですけど、 擬似命令とニーモニックの対応表のようなものってどこかにありませんか?
ASSUMEの意味を考えましょう DDも擬似命令だけど、対応するニーモニックは無いよね 確認したいなら、いっぺんEXE吐いて逆アセンブルしてみたら良いかと
直交性もあり、使いにくいとは思わないし、コンパイラも頑張ってはくれるけどそれでも アセンブラの知識がないとセル(のSPEの効率を上げるため)のプログラミングは難しい。
611 :
607 :2007/05/03(木) 10:21:49
>>609 DEBUGコマンドでオフセットアドレスの0000番地から逆アセンブルしてみたんですが
確かにオフセットアドレスをCSとかDSとかに代入してるようなのはないんですね
OSからセグメントアドレスはプログラムが実行される前に各レジスタに与えられてるってことですか
612 :
608 :2007/05/03(木) 10:23:09
613 :
608 :2007/05/03(木) 10:24:41
>>611 の二行目オフセットじゃなくてセグメントアドレスでしたorz
よく言う「オペコードの直行性」って何なの? いまいちイメージがつかめん
基本的に、LD/ST あるいは mov 命令のアドレッシングが どの組み合わせも出来る事だね CISCではレジスタとメモリの間も演算出来るから、その組み合わせの事も言うかな
オペコードのビットパターンを覚えておけば、アセンブラがなくてもデバッグできるのが直交性(ぉぃ
617 :
608 :2007/05/03(木) 13:12:31
マクロアセンブラがない頃はどうやってセグメント指定していたんですか?
しかし、なんでこういう性質を直交性がよい、と呼ぶのかいまいちよくわからないなあ。 直交っていうのは数学(線形代数?)の用語だと思うんだけど。 二次元の世界だと、要はナイセキ(←IMEって糞だな。こんな基本的な言葉も変換できない) が0で同じ方向の成分を持たないって意味でしょ、もともとは
>>617 マクロアセンブラが無い時代ってのは無かったと思うのだが
>>618 ようするに mov だと2つのオペランド、SRC,DSTがあるでしょ?
SRCとDSTが好きな組み合わせが可能 = SRCとDSTが独立している = 直行
なるほど「同じ成分を持たない」を「独立している」に読み替えるわけか
621 :
608 :2007/05/03(木) 13:38:47
>>619 あ、なかったんですね
さっきCOM用のコードのASSUME命令(ASSUME CS:CODE,DS:CODEってなってました)
を消したり、中身が空のセグメント作ってそれを割り当てたりしてみると
どっちも見た目正常に動いたのですが、COM型だからでしょうか?
ASSUMEが無ければ CS: DS: とかのプレフィックスが付かないだけ
623 :
608 :2007/05/03(木) 14:28:40
>>622 セグメントオーバーライドプレフィックスっていうやつですか
COMだとASSUMEは必要ないんですね、本には書くようになってるんですが、慣習付ける為ですかね
まだEXEを扱えるようになってないので出直して来ます
COMだとDS= ES= SS= CS だから まあ必要無いといえば無い
.model tiny とかしてるからでそ?
セグメントディスクリプタキャッシュってレジスタの一種なの?
627 :
質問 :2007/05/10(木) 15:32:43
↓の[eax]kernelですけど、これは何を表わしているのでしょうか? 配列のArray[]はわかりますが、[eax]kernelって... eaxはレジスタですよね? __asm { /* kernel._run->spSaved = esp;*/ mov [edx]task_t.spSaved, esp /* kernel.run = kernel._ready;*/ mov [eax]kernel._run, ecx /* esp = kernel._run->spSaved;*/ mov esp, [ecx]task_t.spSaved ret }
628 :
質問(補足) :2007/05/10(木) 15:35:20
/*::::::::::::type::::::::::::::::::::::::::::::::::::::::::::::::::*/ typedef struct { reg_t eflags; reg_t ebp; reg_t ebx; reg_t edi; reg_t esi; reg_t edx; reg_t ecx; reg_t eax; reg_t eip; reg_t eipBack; } taskStack_t; typedef struct _tcb_ { struct _tcb_* fw; struct _tcb_* bw; char* name; taskStack_t* spSaved; /* Stack value */ } tcb_t; typedef struct _dlq_ /* Double link */ { struct _dlq_* fw; struct _dlq_* bw; } dlq_t;
629 :
質問(補足2) :2007/05/10(木) 15:36:23
typedef struct { dlq_t _ready; /* Ready queue */ tcb_t* _run; /* Running task */ (略) } kcb_t; /* Task Type*/ typedef tcb_t* task_t; /*:::::::: D A T A :::::::::::::::::::::::::::::::::::::::::::::::::::*/ static kcb_t kernel; /* Kernel Control Block */ /*:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::*/ CPU:Intel Core 2 CPU 使用環境:Visual Studio C++ 2005 Express Edition
630 :
デフォルトの名無しさん :2007/05/10(木) 16:13:01
質問なんですが、 市販のCPUを実際に自分でいじれるて、 実際に確認できるものとかないんですか? 例えば、電気がながれた ほら、ここの0が1にかわって こうなってこうなってだから結果がこうなるんだ みたいなのがいいです
>>630 大昔のパソコン(?)にはデータバスやアドレスバスにLEDがついて
動いてるのが視覚的にわかったもんじゃ。
デバッガでレジスタの内容見るとかじゃだめかね?
というか0/1で動作の仕組みを理解って論理回路レベルだ。
君はハード屋さんを目指したほうがいいかもだぞ。
632 :
デフォルトの名無しさん :2007/05/10(木) 16:38:59
>>631 回答ありがとうございます。
論理回路は授業で少ししました。
電流がこう流れて、だからこうなって
みたいなのが知りたいのです。
そういうのってやっぱり企業に入らないとわからないんですかね?
特に自分で遊びながら確認できるものがいいんですが・・・
633 :
デフォルトの名無しさん :2007/05/10(木) 16:45:44
すいません抜けてました >デバッガでレジスタ とありますけど、自分は実際に電流を流してみて、 その反応がしりたいんです。 どこかに電流がながれてだからここがこう変わってみたい感じです
メイドさん表紙のあの本を片手に部品を集めてやってみるというのはどうだ。
635 :
デフォルトの名無しさん :2007/05/10(木) 16:47:53
その本図書館で見ましたw あの本も電流がここに流れて・・・ みたいなことが書かれてなかったような気がします
637 :
デフォルトの名無しさん :2007/05/10(木) 16:57:08
>>636 誘導ありがとうございます
さっそく質問してきます
639 :
デフォルトの名無しさん :2007/05/10(木) 17:02:41
>>638 ありがとうございます。
参考にさせていただきます。
つーか、今のCPUに一体どれだけトランジスタが作りこまれていると思っているんだか。
計算したことがあるが値は忘れた。 億くらいだったかな
んなわけねーなWWWWWWWWWWWWW 確か、東京ドームをもとにして計算したんだけど。
>>641-642 Core2Duoあたりだと確か3億弱くらいだっけ。
ちなみにZ80やそれ以前のものだと数千程度らしいが。
ところで、なにをどうやって東京ドームをもとに計算するんだ?
東京ドームに座布団が何枚敷けるか、から類推したとか・・・
小錦何人分?
うーん忘れたがとても多いということだけ覚えている。 またPS3のCPUがひとつ動いてない、なんか歩どまりがどうとかそういうのも覚えている。 他はうーん、ブースのアルゴリズム、これは忘れた。
JTAG使えばええやん
8085で、BIN-->ASCIIのコードの一部です。 A<---Binの値 RAR RAR RAR RAR ANI 0FH ;MSBだけの値にして CPI 0AH ;9以下かA以上か切り分け ORI 30H ;'0'〜'9'に変換 JC $+5 ;'9'以下ならジャンプ ADI 7 ;A〜Fに変換 H8系だとこのアルゴリズムで動くのですが、8085だとA〜Fが「:;<=>?」になります。 それはなぜでしょうか?
フラグの動きが違うんだろうな。 ZかCかどっちか。
651 :
649 :2007/05/12(土) 08:19:44
久しぶりだな、こんなところにくるのは。 帰巣本能みたいな感じ。
>>648 ORI を先にやって CPI 3AH にしてみたら?
653 :
デフォルトの名無しさん :2007/05/12(土) 11:02:38
A<---Binの値 RRA RRA RRA RRA AND A,0FH ;MSBだけの値にして OR A,30H ;'0'〜'9'に変換 CP A,0AH ;9以下かA以上か切り分け JR C,$+5 ;'9'以下ならジャンプ ADD A,7 ;A〜Fに変換 か。 ニモニック変換しないと分からんな。
CP A,03AH では?
ついでに言えば、jr c, $+2だな。
あ、そうかも。 CPI 3AH (CP A,3AH)だ。 $+4では?(JMP3バイト、JR2バイト)
いや、$は現在のPCの値だから、jr命令をフェッチした段階では次の命令を指している。 尤も、アセンブラが敢えてjr命令自身を指すように作られていれば別だが。
変な仕様ですね。
JMP $ とかいうコードを良く使うから、$はその命令のアドレスの事じゃないかな? だから、まあラベル使っとけと
>>658 普通の(単純な)CPUは、命令をフェッチした段階でプログラムカウンタをインクリメントするものだけど。
でないと、次の命令フェッチに間に合わせられなくなってしまう。
ついでに言えば、プログラムカウンタが次の命令を指してないとサブルーチンコールが激しく面倒な訳だが。
>JMP $ >とかいうコードを良く使うから NOPの替わり?
$はフェッチしたときのアドレスではなくて、「アセンブル時のその命令のロケーションカウンタ」 ですよ。だからZ8ニーモニックなら$+4で正解、85ニーモニックなら$+5で正解です。 JMP $は−3の相対アドレスを持ちます。 JR $は−2の相対アドレス。
MASMでは $ は現在のアドレスのオフセット値
>>661 それは、所謂無限loop。
x86だとjmp $+2で、pipelineをclearする意味合いがあるらしい。
なんで、わざわざハードの動きを得意げに説明する奴が出てくるんだろうか...。
あまりにもthreadの趣旨から外れた投稿を行う
>>665 は滅ぶべきだね。
667 :
デフォルトの名無しさん :2007/05/13(日) 01:18:16
$が何を指すかは処理系依存 無駄
671 :
671 :2007/05/13(日) 18:09:35
Visual Studio C++ 2005 Express Editionで逆アセンブルすると mov ecx, [eax]kernel._ready mov edx, [eax]kernel._run ↓ mov ecx,dword ptr [eax] mov edx,dword ptr [eax+8] となりました。 ここで、[eax]は、ポインタである、という意味ですか? CPUは、Core2 OSは、Windows Vistaです。
eaxがポインタか。 終わったな、MS。
dword ptr [eax] = EAXの指すアドレス(オフセット)にあるDouble Wordの値
常識的にebx使うだろ。 eaxだと1バイト長い。
675 :
671 :2007/05/13(日) 18:48:19
>>673 そういうことですか。
どうも、ありがとうございました。
逆アセンブルするとMSがアフォだった。
今時1バイトくらいけちけちすんなよ
MSはかなりいい加減だな。 ゴミコンパイラ発覚。
はいはいゴミゴミ
コンパイラじゃないだろ。 アセンブラで書いたのを逆アセンブルしたんだろ?
初心者大爆発(W
Express Editionがどうこう以前にインラインアセンブラで書いてるじゃん
>>627
流れから、compileをExpress Editionで行ったと解釈。 違うならスルーで。
> mov ecx, [eax]kernel._ready > mov edx, [eax]kernel._run > ↓ > mov ecx,dword ptr [eax] > mov edx,dword ptr [eax+8] >となりました。 コンパイラ(アセンブラ)の仕事はラベルのアドレス解消しかないわな。
686 :
デフォルトの名無しさん :2007/05/14(月) 18:33:10
↓関数を終了し終わると、レジスタeipのアドレスの関数が実行されます。 popをしていってリターンすると、eipに書かれているアドレスの関数が 実行されるけど、これって呼び出し側に戻らないのはおかしくないですか? static voidfunc (void) { __asm { (略) mov esp, [ecx]task_t.spParam(■) popfd pop ebp pop ebx pop edi pop esi pop edx pop ecx pop eax ret /* リターン後、task_Aを実行 */ } }
687 :
デフォルトの名無しさん :2007/05/14(月) 18:33:54
■task_t.spParamの中身です。 -kernel._run->spParam |------eflags |------ebp |------ebx |------edi |------esi |------edx |------ecx |------eax |------eip=0x00412550(task_A) +------eipBack
質問の意味が判らん。 スタックを切り替えてるって事はコルーチンとかスレッド切り替えをやってるんだろ? その部分で呼び出し元に戻らないのは当然で、 再度コールチンの切り替えが呼ばれたら、そこで再度ESPが戻されて元に戻るわけだ
689 :
デフォルトの名無しさん :2007/05/14(月) 19:32:00
>>688 スタックポインタをあまりよくわかっていませんでした。
汎用データ・レジスタをすべてpopすると、
eip(ステータスレジスタ)に書かれているアドレスに分岐されるんですね。
たまたま、↑の場合はSPを切り替えたため、
eipが、funcの呼出しもとでなかったために
task_Aが実行されたんですね。
わかりました。
>>689 > eip(ステータスレジスタ)
もっとちゃんと仕様書を読む癖つけた方がいいぞ。
eipレジスタとステイタスレジスタって何が違うの?
pushfd で保存してるのがステイタスレジスタで call で保存されてるのが
>>691 >> 仕様書を読む癖つけた方がいいぞ。
694 :
デフォルトの名無しさん :2007/05/24(木) 09:57:32
はじめまして とても困っています キーボードより入力した文字列(少なくとも2文字以上)を 逆順に並べ替え、一括して出力するプログラム 例:「abc」と入力して、「cba」と出力する ってどうしたらいいんですか?教えてください POPとPUSHを使うみたいなのですが・・・
キーボードより入力する部分は誰が書くの?
696 :
デフォルトの名無しさん :2007/05/24(木) 10:45:40
誰がってどういうことですか? とんでもなく初心者なのでよくわかりません・・・ INを使うってことですか?
俺はアセンブラよくしらねーけどさ 普通にpushしてpopすれば逆になるんじゃなかったっけ?
698 :
694 :2007/05/24(木) 11:19:41
プログラムの書き方がほとんどわからないんです STARTで始まってENDで終わるということぐらいしかほとんどわかりません よかったらソースを御願いしますm(__)m
700 :
694 :2007/05/24(木) 11:46:25
CASLUです 御願いします
>>696 IN マクロ1回で全部の文字が入るわけ?
それともターミネータが既定されてて、その文字まで1文字づつINで入力してゆくの?
702 :
694 :2007/05/24(木) 12:10:58
ターミネータとはなんですか? 一回で「abc」と入れたのが 「cba」と出てくればそれで 大丈夫だと思うのですが
INで1回に読めるのは8bitでしょ。それがASCIIの<CR>(0Dhね)なら文字列の終わりと認識して 並べ替えに入る。それまでは入力した順にpushしてく、という書き方すべきじゃね? あと、popしながら戻ってくるときに「終わり」を知るためには、最初に何か特別なコードを pushしとかないと。
おまえあたまいいな
705 :
694 :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 これの入れたものが逆に出てくるバージョンが知りたいです
706 :
694 :2007/05/24(木) 15:15:03
すみません、見づらかったです。 MACR START TOP IN AREA,LL LD GR1,LL JZE FIN OUT AREA,LL JUMP TOP FIN RET AREA DS 256 LL DS 1 END
707 :
694 :2007/05/24(木) 15:16:30
連続投稿すみませんでした スペースたくさん入れても一つになってしまいますね
VB厨の俺がCASLII仕様書片手に暇つぶしにやってみた。 REV START RPUSH IN IBUF,LEN ;IBUFへ入力, 入力された文字数はLENに格納される。 SUB GR1,GR1 ;指標レジスタ兼ループカウンタを初期化。 REV1 LD GR0,IBUF,GR1 ;IBUF先頭から数えてGR1番目の文字を、 PUSH 0,GR0 ;スタックに積む。 LAD GR1,1,GR1 ;ループカウンタをインクリメント。 CPA GR1,LEN ;入力された文字数分だけスタックに積んだか? JNZ REV1 ;まだならREV1へループする。 SUB GR1, GR1 ;ループカウンタを0にリセット。 REV2 POP GR0 ;スタックから1文字とってきて、 ST GR0,OBUF,GR1 ;OBUF先頭から数えてGR1番目へ置く。 LAD GR1,1,GR1 ;ループカウンタをインクリメント。 CPA GR1,LEN ;文字数分だけ処理したか? JNZ REV2 ;まだならREV2へループする。 OUT OBUF,LEN ;処理した文字列を出力する。 RPOP RET END IBUF DS 256 OBUF DS 256 LEN DS 1
>>705 厄介だねえ IN 命令では何バイト読まれるか判らないのか
A 1バイト又は終了なら0バイト
B Nバイトが一気に読まれる
なら比較的楽なんだけどなあ
私の計算では。 『((++) != (\/n)a) == 1』
>>708 げ、バグがある。やっぱ無しっつうことで。
これで動くかな? REV START RPUSH IN IBUF,LEN SUB GR1,GR1 CPA GR1,LEN ;追加 JZE REVE ;追加 REV1 LD GR0,IBUF,GR1 PUSH 0,GR0 LAD GR1,1,GR1 CPA GR1,LEN JNZ REV1 SUB GR1, GR1 REV2 POP GR0 ST GR0,OBUF,GR1 LAD GR1,1,GR1 CPA GR1,LEN JNZ REV2 OUT OBUF,LEN REVE RPOP ;変更 RET END IBUF DS 256 OBUF DS 256 LEN DS 1
713 :
694 :2007/05/24(木) 16:41:09
>>709 よくわかりませんが、INのところの教科書の説明では
あらかじめ割り当てられた入力装置から、ラベル1で指定した入力領域
に文字データが入力され、ラベル2で指定した領域に文字データ長が、2進
データの形でセットされます。
C言語などでは、ハードディスクやキーボードから入力する場合、OPEN
命令などで入力装置の割り当て(指定)を行いますが、CASLUではこの割
り当ては前もってなされていると仮定しています。
入力領域は256語長(256文字分)の作業域のラベル名として、この領域
に1文字を1語として対応させ、順次入力します。1語は2字分の大きさ
をもちますが、ここでは1語に1文字しか入らないので注意してください。
ようするに入力される文字は、DC命令の文字定数と同じように、各語
の上位8ビットには0のビットが入り、下位8ビットには
JIS X0201のコードが入っています。
なお、キーボード入力の復帰符号などのような区切符号は入力されません。
また、入力データが256文字をこえる場合には、以降の文字は無視する
ことになります。256文字に満たない場合は、入力領域の残りの部分は実行
前のデータを保持します。
ラベル2で指定された領域には、普通は入力されたデータ長がセットさ
れていますが、ファイルの終わり(end of file)が検出した場合(読み込む
データがなくなったとき)は−1がセットされます。
となっています。
言ってることは全然意味がわかりませんが・・・
>>708 そんな感じだとは思うのですが、エラーが出ていても
どこが間違っているのかも全然わからない素人なのです(汗
714 :
694 :2007/05/24(木) 16:52:05
>>712 ありがとうございます。でもエラーが5つ出てきました。ちなみに、エラーはこんな感じでした。
Address Object-Code Label Mnemonic Gr, Op, Xr
-------------------------------------------------------------
0000 REV START
0002 RPUSH
0004 IN IBUF,LEN
0006 SUB GR1,GR1
ニーモニック
0008 4010 0228 CPA GR1,LEN
000A 6300 0000 JZE REVE
オペランドのラベルが見つからない
000C 1001 0028 REV1 LD GR0,IBUF,GR1
000E 7000 0000 PUSH 0,GR0
<XR>レジスタ
0010 1211 0001 LAD GR1,1,GR1
0012 4010 0228 CPA GR1,LEN
0014 6200 000C JNZ REV1
0016 SUB GR1,GR1
ニーモニック
0018 7100 REV2 POP GR0
0019 1101 0128 ST GR0,OBUF,GR1
001B 1211 0001 LAD GR1,1,GR1
001D 4010 0228 CPA GR1,LEN
001F 6200 0018 JNZ REV2
0021 OUT OBUF,LEN
0023 REVE RPOP
ニーモニック
0025 8100 RET
0026 END
0028 0000 IBUF DS 256
0128 0000 OBUF DS 256
0228 0000 LEN DS 1
715 :
694 :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
とほほ。 SUBをSUBAに、R0をGR2にして、余分な空白は消さないと動かないね。 ENDの位置も間違ってる。
717 :
モンキーJ :2007/05/24(木) 17:57:09
はじめまして。すいません,MIPSなのですがこのプログラムの問題点を指摘せよとゆう 課題なのですが問題あるでしょうか?ご教授お願いします。 add $v0, $0, $0 slt $t0, $a0, $0 beq $t0, $0, loop sub $a0, $0, $a0 loop: add $v0, $v0, $a1 addi $a0, $a0, -1 bne $a0, $0, loop beq $t0, $0, end sub $v0, $0, $v0 end: よろしくお願いします。
問題があるとすれば、それはその課題の出題者の頭がだな。
使わずに済むならそれにこしたこたねんだ
>>717 MIPSのアセンブラって皆こうなん?
$とかすごく入力しにくいぞ
そうでもないよ
$ が入力しにくいってどんな環境なんだ?
shift+4って日本語でも英語でも同じだよな
まさかケータイからとか?
>>717 誰も答えないようなので一応答えてみる。
勝手に想像をめぐらすと変数aとbのかけ算の結果を返すソースコード
と思われる(C言語風にかくなら int mul(int a, int b);)ので、
その前提で問題点を指摘する。
問題点は2つ。
1. 変数$a0(int aに対応)が負の場合に符号反転して最後に再度反転するコードだが、
問題ではそうなっていない。
対策として3行目 beq $t0, $0, loopをbne $t0, $0, loopに変更すべき。
2. 変数$a0に0が入っている場合、結果$v0=0になるべきだが、1回だけループを通過
してしまうために、$v0=$a1(return b;)が返ってしまう。
対策として下記のような$a0の0チェックコードを1行目と2行目の間に挿入する。
beq $a0, 0, end
前提が間違っている可能性もあるので、そこは自分で検討してみてくれ。
727 :
デフォルトの名無しさん :2007/05/29(火) 13:45:39
この宿題スレはSAL、MAL、TALの宿題でもおkですか?
!(Φ_Φ+) 全てclear.出来る筈です…
CASLIIいじると頭が発狂しそうになるのって俺だけ?
頭が発狂ってなんかおかしくね?
頭痛が痛い
頭の頭痛が痛い
>>729 12時までには終わらせるから待っとけ。
>>735 ありがとうございます!
コメント形式も完璧で本当に助かりました。
737 :
デフォルトの名無しさん :2007/05/31(木) 11:17:36
A君とB君の家は20mの距離があって、A君は一秒間に2mのスピードで動いてB君は一秒間に2.5mのスピードで動く。 二人が同時に家から出て互いに向かって走ってったら同じ場所になるのは何秒後?
二人の距離は1秒で4.5mずつ縮まる 20/4.5=4.44444444・・・・秒後 A君は自分の家から8.88888888・・・・mの場所 B君は自分の家から11.1111111・・・・mの場所 両方の距離を足すと19.99999999・・・・m 検算でもだいたい合ってるのでこれでいいでしょう
739 :
デフォルトの名無しさん :2007/05/31(木) 11:50:43
それのどこがアセンブラの宿題?
2進数で20/4.5を計算すると循環小数にならないっていう話なのかな
100.0111 000111 000111 000111 ・・・・ 循環しますが
ワンボードマイコンのSuperAKI-80でAポートのみ出力に設定し、 接続したLEDの点灯パターンで表示される2進数値を 1ずつ1秒毎にカウントアップするプログラムを組めという課題が出たんですが ORG 8000H ;8000番地から始める LD A,8BH ;Aに8Bを入れる OUT (33H),A ;33番地にAの値を入れる XOR A ;Aの内容をクリアする LD B,255 ;Bに255を入れる LD C,40 LOOP1: INC A ;Aに1を加える OUT(30H),A ;30番地に出力する LOOP2: LD DE,24576 ;HLに24576を入れる LOOP3: DEC DE ;HLから1引く JP NZ,LOOP3 ;0でなければLOOP3に戻る DEC C ;Cから1引く JP NZ,LOOP2 ;0でなければLOOP2へ戻る DEC B ;Bから1引く JP NZ,LOOP1 ;0でないとループ1に戻る JP 1000H END このように組んでも思ったように動作してくれません。 どこがどうおかしいのか教えてください。 CPUのクロック周波数は9.8304MHzです。
コメントの書き方がヘタレだな、なぜこうしたかという意思表示が伝わってこん。 そういう1命令ごとのミクロの視点じゃなくて、もう少し大局的なコメントを書いてくれ。 例:どうやって1秒間の時間稼ぎをするのか、とか。 添削はそれから。
745 :
743 :2007/05/31(木) 22:29:23
>>744 ORG 8000H ;8000番地から始める
LD A,8BH ;Aに8Bを入れる
OUT (33H),A ;33番地にAの値を入れる
XOR A ;Aの内容をクリアする
LD B,255 ;Bに255を入れる
LD C,40 ;Cに40入れる
LOOP1: INC A ;Aに1を加える
OUT(30H),A ;30番地に出力する
;以下時間稼ぎ
;9830400=24576×40×10(JPの所要クロックサイクル)
LOOP2: LD DE,24576 ;HLに24576を入れる
LOOP3: DEC DE ;HLから1引く
JP NZ,LOOP3 ;0でなければLOOP3に戻る
DEC C ;Cから1引く
JP NZ,LOOP2 ;0でなければLOOP2へ戻る
;時間稼ぎ終わり
DEC B ;Bから1引く
JP NZ,LOOP1 ;0でないとループ1に戻る
JP 1000H
END
このコメントの書き方でよろしいでしょうか
>LOOP3: DEC DE ;HLから1引く >JP NZ,LOOP3 ;0でなければLOOP3に戻る 無意味無駄無様なコメントだな。 で、dec deはいつからフラグに影響するようになったのかね。
DEC DEとか16bitのINC/DECではフラグ変化しないハズ
>XOR A ;Aの内容をクリアする こういうところは妙にテクってたりするw
LD C,40 ;Cに40入れる これは時間稼ぎループの中に入れないとまずい。 それにしてもループで時間稼ぎとは前時代的だなw
大麻とか使えるようになるのはもっと後でしょ。 8000Hから始めて、終わったら1000Hへ行っちゃうのはいいの? Bを255回のカウンタに使っているけど、DEC B してるとこで INC A ってやれば Aだけで回せるんじゃない?・・・と思ったが、DEC DE の後でDとEの検査するのにAを 使うね。B=0から始めて、OUT (30H),Aの前でLD A,B 、 最後の判定の所 INC B でやれば 元のアイデアが生かせてpush/popも要らないかと。
命令を理解しているかどうかを確かめるために 1行ずつ命令の動作をそのままコメントに書かせる奴はいる。
Spimでオーバーフロー時の処理ルーチンって何のことだかわかりますか?
オーバーフロー時の処理ルーチンのことだろ
どんな命令与えるの?
オーバーフローが起きたときは処理系によりレジスタの内容が「最大」になるとか不定になるとか ゼロになるとかいろいろあると思う。計算の途中なら先を続けないとか、数値として編集するなら 「計算できません」的な表示を作るとか、要するに「正しい答以外の場合」の後始末が必要でしょ
756 :
デフォルトの名無しさん :2007/06/03(日) 17:25:43
本とかで調べるとmfc0命令でレジスタにコピーし、ジャンプレジスタ命令で例外が起きたコードに戻す。ってあったんで頭を抱えていたのですが、
なんだか難しく考えすぎていたようです。
>>755 ありがとうございました。
データラベル DB の組み合わせはデータラベルを識別子とする変数や配列を定義してるようなものだと思えばいいんでしょうか?
グローバル変数限定なら、まあ。
>>758 hoge DB "hanage",0
はC言語でいうところの
char* hoge = "hanage";
かなぁ。
正確には、char hoge[7]="hanage"; の訳が
>>758 >>760 は hoge: DW peke
peke: DB "hanage",0 になる。
762 :
758 :2007/06/08(金) 06:47:33
763 :
デフォルトの名無しさん :2007/06/16(土) 12:01:13
高級言語からアセンブリに落とす作業ってなんていう?
sageわすれ
コンパイル
そのままアセンブリに落とすっていってるな なんかいい名前かんがえようぜ
>>766 組み立て作業(誰にでも出来る簡単なお仕事です!未経験者歓迎)
その石のニモニックは知らないけど、アルゴリズムは以下で判るでしょ。 対応するニモニックに自分で直してね。 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
ごめん、左のスペースが詰まっちゃうんだね。命令欄までずらしてみてね。 考え方: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を商に足してゆく、という考え方です。
専用ブラウザで見ると、スペースはちゃんと残るよ。
772 :
デフォルトの名無しさん :2007/06/25(月) 14:35:58
MIPS RISCアーキテクチャのアセンブラで質問が。 文字列を入力させて、それをキューを使用して格納し、 順に出力するというプログラムを組んでいるのですが、 具体的にどのように書けばよいのでしょうか? 例えば、使用者が「PLAYSTATION」と入力した場合、 ←|P|L|A|Y|S|T|A|T|I|O|N|← となるので、Pから順に出力されていき、出力画面にはPLAYSTATIONと出力されます。
MIPSとかキューとかどうでもよかった。 読みこみ $t0,配列アドレス ラベル1: 戻れるジャンプ read_char アドレスに保存 $t0,$v0 加算 $t0,1 比較 $v0,キャリッジリターン 同一じゃなければジャンプ ラベル1 アドレスに保存 $t0,0 読みこみ $t0,配列アドレス 戻れるジャンプ print_string
774 :
デフォルトの名無しさん :2007/06/25(月) 16:49:23
>>773 C言語の文字列処理のようなものでしょうか?
このような感じでしょうか?
#include <stdio.h>
int
main() {
char str[]="String"; /* 取り扱う文字列 */
int i=0; /* カウンタ */
char c; /* 文字コード保持用 */
while((c=str[i])!='\0') {
printf("str[%d]=%c(%x)\n",i,c,c); /* 文字(%c)と文字コードの16進(%x)表示 */
i++;
}
c=str[i];
printf("str[%d]=%c(%x)\n",i,c,c);
printf("str='%s'\n",str); /* 文字列として表示する%sを使う */
775 :
772 :2007/06/25(月) 19:17:21
>>775 とりあえず
>>773-774 の情報をもとに自分で考えようと思わんのかな?
ハナから人任せじゃなかなか理解が進まないもんだよ。
ま、いいんだけどね。
777 :
772 :2007/06/25(月) 19:47:10
get命令とかputs命令ってなんなの? 貼られたURL(kyoto-su.ac.jp)によると、$v0レジスタにシステムコールの番号をロードして syscall命令を使わないといけないみたいだけど。 get: lw $v0, 8 # read_string (その他パラメータを指定して) syscall puts: lw $v0, 4 # print_string (ここでパラメータ指定) syscall
どこにも宣言が無いけど、マクロのつもりじゃまいか。
780 :
772 :2007/06/25(月) 20:57:43
えーと? spimに依存した話、って事でいいのかな?
782 :
772 :2007/06/26(火) 02:51:50
783 :
772 :2007/06/26(火) 18:20:52
課題の主旨を勘違いしていたようです。
キューではなくスタックを2度使い、普通に表示されるようにしなければならないのですが、
スタックを2回使った場合、どうやればいいのか検討もつかないので、
>>773 さんのような感じで
どなたかヒントを戴けないでしょうか?
>>772 の場合だと、 playstation と入力し、それを1番目のスタックに保存します。
1番目のスタック:noitatsyalp それを2番目のスタックに保存しなおし、 playstation となった物を
出力したいです。
最初にスタックポインタ覚えておけばいいんじゃない? 文字をget それをpush 「末尾」文字なら次へ、そうでなければ前へジャンプ 次:覚えておいたスタックポインタからpushと同じやり方で 文字を取り出して表示、「末尾」ならおしまい。
785 :
772 :2007/06/27(水) 12:18:30
786 :
772 :2007/06/27(水) 12:21:07
>>784 >「末尾」文字なら次へ、そうでなければ前へジャンプ
とは、どうやれば良いのでしょうか?
>>786 君さ。今までに出された物を理解しようとしてるか?
また使おうとしてる言語の仕様は把握してるか?
人から貰った回答をそのまま提出しても自分の身に付かないぞ。
いやいや、理解してたらここに質問にはこないだろ。 わからない部分の模範解答を見て覚えるというのは初心者には身になる事だよ。
789 :
772 :2007/06/27(水) 13:22:15
>>787 すいません。理解しようとしているのですが、
一番最初のメモリアドレスをスタックポイントに保存させて、
スタックの状態が「noitatsyalp」になるまでpushする、というのは分かったのですが、
次:覚えておいたスタックポインタからpushと同じやり方で
文字を取り出して表示、「末尾」ならおしまい。
の意味がやり方が分かりません。「noitatsyalp」となっている状態で、
スタックポイントに保存している状態だと、pの方から文字を取得できるのでしょうか?
こんな感じかと作ってみたのですが、文字を入力した瞬間、エラーが出てしまいます。
ttp://bebe.run.buttobi.net/up/src/be_1279.txt
790 :
784 :2007/06/27(水) 13:40:32
スタックに積むといいながら、789見てみるとスタックじゃなくて配列に入れてるように見える。 俺はこの石のASMはいじったことないが、add $10, 1 の後、bneってのは変だと思う。 何かとコンペアして、beかbneでなきゃおかしいでしょ。 で、その比較するものは、 「今格納した文字が特定の何かの文字か?」と判定するんじゃないの?'n'だったら終わり、 っていうんじゃあまりにもプログラムらしくないでしょ。"hellow"を入れたら動かないことになる。 ふつうは復帰(0Dh)か改行(0Ah)を入れたら1行分の文字列の終わり、と認識するもんだ。
791 :
つづき :2007/06/27(水) 13:48:53
この石に他の大部分と同じアーキテクチャのスタック機能があると仮定しての話だけど、 789はpush/popの概念解ってる? スタックポインタ(SP)という特定のレジスタがあって、自分で 初期化する場合もあるし、789が書くプログラムにきたときに特定の値にそれが初期化されてる こともある。それは処理系依存。 push-->SPの指すメモリにレジスタの1語を書き込み、SPを1語分減らす、 pop -->SPの指すメモリから1語レジスタに読み出し、SPを1語分増やす、 君の処理系でもそう?
bne $12,$11,push #$12(取得した文字)と$11(改行文字)を比較して、同じでないならpushへ飛ぶ。 分岐命令と比較命令が一つになってるだけだから、これ自体は別におかしくはないと思うけど。 スタックは使ってないように見えるね。 1.配列は下位アドレスから上位アドレスへ向かって使うが、スタックは上位から下位へ使う。 2.スタックポインタは$29(別名:$sp)で操作できる。 3.残念ながらスタック操作専用命令はないので、$spは自分でやる必要がある。 こんな感じで。 push操作 addi $sp,$sp,-4 sw $12,0($sp) pop操作 lw $12,0($sp) addi $sp,$sp,4
793 :
784 :2007/06/27(水) 14:04:18
今言語のとこ見てた。push/popが無いのね。補足ありがと。
>>792 789のやり方なら、最初に$10にarのアドレスを入れるところで、$10に$SPをコピーしておく。
で、newlineを識別したところでは$SPは何語分か減っているが、最初のコピー$10の指す
メモリから順に取り出せば入力した順に文字が取り出せる、というわけ
794 :
772 :2007/06/27(水) 15:00:14
>>792 ,793さん
書いてくださった事を元に、今書き直しています。
795 :
772 :2007/06/27(水) 15:15:44
>>792 教科書には、
push操作
sw $12,0($sp)
addi $sp,$sp,-4
pop操作
addi $sp,$sp,-4
lw $12,0($sp)
とあるのですが、どちらが正しいのでしょうか…
>>795 普通は、スタック操作は>795の方でいい。つまり、spは「次に値を格納する場所」を指すことになる。
797 :
772 :2007/06/27(水) 15:26:54
>>796 つまり、この場合、playstationを後ろからpushしていき、
pからpopするという事でしょうか?
798 :
772 :2007/06/27(水) 16:13:06
スタックポインターがある場合、スタック用に配列は指定しなくて良いのでしょうか?
先生がサンプルのプログラムをWebにアップロードすると言って音信不通(メールを送ってもすべて無視)になり、
教科書にもデータストラクチャの分野はさわりしか書いてない状態で、インターネットで情報を補完しているのですが、
参考にして組んだプログラムもまったく動かず、八方塞状態です。orz
ttp://bebe.run.buttobi.net/up/src/be_1280.txt
la $10, $29
800 :
772 :2007/06/27(水) 16:40:17
データ構造からみると、配列をスタック的に使っていると言える。 けど、マシンそのものがスタックを提供してるんだから、配列でスタックを実装する意味なんかないよね。
802 :
772 :2007/06/27(水) 17:02:28
804 :
772 :2007/06/27(水) 18:10:24
805 :
772 :2007/06/27(水) 18:46:05
もう無理です… 逝ってきますorz
そこまでできているなら後ちょっとじゃん。 >802をベースに、 printの前で$8を別のレジスタに保存、$8を0に再セット。 $8を1引く代わりに↑のレジスタを1引く。 putcした後に$8を1足して、bgtzで較べるレジスタを↑のレジスタに変更。
>>806 文字で説明しても混乱するだけだろうから、コード書いてやった方がいいんじゃね
わからん・・・。何がやりたかったのか、わからん。 はじめはキューでやらなければいけないと言い、 次にスタックを2回つかわなければならないと言い、 最後にはスタックは使わなくてもいいと言う。 からかわれてただけなのか?
809 :
806 :2007/06/27(水) 20:11:08
>>807 >808の懸念があるから敢えて書くの止めた。
810 :
772 :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が提出できなかったのでもう何でもいいから、
入力した文字をそのまま出力できれば良い、になっていました。
指導者がバカだとこうなるって見本のような……
812 :
772 :2007/06/27(水) 20:40:48
>>811 大学院生がクラスを教えてるんですが、最近子供が産まれたとかで
質問のメールを送っても無視ですorz 返信がきたことありません。
オフィスにいるはずの時間も基本いなくて、授業の後に質問したら「メールで送れ」と言うだけで…
ただやってる研究が凄いらしく、大学側に文句を言っても何も起きません。、
研究者、技術者としては最高だと思われるのですが指導者としては最悪だと思いますorz
インデックスレジスタを0に初期化 入力ルーチン: 1文字入力 バッファ先頭+インデックスレジスタの位置に格納 インデックスレジスタ+1 入力された文字が改行でないなら入力ルーチンへループ インデックスレジスタを0に初期化 出力ルーチン: バッファ先頭+インデックスレジスタの位置から文字を取り出す 取り出した1文字出力 インデックスレジスタ+1 出力した文字が改行でないなら出力ルーチンへループ 終了 入力されたのが出力されりゃいいだけなら、こんな感じじゃあるまいか。 getsとputsを使って手抜きしてもいい気がする。
814 :
772 :2007/06/27(水) 21:09:49
>>812 いや、自分で考える習慣を付けさせてるんだから最高の教官だと思うが。
816 :
772 :2007/06/27(水) 21:29:35
>>815 まともな教官なら提出期限3時間前の時点で、未提出3分の2という状況はないと思いますorz
個人的にはプログラム板の人に講義をしてもらいたいところです。
>>814 のコードですが、lb $9, A($8)がエラーを起こしているみたいです。
readで保存したsb $9, A($8)を呼び出しているだけだと思うのですが、
何がいけないのでしょうか?
そんなときには1ステップづつ実行して、自分が想定した動きをしているか確かめよう。 デバッグ作業が勝利の鍵だ。
>>816 そこは問題ない。814のコードは忘れて、810のコードに戻れ。
printの前で$8を別のレジスタに保存 が問題。
別のレジスタに$8が保存されてないからループが始まった瞬間、
0以下になりループから脱出するので一文字しか出力されない。
819 :
772 :2007/06/27(水) 22:05:38
>>817 ,818
動きました!早速提出してきます。
本当にありがとうございました!
>>819 おめ。810の時点で物凄くコード書きたかったが、手淫しながら待っててよかった。
.data S1: .asciiz "Enter a string: " S2: .asciiz "You Entered: " A: .byte 0:80 # 80 character byte array .text __start: puts S1 # prompt for input li $8, 0 # array index, I li $10, '\n' # newline character read: getc $9 # read a character sb $9, A($8) # store A[I] add $8, 1 # I <- I + 1 bne $9, $10, read # check for newline li $8, 0 # array index, I = 0 puts S2 # prompt for output print: lb $9, A($8) # load A[I] putc $9 # print A[I] add $8, 1 # I <- I + 1 bne $9, $10, read # check for newline done こんなのFランク大学の学生でも、ハナクソほじりながら出来る気が。 これを2/3が提出出来ないって、ゆとりはすごいな。
といいつつ、コピペ修正忘れてprintへ飛ぶところをreadのままにしてる 俺がゆとりだった罠。
すごい・・・2chの親切な人が全てここに集まった気がする
824 :
デフォルトの名無しさん :2007/06/28(木) 22:05:52
インテルのアセンブリ言語(たとえば加算、減算、ロード、ストア)の命令セッ トの構成とMIPSの命令セットの構成の違いを教えていただきたいのですが、お 願いします。
825 :
デフォルトの名無しさん :2007/06/28(木) 22:06:41
大学のレポートで、今日中に書かなきゃやばいです・・・
マルチ良くないぜ、たけし君
827 :
デフォルトの名無しさん :2007/06/28(木) 22:33:15
たけし? 大体マルチじゃないよ。
86系命令セットで数TFLOPSを実現するらしい
829 :
デフォルトの名無しさん :2007/06/28(木) 23:56:10
よくわからないけどありがとう・・・ 質問を打ち切ります。
ここで聞いたことを後で後悔するんだろうな
>>830 大丈夫、後で後悔するなら当たり前だから。
832 :
デフォルトの名無しさん :2007/06/30(土) 09:33:24
MIPS/SPIMにて最初の20の二乗の合計を計算するプログラムを組みたいのですが、 どうやればいいのでしょうか?
>最初の20の二乗の合計 ってなんか抜けてないか? 最初の20個の整数?素数?テーブルの中身? 何bitの情報?
834 :
デフォルトの名無しさん :2007/07/01(日) 07:20:20
835 :
834 :2007/07/01(日) 07:22:50
>>834 ニモニック知らないで指摘するけど。
・「エラーを起こす」とは?
・$0は何に使っている? その初期値は何?
・$5にロードしているらしい0x1001は適切? 仮にセグメンテーションフォルトならここで起きてない?
・結果は$2に入っていると思うのだけど、どうやって出力しているつもり?
・最後のsyscallはなに? プロセス終了か何か?
837 :
834 :2007/07/01(日) 08:57:45
>>836 ・「エラーを起こす」とは?
SPIMを使ってコンパイルをしても何も表示されません。
・$0は何に使っている? その初期値は何?
レジスターに渡す時の数値の入れ子として使っています。初期値は常に0です。
・$5にロードしているらしい0x1001は適切?
ここでnumintsをロードしたいのですが、動作していないようです…
・結果は$2に入っていると思うのだけど、どうやって出力しているつもり?
addi $v0, $0, 4 #文字を出力 宣言
add $a0, $2, $0 #$2を出力
syscall
・最後のsyscallはなに?
プロセス終了です。
なるほどなるほど。 >SPIMを使ってコンパイルをしても何も表示されません。 それはエラーじゃないな。確かに「誤り」ではあるけど普通そう言うと、 システム側が出力するエラーのことになる。 で、なんでnumintsが要るの? 1から20の数値を扱うならメモリ空間は必要ないわけだが。 >addi $v0, $0, 4 #文字を出力 宣言 >add $a0, $2, $0 #$2を出力 >syscall どう見ても>835と違うわけだが。
839 :
834 :2007/07/01(日) 09:24:44
>>838 numints、分かりやすいようにと付けたんですが、
まったく必要ないですね…
addi $v0, $0, 4等の横のコメントは今付け加えました。
これを高水準言語でやると、
int count = 0;
int i = 1;
while(i<20){
count += i * i;
i++;
}
//出力count
となると思われるのですが、アセンブラだと思い通りにいかないですね。
840 :
834 :2007/07/01(日) 09:31:37
puts = put string(文字列) put??= put ?????(整数)
842 :
834 :2007/07/01(日) 11:28:23
843 :
834 :2007/07/01(日) 13:17:09
すいません。どなたか下記のコードをMIPSアセンブラで実行した際、 2870と表示されるサンプルコードを書いてはいただけないでしょうか? int count = 0; int i = 1; while(i<20){ count += i * i; i++; } ずっとやっているのですが、全然出来ません。
>>842 >840にはputsってのがあるのに今度はまたそれがない。
putsで出力しているんじゃないの?
あんたへのレスに、ヒントになりそうなことは山ほどあるんだけど全然理解できてないだろ。
いい加減に行き当たりばったりで振り回さないでくれるかな。
自演だとでも?
とりあえずさ、わからないで答えてるやつは自重しようよ。
# 1~20までの二乗の合計を求める (記述言語:MAL) # 使用レジスタ # $t0($8) : ループカウンタ .text .globl __start __start: li $t0,20 #ループカウンタ。初期値は20。 mtlo $zero #アキュームレータ下位を0に初期化。 while: beqz $t0,end #ループカウンタが0ならば、ループを抜ける。 madd $t0,$t0 #二乗をアキュームレータに加算。 addi $t0,-1 #ループカウンタをデクリメント。 b while #whileへループ end: mflo $a0 #$a0 = アキュムーレータ下位 (=合計) li $v0,1 #合計を出力。使うのは syscall print_int syscall li $v0,10 #syscall exit syscall
850 :
834 :2007/07/02(月) 06:09:57
>>849 完璧です!きちんと表示されました。ありがとうございました!
851 :
834 :2007/07/02(月) 06:13:03
あと、UC系列ですがUC Berkleyではありません。
結局、丸投げに終わったわけだ。
>>849 >
>>848 > 理論はあってるけどそれでは無理。SPIMでは出力されない。
えぇと?spim ver. 7.3で出力を確認済みなんですが?
SPIMでは出力されないという根拠を聞かせてもらいたい。
>>853 834のコードからしてspimsal使ってるんだろう。
spimsalだとそのコードでは0としか出力されない。
spimsalでは0になる?? はて、何でじゃろか?madd使ってるせい?
とりあえずmallを使わずにmulとadd使ったらちゃんと出力された。 print_intを使う事は何も問題がなさそう。
CASLIIの超初歩問題らしいですがお願いします レジスタ1の値をレジスタ2の値で割った余りをレジスタ1に格納して戻るプログラム を作成してください
simasita
>>857 REMAIND SUBA GR1,GR2
JMI LEND
JUMP REMAIND
LEND ADDA GR1,GR2
RET
860 :
デフォルトの名無しさん :2007/07/09(月) 06:57:00
RET
アセンブラを使ってオセロソフトを作れという宿題がでました サッパリわかりません CPUはathlon64 3000+ メモリ1GB VGA:Geforce6600GT です ヨロシクお願いします
俺x86は分かるんだけどx64は分からないんだ ごめんな
>>862 取り敢えず、x86でいいから作ってみてよ。漏れがx64にコンバートするから。
オセロって、コンピュータのアルゴリズムも発明しなきゃなの?
>>864 「オセロ」って言う名前のコンピュータのアルゴリズムってなんだ?
↑はネタだとしても、○投げにもほどがあるぞ。アルゴリズムぐぐるだけだって一仕事だ。 データ構造決めて、cならこんなコードになる、こんなルーチンが欲しい程度までバラしてから ここで聞くなら解るが。
867 :
デフォルトの名無しさん :2007/07/10(火) 22:18:29
CASLUの質問です。 縦横16ビットの2進数2値を使ったビットマップ表示を考える問題なんですが 全体で0のビット数より1のビット数が多い場合とそうでない場合とで条件分岐 させたいのですがどんな条件をつければいいのでしょうか? 説明下手ですみません…
1のビット数を数えて、それが128より大きければ、0のビット数<1のビット数
>>861 君の使用しているCPUではなく、授業で習っているアセンブラのCPU名を…
x86とか、MIPSとか。
オセロだろ。 漫才のネタをランダムに出すようなのを作れば良いんじゃまいか。
お前は何を訳の分からないことを言ってるんだ? 猿にキーボードを叩かせて戯曲ができるまで続けるシミュレーションソフトのことだぞ
NUM番地から5語の領域に数字が格納されている。その数字が数として どのような値になるか求め数値をVAL番地に格納する。 例)12345 NUM番地+(+1~+4)に'1','2','3','4','5'を格納してます。 JICコード見ると'1'は31、ここから'0'引いて'1'-'0'=1(数) これを'5'まで繰り返す。最後は12345をVAL番地に格納します。 レジスタはGR0~7 出力が16進の3039(10進だと12345)になるっぽいです。 よろしくお願いします。
>>872 自分の使っているアセンブラ以外にこの世にアセンブラはないと思ってるだろ?
START ENTRY
NUM DC '12345'
LEN DC 5
VAL DS 1
ENTRY XOR GR0,GR0
LAD GR1,NUM
LD GR2,LEN
LOOP LD GR3,GR0
SLA GR3,3
SLA GR0,1
ADDA GR0,GR3
ADDA GR0,0,GR1
SUBA GR0,='0'
ADDL GR1,=1
SUBL GR2,=1
JNZ LOOP
ST GR0,VAL
RET
END
>>873 ありがとうございました。
書き方もいろいろあるみたいですね。
私は
RET
NUM DC '1'
DC '2'
DC '3'
DC '4'
DC '5'
LEN DC 5
VAL DS 1
END
のような書き方なんですが、ENTRYはジャンプと考えていいですよね。
これで明日試してみます。<(_ _)>
>>874 決められていなければデータをどこに置くかは好みとか気分次第だから
STARTの後のラベル名がついたアドレスは実行のエントリポイントを表す
ラベル名を指定しなければSTARTの次から実行が始まる
CASLIIの仕様書を見れ
仕様書をみるとSTARTの前にもラベルを指定しなくちゃいけないみたいなんですけど・・・ 仕様書読みました?
>>876 命令行のラベルは無くてもいい(2.1(4))
2.2の表のほうが間違いじゃないか?
実際のところ本家のセンターのシミュレータはラベル無しSTARTを通す
ラベルありEND命令は通さないところを見ると省略可能にはあってはいけないの意味も含めるらしい
A=B+E; C=B+F; なるCのコードについて以下の問に答えよ (1) 上記のコードから生成されるMIPSのコードを示せ。 ただし各変数は次のようにメモリ上にあるものとする。 また計算途中で使用できるレジスタは$t0〜$t5とする($t:ベースレジスタ)とする。 ↓$t0からのオフセット値 0 B 4 E 8 F 12 A 16 C 宜しくお願いします。
それ質問じゃなくて丸投げ
>>878 Cコンパイラを使ってコードを生成しろ。
以上。
俺みたいなちょっとスクリプト覚えた奴と、このスレの神々が素人から見たら割と 同じように見えるっていうのが困る。俺も早く低いとこ触らないとな・・!(チラシの裏)
アセンブラ使えるだけのニートも混ざってるから あまり気にしなくてもいい気がする。
神は自らに似せて創りたもうた
誰もアセンブラの質問投げないのかよ・・・ っつーか、+αの給料欲しいならアセンブラの知識も必要だぜ? ホラ吹き営業でも給料高いけど。 なんか、質問くれくれ厨みたいな俺。
885 :
デフォルトの名無しさん :2007/07/26(木) 00:49:47
Trace/BPT/RangeErr/DivZero/Ovflow trap のエラーの意味を教えてください
>>885 CPUのマニュアル読め
せめて型式を提示すること
888
>>885 CPU名とコンパイラを教えてくれないと・・。
4番目は割り算の除数が0という意味です。
3番目は、アドレス、レジスタなど入力したい対象に代入したい定数の範囲が超えたのでは?
っていうか、質問が欲しいとは言ったが、困ってるのかな?
>>885
質問させていただきます。環境はMIPSです。 問題文: 10000!(10000の階乗)の全桁を求めて表示するプログラムを作成せよ。 効率を良くするために、一桁ごとでなく四桁ごとに区切って計算するように考える。 つまり10進数の四桁を一桁として10000進数として表現し、 その各桁ごとに掛け算と繰り上げの処理を行う。 10000の階乗は結果として10進数で35660桁(10000進数で8915)桁 となるので、配列は32bit整数8915個で十分である。 配列領域の確保は、.word擬似命令を用いる 例: 62 2702 0800 × 14 = 868 37828 11200 = 868+3 7828+1 1200 = 871 7829 1200 また、提供されているputintでは途中の0が表示されないので、 それを解決するために、配列の要素を表示するときに 1・要素が999以下なら”0”をひとつ表示 2・要素が99以下なら”0”をひとつ表示 3・要素が9以下なら”0”をひとつ表示 4・putintを使って要素の値を表示 とする
Cで記述した場合: #include<stdio.h> #define MAXKETA 10000 unsigned fact[MAXKETA]; int main(){ unsigned n = 10000; unsigned kake; unsigned agari; unsigned top; int i,j; fact[0] = 2; top = 0; for(kake = 3; kake <= n; kake++){ agari = 0; for(i = 0; i <= top; i++){ j = fact[i] * kake; j = j + agari; agari = j / 10000; fact[i] = j % 10000; } if(agari > 0){ top++; if(top >= MAXKETA) exit(-1); fact[top] = agari; } } for(i = top; i >= 0; i--){ printf("%d",fact[i]); } }
define
>>890 実行環境は正確に。
単にMIPSと書いたらMIPS32であるとみなすからね。
>>893 すみませんでした。
MIPSのバージョンとかがよく分からないんですが、
OSはLinuxで、アセンブラで記述した場合は
.text
.globl main
.ent main
main: subu $sp,16
sw $31,12($sp)
(ここが作成したプログラム)
move $2,$0
lw $31,12($sp)
addu $sp,16
j $31
.end main
といった感じになるものです
レジスタは$8〜15、$16〜23が使えます
同じ大学でワロタ つか解答貰ったでしょ?
そんなもの貰ってません だから多分違う大学ですね
しかし問題文がほぼ同じなんだが・・・ J科じゃないのか
つまり、 二人とも同じ非常勤講師のテストを受けてるんじゃないか? あるいは どっちかがパクったんじゃないか? そしたら、まだ解答を渡されてない方は、解答を渡された方と同じプリントをもらえるよ。 よかったな!
896がプリントをもらい忘れた、もしくはどこかにやってしまった可能性もある とりあえず895がその答えとやらを書いてあげればいいじゃないか
おまいら既に解答が存在してる問題は解きたくないのか・・・ 頑張って解いて、リロードしたら解答が貼られていた、とか嫌だよな。。。
896が何も反応しない限り895も解答出す気無いっぽいからなぁ
配列領域を.wordで確保とかしたくねえなぁ。 .spaceじゃだめなのか?
暇つぶしに10000!のやつを書いてみた。 が、素直に書きすぎたせいか実行速度が無茶苦茶遅いんだ。 なんとか高速化できないもんかね?
夜遅くすいません アセンブラなんですが OUT命令で 文字を出力したんですが そのあと もうひとつ出力命令すると 改行されず連続で出力されてしまいます。 例えば ワタシ アナタ と出力したいのに ワタシアナタ なってしまいます。 ご存知の方お願いしますm(_ _)m
>>905 お使いの環境に関するマニュアルに、出力するポジションを指定する方法か
改行する方法についての記述はございませんでしょうか。
手前どもにはそちらさまのお使いのCPUも出力機器も皆目見当がつきませんので。
>>906 申し訳ございませんでしたm(_ _)m
CASLです。
マニュアルは手元にございません。
>>907 情報処理技術者試験センターのページからダウンロードしろ。
試験受けるならマニュアルくらいは手元に持ってろ。
改行コードくらい出したいときに自分で出力しろ。
COMETだけでなくどんな環境だろうと、いつ改行したら良いか機械は知らない。
>>907 OUTは文字データを1レコードとして書き出すとしか規定されていないから、
CASLの処理系によっては改行を加えないものもあるかもしれない。
試験センターで配布されているやつは改行されたよ。
出力されない処理系なら
>>908 の言うように改行コードを自分でOUTするしかないね。
910 :
909 :2007/07/31(火) 04:57:26
「レコードの区切り符号(キーボード入力の復帰符号など)」ってあるね。 でも正確には定義されていないな。こんなにあやふやでいいのか? 仕様通りならレコード末尾のINで格納されない符号がOUTで付けられるはずだけど、 CASLの処理系って結構いい加減なものが多かったりするから。
>>904 一回計算して、結果をディスクにぶち込む。
本番プログラムはそれを読み出すようにすれば桶。
912 :
rikuu :2007/08/01(水) 11:56:28
アセンブラは、CASLUでお願いします。 入力された最大256桁の10進正整数について9の倍数か否かを判断し、結果を 出力するプログラムを作成せよ。とあるのですが、よろしくお願いします。
913 :
rikuu :2007/08/01(水) 13:03:07
ヒントも載ってたので載せます。 1.入力を受け付ける。入力文字数が0なら終了。 2.各桁の2進数を求め、加算してゆき、合計を求める。 3.各桁の合計を9で割った剰余が0になるか調べる。 4.結果を出力する。 5.1.に戻る。
914 :
rikuu :2007/08/01(水) 13:15:20
こんなヒントもありました。 COMETUには除算命令がないので、9での割り算は9(または9の倍数)を 引くことにより行う。何回か引いた結果、ちょうど0になれば9の倍数 である。最大256桁の整数であるから、最大256回引くことになる。 演算回数を減らす方法として、90を引いてゆき、0になれば9の倍数、 負になれば9を足していき、0になれば9の倍数、正になれば9の倍数 でないとして終了する方法があるらしいです。
何が解らないのですか?
まさか、全部コーディングして欲しいとか・・・ まさかな・・・
>>918 -
もうこのスレは宿題スレとして機能していないし、
真面目に勉強して自分の能力にみあった評価をしてもらった方がいいよ。
918 :
896 :2007/08/02(木) 09:39:51
>>897 確かに略称はJ科ですが…
昼間主と夜間主で違うとか?
もしよければその答えを書いていただけると助かります
参考にしてそこから自分なりのものを作りたいので
よくないのでお断りいたします
920 :
rikuu :2007/08/02(木) 20:47:04
お断りと言わず、お願いします。ヒントがあっても分からないんです。
>>920 ヒントがあっても分からないんです。
>>917 自分の能力にみあった評価をしてもらった方がいいよ。
>>912 rikuu
何が分からないんだ。
ヒントの1〜5のどれが分からないんだ。
CASLIIの入力仕様が分からないのか?
それとも、10進数を2進数に変換する方法が分からないのか?
剰余という言葉が分からないのか?
924 :
923 :2007/08/02(木) 23:32:24
>>912 rikuu
これは知ってるか?ゆとり。
ある10進数の各桁を足した値が9の倍数なら、その10進数は9で割り切れる。
例)927・・・9+2+7・・・18 18÷9=2 余り(剰余) 0 即ち、927は9で割り切れる。
実際の計算)927÷9=103 剰余 0
つまり、rikuuは、ヒントの聞き方を間違っていたんだ。おk?
でなきゃ、256桁の10進数を9で除する問題なんて正攻法では難しすぎる。
>>922 自分の能力にみあった評価をしてもらった方がいいよ。
>>912 入力された数値が9の倍数ならYESに格納され、倍数じゃない場合はNOに格納される。
TOKETA01 START
IN INBUF,INLENG
LD GR1,A
LD GR2,A
LD GR3,A
CPA GR1,INLENG
LOOP01 JZE NEXT
LD GR1,INBUF,GR2
AND GR1,C000F
ADDA GR3,GR1
ADDA GR2,=1
CPA GR2,INLENG
JNZ LOOP01
LD GR4,A
LOOP02 LAD GR4,9,GR4
CPA GR3,GR4
JZE J1
JMI J2
JUMP LOOP02
J1 ST GR3,YES
JUMP NEXT
J2 ST GR3,NO
NEXT RET
A DC 0
INBUF DS 256
INLENG DS 1
C000F DC #000F
YES DS 1
NO DS 1
END
>>927 自分の能力にみあった評価をしてもらった方がいいよ。
あなたにしては、よくがんばった、80点。
質問です。 アセンブリ言語の仕様として、 論理演算実行時にゼロフラグと符号フラグを0にリセットするような仕様は 非標準的ですか? 演習で出されたアセンブリ言語の仕様がそうなっていて、 もし非標準的なら文句を言おうと考えてますので参考までに。
931 :
デフォルトの名無しさん :2007/08/04(土) 13:01:06
あげます。
別にいいんでない? 論理演算を行うことで、算術演算の結果なんて捨てちゃっても。 そんなことは言語レベルで判断するようなことじゃないわけだし。
実在の石でもあるよ。8085とか。
ま、0をレジスタにロードすると0フラグが立つCPUもある事だし。
935 :
デフォルトの名無しさん :2007/08/04(土) 14:44:20
>>930 符号フラグはともかくゼロフラグまで常にクリアはありえねぇと思う。
あるビットが0か1かどうかAND命令で判定する場合とかどうすんのよ。
ハード的にも論理演算だけフラグ更新をしないなんて仕様は回路が複雑に
なるだけ不利なのは目に見えてる。
次スレどうする?
937 :
930 :2007/08/05(日) 00:30:42
>>932-935 どうもありがとうございます。
ゼロフラグをクリアするのはちょっと変ですよね。
その旨伝えようと思います。
また、そういう仕様のプロセッサもあるということを教えて頂き
勉強になりました。
文句つけたからって使わなけりゃいけない現実が変わるわけじゃあない。 人間が石にあわせる他ないんだ。
「靴に足を合わせろ!」がまかり通った旧軍時代みたいだな
自分で石を選択出来れば良いけど、望みどおりの石ってのも無いしな。 どこかで妥協しなけりゃならんのさ。
>>939 はぁ?今、自衛隊に入っても同じ事言われますが何か?
自衛隊に入るような奴のことまで構ってられないよ。
で、
>>941 は自衛隊に入っているのかいないのか!
>>917 ここは宿題(丸投げ)スレじゃない。
宿題質問スレなんだ。
質問スレとしては、そこそこ機能してるように思う。回りくどい回答ばかりだけど。
# アセンブラの宿題隔離スレとしてはかなり機能してるかなw
あ〜、オペコードの逆引き一覧表が欲しい。
まあ機能していなければ900レスも伸びる方が不自然だわな。 こんな広く浅い分野じゃ「アセンブラの宿題は俺にやらせろw」みたいな奇特な奴も少ないだろうし。 こんなとこじゃねえの?
ゼッパチと85なら俺に任せろ(w 狭すぎて誰も来なさそう
8086と86000とsh2とarmぐらいなら
>>948 宿題お願いします。
CPUはZ80、MSX1用の機械語モニタを2K以内に収まるように作ってください。
メモリダンプ、逆アセンブル、一行アセンブルの3つが出来るだけでいいです。
単価は30円/1行(コメント行除く)でお願いします(嘘)
>2K以内に収まるように ・・・できるとして、平均2byte/命令で最大1000行=\3マソだな。 1桁違うな。「あたりまえにできる」ことが判っていて1000行書くだけで\60マソぐらいがプロの相場。 「できるかどうかわからない」/「受け手のスキル次第でできるかもしれない」 のコストを加味 したら、\100〜\150ぐらいまでになりそうなもんだ。 宿題丸投げにしてはデカすぎる。
>>948 どこの CPU ? > 86000
>>951 妙に安いな > \100〜\150ぐらいまでになりそうなもんだ。
100で受けてバイトに30で出すと差額が儲かるとは思わないか?
>>953 完成しなかった時の責任はだれが取る?
バイト君が給料泥棒になる可能性はかなり高い
>>952 たしかIntelのRISCだ >86000
Motorola の 88000と同時期くらいだったと思うけど。
956 :
955 :2007/08/10(金) 02:52:54
すまん。80860と間違えたw 元の質問の86000は68kの間違い?
R3000
V30なら任せろ
AWとかって書くの?
960 :
デフォルトの名無しさん :2007/09/05(水) 01:37:42
アセンブリ初めて二週間。意味がわからない状態が続いています。なんとなくわかったことはCやJAVAがアセンブリになりそれが機械語に変換され、その間のアセンブリを良く知っているとパソコンの基礎を理解するのに便利ですよーの程度です。 そんな私が学校から頂いた宿題ですが、 int temp = 0; for (int i=0; i<100; i++) temp+=A[i] なるC言語をMIPSになおせ。 素人ながらもここまでやってみました。 move $t1, $zero #temp=0 move $t0, $zero addi $t0, $t0, 1 add $t3, $a0, $t0 # アレイA[i]のアドレス=$t3 addi $t1, $t1, $t3 for: slt $t2, $t0, 100 #$t3 = (i<100) beq $t2, 100, exit #if(i<100) go to exit j exit exit: プログラムの間違いを修正、アドバイスをして頂ける方がいらっしゃいましたらよろしくお願いします。
意味がわからないもなにも、CPUにさせたい動作そのものを記述するだけだろう。 命令表を見ながらやれば悩む要素なんざどこにもない。
>>960 t1<-0 temp=0;
t0<-0 i=0;
loop:
t0>=100ならexitへ if (i>=100) hoto exit;
t2<-t0*4
t1<-t1+A(t2) temp+=A[i];
t0<-t0+1 i++;
loopへジャンプ goto loop;
exit:
これをアセンブラにする
そのCのプログラムをMIPSをターゲットにして cc -S
965 :
デフォルトの名無しさん :2007/09/06(木) 03:56:44
>>960 素人ながらにナイスファイト。
一度Cコードを何らかのソフトでコンパイルして出てきたAssenblyを閲覧するというのも手だよ。
違う石のだけど、ASMリストあげるよ。 int A[100]; void main(void) { register int temp = 0; static int i; for (i=0; i<100; i++) temp+=A[i] ; }
これは8bitの石なので、mipsに直せばもっと簡単になるはず。 DSEG A_: DS 200 Z2: DS 2・・・これが i CSEG %2 LXI B,0・・・これがtemp %5 LXI H,0 SHLD Z2 __2: LHLD Z2 LXI D,100 CALL CMPHD## JNC __3 %6 LHLD Z2 DAD H LXI D,A_ DAD D MOV A,M INX H MOV H,M MOV L,A DAD B MOV C,L MOV B,H %5 LHLD Z2 INX H SHLD Z2 JMP __2 __3: RET
968 :
デフォルトの名無しさん :2007/09/06(木) 14:07:00
i have no idea
私は無いイデアを持っています
どうして関数が呼ばれて最初に push ebp ってするの?
スタックフレームを作るのに使うから。
mips用gccでクロスコンパイルすればいいんじゃまいか?
975 :
デフォルトの名無しさん :2007/09/21(金) 05:12:36
mata aerukana
976 :
デフォルトの名無しさん :2007/09/26(水) 14:37:23
ナップサック問題のプログラムができません。 誰か助けて下さい。
新スレどうします?
もし立てるなら アセンブリ に直しといて
秋月の電波時計キットを買ってきたのですが、どうやって組み立てればいいですか?
jmp 秋月スレ
>>979 かなづちで粉砕→水100ccを加え冷凍庫へ
983 :
デフォルトの名無しさん :2007/10/02(火) 05:33:39
Write a program in MIPS assembly language to convert an ASCII decimal string to an integer. Your program should expect register $a0 to hold the address of a null-terminated string containing some combination of the digits 0 through 9. Your program should compute the integer value equivalent to this string of digits, then place the number in register $v0. Your program need not handle negative numbers and need not be concerned about values larger than 231 − 1. If a nondigit character appears anywhere in the string, your program should stop with the value -1 in register $v0. For example, if register $a0 points to a sequence of three bytes 5010, 5210, 010 (the null-terminated ASCII string 24), then when the program stops, register $v0 should contain the value 2410, (or 11000 in binary). (The subscript ten means base 10.)
そっちの方は「アッセンブリ」だろ、という突っ込みは野暮か?
push は ・stack pointer を +1 してからデータを積む ・データを積んでから stack pointer を +1 する のどっちですか。 CPUごとに違う気もしますが、しってる範囲でいいので教えてください。
986 :
デフォルトの名無しさん :2007/10/03(水) 04:51:18
元の質問,間違い? >231 − 1 2^(31) − 1 >5010, 5210, 010 50(10),52(10),0(10) (10)=decimal
>>985 pushはプリデクリメント、popはポストインクリメントが一般的。
Cっぽく書くとこう。
Push : *(--StackPointer) = Data;
Pop : Data = *(StackPointer++);
理由は[sp]を参照することで、最後に積んだ値(リターンアドレス)を得ることが出来るから だと思う。 もちろん、そういうアドレッシングモードが用意されていれば、だけど。 例えば8086は無理でも、その元となった8080(Z80)にはあったはず。
985は書き間違いだね。だけど世の中には、pushで+、popで−な石もある。(ADuC831/841とか)
プリデクリメント、ポストインクリメントが多いと思う
>>988 スタックポインタの演算とロード・ストアをアトミックにやる必要がないからじゃないの?
まぁ、その辺りのスレを使うほうが賢明かも知れんな。
h
t
t
p
1000ならジュースでも飲むか
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。