アセンブラの宿題質問スレ
レス数が900を超えています。1000を超えると表示できなくなるよ。
0001デフォルトの名無しさん
2006/10/18(水) 00:04:05アセンブラ好きのお兄さんに尋ねるスレ。
・必ずCPUの名前を書くこと!
・情報を小出しにしない。書ける情報は全て書いた方が得だよ。
0810772
2007/06/27(水) 20:18:57>>806
ありがとうございます。ご指導の通り作ったら、playstationの最初の1文字だけは表示されるようになりましたorz
書いたコードですが、どこが>>806さんの手順に沿ってないのでしょうか?
ttp://bebe.run.buttobi.net/up/src/be_1283.txt
>>808
最初課題が出されたときはキューでやれ、だったのですが
クラスメートの誰かがキューとスタックを勘違いし、スタックで作って
それがリバースオーダーの段階までいっていたので、スタックに急遽変更(その時点でキューでの提出者0)
になり、提出日が近づいてもクラスの3分の2が提出できなかったのでもう何でもいいから、
入力した文字をそのまま出力できれば良い、になっていました。
0811デフォルトの名無しさん
2007/06/27(水) 20:23:260812772
2007/06/27(水) 20:40:48大学院生がクラスを教えてるんですが、最近子供が産まれたとかで
質問のメールを送っても無視ですorz 返信がきたことありません。
オフィスにいるはずの時間も基本いなくて、授業の後に質問したら「メールで送れ」と言うだけで…
ただやってる研究が凄いらしく、大学側に文句を言っても何も起きません。、
研究者、技術者としては最高だと思われるのですが指導者としては最悪だと思いますorz
0813デフォルトの名無しさん
2007/06/27(水) 20:44:36入力ルーチン:
1文字入力
バッファ先頭+インデックスレジスタの位置に格納
インデックスレジスタ+1
入力された文字が改行でないなら入力ルーチンへループ
インデックスレジスタを0に初期化
出力ルーチン:
バッファ先頭+インデックスレジスタの位置から文字を取り出す
取り出した1文字出力
インデックスレジスタ+1
出力した文字が改行でないなら出力ルーチンへループ
終了
入力されたのが出力されりゃいいだけなら、こんな感じじゃあるまいか。
getsとputsを使って手抜きしてもいい気がする。
0814772
2007/06/27(水) 21:09:49ttp://bebe.run.buttobi.net/up/src/be_1287.gif
ttp://bebe.run.buttobi.net/up/src/be_1286.txt
0815デフォルトの名無しさん
2007/06/27(水) 21:14:18いや、自分で考える習慣を付けさせてるんだから最高の教官だと思うが。
0816772
2007/06/27(水) 21:29:35まともな教官なら提出期限3時間前の時点で、未提出3分の2という状況はないと思いますorz
個人的にはプログラム板の人に講義をしてもらいたいところです。
>>814のコードですが、lb $9, A($8)がエラーを起こしているみたいです。
readで保存したsb $9, A($8)を呼び出しているだけだと思うのですが、
何がいけないのでしょうか?
0817デフォルトの名無しさん
2007/06/27(水) 21:57:10デバッグ作業が勝利の鍵だ。
0818デフォルトの名無しさん
2007/06/27(水) 21:58:17そこは問題ない。814のコードは忘れて、810のコードに戻れ。
printの前で$8を別のレジスタに保存 が問題。
別のレジスタに$8が保存されてないからループが始まった瞬間、
0以下になりループから脱出するので一文字しか出力されない。
0819772
2007/06/27(水) 22:05:38動きました!早速提出してきます。
本当にありがとうございました!
0820デフォルトの名無しさん
2007/06/27(水) 22:10:53おめ。810の時点で物凄くコード書きたかったが、手淫しながら待っててよかった。
0821デフォルトの名無しさん
2007/06/27(水) 22:33:31S1: .asciiz "Enter a string: "
S2: .asciiz "You Entered: "
A: .byte 0:80 # 80 character byte array
.text
__start:
puts S1 # prompt for input
li $8, 0 # array index, I
li $10, '\n' # newline character
read: getc $9 # read a character
sb $9, A($8) # store A[I]
add $8, 1 # I <- I + 1
bne $9, $10, read # check for newline
li $8, 0 # array index, I = 0
puts S2 # prompt for output
print: lb $9, A($8) # load A[I]
putc $9 # print A[I]
add $8, 1 # I <- I + 1
bne $9, $10, read # check for newline
done
こんなのFランク大学の学生でも、ハナクソほじりながら出来る気が。
これを2/3が提出出来ないって、ゆとりはすごいな。
0822デフォルトの名無しさん
2007/06/27(水) 22:34:41俺がゆとりだった罠。
0823デフォルトの名無しさん
2007/06/28(木) 19:24:290824デフォルトの名無しさん
2007/06/28(木) 22:05:52トの構成とMIPSの命令セットの構成の違いを教えていただきたいのですが、お
願いします。
0825デフォルトの名無しさん
2007/06/28(木) 22:06:410826デフォルトの名無しさん
2007/06/28(木) 22:32:260827デフォルトの名無しさん
2007/06/28(木) 22:33:15大体マルチじゃないよ。
0828デフォルトの名無しさん
2007/06/28(木) 22:48:440829デフォルトの名無しさん
2007/06/28(木) 23:56:10質問を打ち切ります。
0830デフォルトの名無しさん
2007/06/29(金) 00:17:070831先に後悔するなら大変だが
2007/06/29(金) 07:55:55大丈夫、後で後悔するなら当たり前だから。
0832デフォルトの名無しさん
2007/06/30(土) 09:33:24どうやればいいのでしょうか?
0833デフォルトの名無しさん
2007/07/01(日) 05:23:18最初の20個の整数?素数?テーブルの中身? 何bitの情報?
0834デフォルトの名無しさん
2007/07/01(日) 07:20:201から20までの数値の二乗を足していって、その結果を表示するプログラムです。
説明がわかりにくくて申し訳ありませんでした。
テーブルの中身、何bitの情報というのは説明されていないので分かりません。
とにかく、結果が表示されれば良いと思います。
ここまで作ってみたのですが、エラーを起こしてしまいます。
悪い点があればご教示お願いします。
ttp://doiob.net/doiob/uploader/src/up7205.txt
0835834
2007/07/01(日) 07:22:50ttp://doiob.net/doiob/uploader/src/up7206.txt
0836デフォルトの名無しさん
2007/07/01(日) 08:32:42ニモニック知らないで指摘するけど。
・「エラーを起こす」とは?
・$0は何に使っている? その初期値は何?
・$5にロードしているらしい0x1001は適切? 仮にセグメンテーションフォルトならここで起きてない?
・結果は$2に入っていると思うのだけど、どうやって出力しているつもり?
・最後のsyscallはなに? プロセス終了か何か?
0837834
2007/07/01(日) 08:57:45・「エラーを起こす」とは?
SPIMを使ってコンパイルをしても何も表示されません。
・$0は何に使っている? その初期値は何?
レジスターに渡す時の数値の入れ子として使っています。初期値は常に0です。
・$5にロードしているらしい0x1001は適切?
ここでnumintsをロードしたいのですが、動作していないようです…
・結果は$2に入っていると思うのだけど、どうやって出力しているつもり?
addi $v0, $0, 4 #文字を出力 宣言
add $a0, $2, $0 #$2を出力
syscall
・最後のsyscallはなに?
プロセス終了です。
0838デフォルトの名無しさん
2007/07/01(日) 09:10:31>SPIMを使ってコンパイルをしても何も表示されません。
それはエラーじゃないな。確かに「誤り」ではあるけど普通そう言うと、
システム側が出力するエラーのことになる。
で、なんでnumintsが要るの?
1から20の数値を扱うならメモリ空間は必要ないわけだが。
>addi $v0, $0, 4 #文字を出力 宣言
>add $a0, $2, $0 #$2を出力
>syscall
どう見ても>835と違うわけだが。
0839834
2007/07/01(日) 09:24:44numints、分かりやすいようにと付けたんですが、
まったく必要ないですね…
addi $v0, $0, 4等の横のコメントは今付け加えました。
これを高水準言語でやると、
int count = 0;
int i = 1;
while(i<20){
count += i * i;
i++;
}
//出力count
となると思われるのですが、アセンブラだと思い通りにいかないですね。
0840834
2007/07/01(日) 09:31:37元となったプログラムです。
こちらの方は出力はされる事はされるのですが、数値ではなく
■が表示されます。おそらく、ASCIIテーブルの関係上、
そんな数値は存在しない、と返してくると思うのですが
どうやったらきちんとした数値が表示されるのでしょうか…
ttp://doiob.net/doiob/uploader/src/up7208.txt
0841デフォルトの名無しさん
2007/07/01(日) 10:17:41put??= put ?????(整数)
0842834
2007/07/01(日) 11:28:23>>840のプログラムは♂が表示されるようになりました…。
見やすいようにコメントを付けてみました。
ttp://doiob.net/doiob/uploader/src/up7210.txt
実行すると、エラーは起きないのですが、結果が何も表示されません…。
0843834
2007/07/01(日) 13:17:092870と表示されるサンプルコードを書いてはいただけないでしょうか?
int count = 0;
int i = 1;
while(i<20){
count += i * i;
i++;
}
ずっとやっているのですが、全然出来ません。
0844デフォルトの名無しさん
2007/07/01(日) 14:00:52>840にはputsってのがあるのに今度はまたそれがない。
putsで出力しているんじゃないの?
あんたへのレスに、ヒントになりそうなことは山ほどあるんだけど全然理解できてないだろ。
いい加減に行き当たりばったりで振り回さないでくれるかな。
0845デフォルトの名無しさん
2007/07/01(日) 16:03:330846あほかい
2007/07/01(日) 16:26:110847デフォルトの名無しさん
2007/07/01(日) 21:32:400848デフォルトの名無しさん
2007/07/01(日) 22:49:43# 使用レジスタ
# $t0($8) : ループカウンタ
.text
.globl __start
__start:
li $t0,20 #ループカウンタ。初期値は20。
mtlo $zero #アキュームレータ下位を0に初期化。
while: beqz $t0,end #ループカウンタが0ならば、ループを抜ける。
madd $t0,$t0 #二乗をアキュームレータに加算。
addi $t0,-1 #ループカウンタをデクリメント。
b while #whileへループ
end: mflo $a0 #$a0 = アキュムーレータ下位 (=合計)
li $v0,1 #合計を出力。使うのは syscall print_int
syscall
li $v0,10 #syscall exit
syscall
0849デフォルトの名無しさん
2007/07/02(月) 01:27:20UC BerkleyのFreshmanか?似たような事を61Cでやった事がある。
どちらもプログラムのコードはOK。でも、それでは一文字しか出力されない。
ASCIIでバイアス調整する必要もあるし、出力を自分で導かないといけない。
こんな感じで書けばいいと思う。出力確認済み。
ttp://doiob.net/doiob/uploader/src/up7298.txt
>>844
この場合、文字列、整数じゃなくて文字だろ。
puts,putiじゃなくて使うのはputc。$v11。
>>848
理論はあってるけどそれでは無理。SPIMでは出力されない。
0850834
2007/07/02(月) 06:09:57完璧です!きちんと表示されました。ありがとうございました!
0851834
2007/07/02(月) 06:13:030852デフォルトの名無しさん
2007/07/02(月) 11:09:170853デフォルトの名無しさん
2007/07/02(月) 15:33:13> >>848
> 理論はあってるけどそれでは無理。SPIMでは出力されない。
えぇと?spim ver. 7.3で出力を確認済みなんですが?
SPIMでは出力されないという根拠を聞かせてもらいたい。
0854デフォルトの名無しさん
2007/07/02(月) 19:31:38834のコードからしてspimsal使ってるんだろう。
spimsalだとそのコードでは0としか出力されない。
0855デフォルトの名無しさん
2007/07/02(月) 21:09:38はて、何でじゃろか?madd使ってるせい?
0856デフォルトの名無しさん
2007/07/04(水) 12:03:20print_intを使う事は何も問題がなさそう。
0857デフォルトの名無しさん
2007/07/07(土) 14:21:30レジスタ1の値をレジスタ2の値で割った余りをレジスタ1に格納して戻るプログラム
を作成してください
0858デフォルトの名無しさん
2007/07/07(土) 19:03:460859デフォルトの名無しさん
2007/07/07(土) 19:49:07REMAIND SUBA GR1,GR2
JMI LEND
JUMP REMAIND
LEND ADDA GR1,GR2
RET
0860デフォルトの名無しさん
2007/07/09(月) 06:57:000861デフォルトの名無しさん
2007/07/09(月) 12:08:25サッパリわかりません
CPUはathlon64 3000+
メモリ1GB
VGA:Geforce6600GT
です
ヨロシクお願いします
0862デフォルトの名無しさん
2007/07/09(月) 13:36:50ごめんな
0863デフォルトの名無しさん
2007/07/09(月) 13:51:42取り敢えず、x86でいいから作ってみてよ。漏れがx64にコンバートするから。
0864デフォルトの名無しさん
2007/07/09(月) 14:22:110865デフォルトの名無しさん
2007/07/09(月) 14:27:09「オセロ」って言う名前のコンピュータのアルゴリズムってなんだ?
0866デフォルトの名無しさん
2007/07/10(火) 10:54:49データ構造決めて、cならこんなコードになる、こんなルーチンが欲しい程度までバラしてから
ここで聞くなら解るが。
0867デフォルトの名無しさん
2007/07/10(火) 22:18:29縦横16ビットの2進数2値を使ったビットマップ表示を考える問題なんですが
全体で0のビット数より1のビット数が多い場合とそうでない場合とで条件分岐
させたいのですがどんな条件をつければいいのでしょうか?
説明下手ですみません…
0868デフォルトの名無しさん
2007/07/11(水) 00:09:380869デフォルトの名無しさん
2007/07/11(水) 04:56:23君の使用しているCPUではなく、授業で習っているアセンブラのCPU名を…
x86とか、MIPSとか。
0870デフォルトの名無しさん
2007/07/11(水) 07:32:12漫才のネタをランダムに出すようなのを作れば良いんじゃまいか。
0871デフォルトの名無しさん
2007/07/11(水) 15:15:04猿にキーボードを叩かせて戯曲ができるまで続けるシミュレーションソフトのことだぞ
0872デフォルトの名無しさん
2007/07/12(木) 18:32:53どのような値になるか求め数値をVAL番地に格納する。
例)12345
NUM番地+(+1~+4)に'1','2','3','4','5'を格納してます。
JICコード見ると'1'は31、ここから'0'引いて'1'-'0'=1(数)
これを'5'まで繰り返す。最後は12345をVAL番地に格納します。
レジスタはGR0~7
出力が16進の3039(10進だと12345)になるっぽいです。
よろしくお願いします。
0873デフォルトの名無しさん
2007/07/12(木) 19:32:01自分の使っているアセンブラ以外にこの世にアセンブラはないと思ってるだろ?
START ENTRY
NUM DC '12345'
LEN DC 5
VAL DS 1
ENTRY XOR GR0,GR0
LAD GR1,NUM
LD GR2,LEN
LOOP LD GR3,GR0
SLA GR3,3
SLA GR0,1
ADDA GR0,GR3
ADDA GR0,0,GR1
SUBA GR0,='0'
ADDL GR1,=1
SUBL GR2,=1
JNZ LOOP
ST GR0,VAL
RET
END
0874デフォルトの名無しさん
2007/07/12(木) 19:58:17書き方もいろいろあるみたいですね。
私は
RET
NUM DC '1'
DC '2'
DC '3'
DC '4'
DC '5'
LEN DC 5
VAL DS 1
END
のような書き方なんですが、ENTRYはジャンプと考えていいですよね。
これで明日試してみます。<(_ _)>
0875デフォルトの名無しさん
2007/07/12(木) 20:05:36決められていなければデータをどこに置くかは好みとか気分次第だから
STARTの後のラベル名がついたアドレスは実行のエントリポイントを表す
ラベル名を指定しなければSTARTの次から実行が始まる
CASLIIの仕様書を見れ
0876デフォルトの名無しさん
2007/07/12(木) 20:23:27仕様書読みました?
0877デフォルトの名無しさん
2007/07/12(木) 23:20:59命令行のラベルは無くてもいい(2.1(4))
2.2の表のほうが間違いじゃないか?
実際のところ本家のセンターのシミュレータはラベル無しSTARTを通す
ラベルありEND命令は通さないところを見ると省略可能にはあってはいけないの意味も含めるらしい
0878デフォルトの名無しさん
2007/07/12(木) 23:51:19C=B+F;
なるCのコードについて以下の問に答えよ
(1) 上記のコードから生成されるMIPSのコードを示せ。
ただし各変数は次のようにメモリ上にあるものとする。
また計算途中で使用できるレジスタは$t0〜$t5とする($t:ベースレジスタ)とする。
↓$t0からのオフセット値
0 B
4 E
8 F
12 A
16 C
宜しくお願いします。
0879デフォルトの名無しさん
2007/07/13(金) 14:21:230880デフォルトの名無しさん
2007/07/13(金) 14:30:16Cコンパイラを使ってコードを生成しろ。
以上。
0881デフォルトの名無しさん
2007/07/14(土) 22:13:26同じように見えるっていうのが困る。俺も早く低いとこ触らないとな・・!(チラシの裏)
0882デフォルトの名無しさん
2007/07/14(土) 22:26:06あまり気にしなくてもいい気がする。
0883デフォルトの名無しさん
2007/07/15(日) 02:19:030884デフォルトの名無しさん
2007/07/25(水) 21:12:23っつーか、+αの給料欲しいならアセンブラの知識も必要だぜ?
ホラ吹き営業でも給料高いけど。
なんか、質問くれくれ厨みたいな俺。
0885デフォルトの名無しさん
2007/07/26(木) 00:49:47のエラーの意味を教えてください
0886デフォルトの名無しさん
2007/07/26(木) 00:55:23CPUのマニュアル読め
せめて型式を提示すること
0887デフォルトの名無しさん
2007/07/26(木) 01:26:060888デフォルトの名無しさん
2007/07/26(木) 01:27:330889デフォルトの名無しさん
2007/07/26(木) 21:40:16CPU名とコンパイラを教えてくれないと・・。
4番目は割り算の除数が0という意味です。
3番目は、アドレス、レジスタなど入力したい対象に代入したい定数の範囲が超えたのでは?
っていうか、質問が欲しいとは言ったが、困ってるのかな?>>885
0890デフォルトの名無しさん
2007/07/27(金) 00:11:40問題文:
10000!(10000の階乗)の全桁を求めて表示するプログラムを作成せよ。
効率を良くするために、一桁ごとでなく四桁ごとに区切って計算するように考える。
つまり10進数の四桁を一桁として10000進数として表現し、
その各桁ごとに掛け算と繰り上げの処理を行う。
10000の階乗は結果として10進数で35660桁(10000進数で8915)桁
となるので、配列は32bit整数8915個で十分である。
配列領域の確保は、.word擬似命令を用いる
例:
62 2702 0800 × 14
= 868 37828 11200 = 868+3 7828+1 1200 = 871 7829 1200
また、提供されているputintでは途中の0が表示されないので、
それを解決するために、配列の要素を表示するときに
1・要素が999以下なら”0”をひとつ表示
2・要素が99以下なら”0”をひとつ表示
3・要素が9以下なら”0”をひとつ表示
4・putintを使って要素の値を表示
とする
0891デフォルトの名無しさん
2007/07/27(金) 00:11:43#include<stdio.h>
#define MAXKETA 10000
unsigned fact[MAXKETA];
int main(){
unsigned n = 10000;
unsigned kake;
unsigned agari;
unsigned top;
int i,j;
fact[0] = 2; top = 0;
for(kake = 3; kake <= n; kake++){
agari = 0;
for(i = 0; i <= top; i++){
j = fact[i] * kake;
j = j + agari;
agari = j / 10000;
fact[i] = j % 10000;
}
if(agari > 0){
top++;
if(top >= MAXKETA) exit(-1);
fact[top] = agari;
}
}
for(i = top; i >= 0; i--){
printf("%d",fact[i]);
}
}
0892デフォルトの名無しさん
2007/07/27(金) 00:35:250893デフォルトの名無しさん
2007/07/27(金) 04:06:20実行環境は正確に。
単にMIPSと書いたらMIPS32であるとみなすからね。
0894デフォルトの名無しさん
2007/07/27(金) 08:07:12すみませんでした。
MIPSのバージョンとかがよく分からないんですが、
OSはLinuxで、アセンブラで記述した場合は
.text
.globl main
.ent main
main: subu $sp,16
sw $31,12($sp)
(ここが作成したプログラム)
move $2,$0
lw $31,12($sp)
addu $sp,16
j $31
.end main
といった感じになるものです
レジスタは$8〜15、$16〜23が使えます
0895デフォルトの名無しさん
2007/07/27(金) 20:29:18つか解答貰ったでしょ?
0896デフォルトの名無しさん
2007/07/27(金) 23:28:53だから多分違う大学ですね
0897デフォルトの名無しさん
2007/07/27(金) 23:35:05J科じゃないのか
0898デフォルトの名無しさん
2007/07/27(金) 23:53:37なんでそんな冷たいのよwww
0899デフォルトの名無しさん
2007/07/28(土) 01:49:49二人とも同じ非常勤講師のテストを受けてるんじゃないか?
あるいは
どっちかがパクったんじゃないか?
そしたら、まだ解答を渡されてない方は、解答を渡された方と同じプリントをもらえるよ。
よかったな!
0900デフォルトの名無しさん
2007/07/28(土) 10:25:12とりあえず895がその答えとやらを書いてあげればいいじゃないか
0901デフォルトの名無しさん
2007/07/28(土) 14:00:25頑張って解いて、リロードしたら解答が貼られていた、とか嫌だよな。。。
0902デフォルトの名無しさん
2007/07/28(土) 14:24:190903デフォルトの名無しさん
2007/07/28(土) 22:33:42.spaceじゃだめなのか?
0904デフォルトの名無しさん
2007/07/30(月) 21:52:33が、素直に書きすぎたせいか実行速度が無茶苦茶遅いんだ。
なんとか高速化できないもんかね?
0905デフォルトの名無しさん
2007/07/31(火) 02:51:15アセンブラなんですが
OUT命令で
文字を出力したんですが
そのあと
もうひとつ出力命令すると
改行されず連続で出力されてしまいます。
例えば
ワタシ
アナタ
と出力したいのに
ワタシアナタ
なってしまいます。
ご存知の方お願いしますm(_ _)m
0906デフォルトの名無しさん
2007/07/31(火) 03:03:34お使いの環境に関するマニュアルに、出力するポジションを指定する方法か
改行する方法についての記述はございませんでしょうか。
手前どもにはそちらさまのお使いのCPUも出力機器も皆目見当がつきませんので。
0907デフォルトの名無しさん
2007/07/31(火) 03:05:57申し訳ございませんでしたm(_ _)m
CASLです。
マニュアルは手元にございません。
0908デフォルトの名無しさん
2007/07/31(火) 04:21:26情報処理技術者試験センターのページからダウンロードしろ。
試験受けるならマニュアルくらいは手元に持ってろ。
改行コードくらい出したいときに自分で出力しろ。
COMETだけでなくどんな環境だろうと、いつ改行したら良いか機械は知らない。
レス数が900を超えています。1000を超えると表示できなくなるよ。