アセンブラの宿題質問スレ
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2006/10/18(水) 00:04:05アセンブラ好きのお兄さんに尋ねるスレ。
・必ずCPUの名前を書くこと!
・情報を小出しにしない。書ける情報は全て書いた方が得だよ。
0667デフォルトの名無しさん
2007/05/13(日) 01:18:16んなこと誰も訊いていない
0668デフォルトの名無しさん
2007/05/13(日) 01:40:16>>661
0669デフォルトの名無しさん
2007/05/13(日) 09:10:57無駄
0670デフォルトの名無しさん
2007/05/13(日) 09:34:05自演乙
0671671
2007/05/13(日) 18:09:35mov ecx, [eax]kernel._ready
mov edx, [eax]kernel._run
↓
mov ecx,dword ptr [eax]
mov edx,dword ptr [eax+8]
となりました。
ここで、[eax]は、ポインタである、という意味ですか?
CPUは、Core2 OSは、Windows Vistaです。
0672デフォルトの名無しさん
2007/05/13(日) 18:12:34終わったな、MS。
0673デフォルトの名無しさん
2007/05/13(日) 18:38:410674デフォルトの名無しさん
2007/05/13(日) 18:41:57eaxだと1バイト長い。
0676デフォルトの名無しさん
2007/05/13(日) 18:51:190677デフォルトの名無しさん
2007/05/13(日) 18:59:380678デフォルトの名無しさん
2007/05/13(日) 19:03:50ゴミコンパイラ発覚。
0679デフォルトの名無しさん
2007/05/13(日) 19:08:400680デフォルトの名無しさん
2007/05/13(日) 19:09:250681デフォルトの名無しさん
2007/05/13(日) 19:10:50>Express Edition
0683デフォルトの名無しさん
2007/05/13(日) 19:19:310685デフォルトの名無しさん
2007/05/13(日) 22:20:27> mov edx, [eax]kernel._run
> ↓
> mov ecx,dword ptr [eax]
> mov edx,dword ptr [eax+8]
>となりました。
コンパイラ(アセンブラ)の仕事はラベルのアドレス解消しかないわな。
0686デフォルトの名無しさん
2007/05/14(月) 18:33:10popをしていってリターンすると、eipに書かれているアドレスの関数が
実行されるけど、これって呼び出し側に戻らないのはおかしくないですか?
static voidfunc (void)
{ __asm
{
(略)
mov esp, [ecx]task_t.spParam(■)
popfd
pop ebp
pop ebx
pop edi
pop esi
pop edx
pop ecx
pop eax
ret /* リターン後、task_Aを実行 */
}
}
0687デフォルトの名無しさん
2007/05/14(月) 18:33:54-kernel._run->spParam
|------eflags
|------ebp
|------ebx
|------edi
|------esi
|------edx
|------ecx
|------eax
|------eip=0x00412550(task_A)
+------eipBack
0688デフォルトの名無しさん
2007/05/14(月) 18:37:42スタックを切り替えてるって事はコルーチンとかスレッド切り替えをやってるんだろ?
その部分で呼び出し元に戻らないのは当然で、
再度コールチンの切り替えが呼ばれたら、そこで再度ESPが戻されて元に戻るわけだ
0689デフォルトの名無しさん
2007/05/14(月) 19:32:00スタックポインタをあまりよくわかっていませんでした。
汎用データ・レジスタをすべてpopすると、
eip(ステータスレジスタ)に書かれているアドレスに分岐されるんですね。
たまたま、↑の場合はSPを切り替えたため、
eipが、funcの呼出しもとでなかったために
task_Aが実行されたんですね。
わかりました。
0690デフォルトの名無しさん
2007/05/14(月) 22:38:12> eip(ステータスレジスタ)
もっとちゃんと仕様書を読む癖つけた方がいいぞ。
0691デフォルトの名無しさん
2007/05/15(火) 09:18:130692デフォルトの名無しさん
2007/05/15(火) 09:23:30call で保存されてるのが
0694デフォルトの名無しさん
2007/05/24(木) 09:57:32とても困っています
キーボードより入力した文字列(少なくとも2文字以上)を
逆順に並べ替え、一括して出力するプログラム
例:「abc」と入力して、「cba」と出力する
ってどうしたらいいんですか?教えてください
POPとPUSHを使うみたいなのですが・・・
0695デフォルトの名無しさん
2007/05/24(木) 10:41:570696デフォルトの名無しさん
2007/05/24(木) 10:45:40とんでもなく初心者なのでよくわかりません・・・
INを使うってことですか?
0697デフォルトの名無しさん
2007/05/24(木) 10:59:34普通にpushしてpopすれば逆になるんじゃなかったっけ?
0698694
2007/05/24(木) 11:19:41STARTで始まってENDで終わるということぐらいしかほとんどわかりません
よかったらソースを御願いしますm(__)m
0699デフォルトの名無しさん
2007/05/24(木) 11:36:55CASL�Uか?
0700694
2007/05/24(木) 11:46:25御願いします
0701デフォルトの名無しさん
2007/05/24(木) 12:04:50IN マクロ1回で全部の文字が入るわけ?
それともターミネータが既定されてて、その文字まで1文字づつINで入力してゆくの?
0702694
2007/05/24(木) 12:10:58一回で「abc」と入れたのが
「cba」と出てくればそれで
大丈夫だと思うのですが
0703デフォルトの名無しさん
2007/05/24(木) 13:59:07並べ替えに入る。それまでは入力した順にpushしてく、という書き方すべきじゃね?
あと、popしながら戻ってくるときに「終わり」を知るためには、最初に何か特別なコードを
pushしとかないと。
0704デフォルトの名無しさん
2007/05/24(木) 14:41:480705694
2007/05/24(木) 15:08:45教科書のINとOUTのプログラムの例はこんな感じです。
MACR START
TOP IN AREA,LL
LD GR1,LL
JZE FIN
OUT AREA,LL
JUMP TOP
FIN RET
AREA DS 256
LL DS 1
END
これの入れたものが逆に出てくるバージョンが知りたいです
0706694
2007/05/24(木) 15:15:03MACR START
TOP IN AREA,LL
LD GR1,LL
JZE FIN
OUT AREA,LL
JUMP TOP
FIN RET
AREA DS 256
LL DS 1
END
0707694
2007/05/24(木) 15:16:30スペースたくさん入れても一つになってしまいますね
0708デフォルトの名無しさん
2007/05/24(木) 15:27:34REV START
RPUSH
IN IBUF,LEN ;IBUFへ入力, 入力された文字数はLENに格納される。
SUB GR1,GR1 ;指標レジスタ兼ループカウンタを初期化。
REV1 LD GR0,IBUF,GR1 ;IBUF先頭から数えてGR1番目の文字を、
PUSH 0,GR0 ;スタックに積む。
LAD GR1,1,GR1 ;ループカウンタをインクリメント。
CPA GR1,LEN ;入力された文字数分だけスタックに積んだか?
JNZ REV1 ;まだならREV1へループする。
SUB GR1, GR1 ;ループカウンタを0にリセット。
REV2 POP GR0 ;スタックから1文字とってきて、
ST GR0,OBUF,GR1 ;OBUF先頭から数えてGR1番目へ置く。
LAD GR1,1,GR1 ;ループカウンタをインクリメント。
CPA GR1,LEN ;文字数分だけ処理したか?
JNZ REV2 ;まだならREV2へループする。
OUT OBUF,LEN ;処理した文字列を出力する。
RPOP
RET
END
IBUF DS 256
OBUF DS 256
LEN DS 1
0709デフォルトの名無しさん
2007/05/24(木) 15:28:39厄介だねえ IN 命令では何バイト読まれるか判らないのか
A 1バイト又は終了なら0バイト
B Nバイトが一気に読まれる
なら比較的楽なんだけどなあ
0710気まぐれアナスイ
2007/05/24(木) 15:37:37『((++) != (\/n)a) == 1』
0711デフォルトの名無しさん
2007/05/24(木) 15:40:04げ、バグがある。やっぱ無しっつうことで。
0712デフォルトの名無しさん
2007/05/24(木) 16:23:48REV START
RPUSH
IN IBUF,LEN
SUB GR1,GR1
CPA GR1,LEN ;追加
JZE REVE ;追加
REV1 LD GR0,IBUF,GR1
PUSH 0,GR0
LAD GR1,1,GR1
CPA GR1,LEN
JNZ REV1
SUB GR1, GR1
REV2 POP GR0
ST GR0,OBUF,GR1
LAD GR1,1,GR1
CPA GR1,LEN
JNZ REV2
OUT OBUF,LEN
REVE RPOP ;変更
RET
END
IBUF DS 256
OBUF DS 256
LEN DS 1
0713694
2007/05/24(木) 16:41:09よくわかりませんが、INのところの教科書の説明では
あらかじめ割り当てられた入力装置から、ラベル1で指定した入力領域
に文字データが入力され、ラベル2で指定した領域に文字データ長が、2進
データの形でセットされます。
C言語などでは、ハードディスクやキーボードから入力する場合、OPEN
命令などで入力装置の割り当て(指定)を行いますが、CASL�Uではこの割
り当ては前もってなされていると仮定しています。
入力領域は256語長(256文字分)の作業域のラベル名として、この領域
に1文字を1語として対応させ、順次入力します。1語は2字分の大きさ
をもちますが、ここでは1語に1文字しか入らないので注意してください。
ようするに入力される文字は、DC命令の文字定数と同じように、各語
の上位8ビットには0のビットが入り、下位8ビットには
JIS X0201のコードが入っています。
なお、キーボード入力の復帰符号などのような区切符号は入力されません。
また、入力データが256文字をこえる場合には、以降の文字は無視する
ことになります。256文字に満たない場合は、入力領域の残りの部分は実行
前のデータを保持します。
ラベル2で指定された領域には、普通は入力されたデータ長がセットさ
れていますが、ファイルの終わり(end of file)が検出した場合(読み込む
データがなくなったとき)は−1がセットされます。
となっています。
言ってることは全然意味がわかりませんが・・・
>>708
そんな感じだとは思うのですが、エラーが出ていても
どこが間違っているのかも全然わからない素人なのです(汗
0714694
2007/05/24(木) 16:52:05Address Object-Code Label Mnemonic Gr, Op, Xr
-------------------------------------------------------------
0000 REV START
0002 RPUSH
0004 IN IBUF,LEN
0006 SUB GR1,GR1
ニーモニック
0008 4010 0228 CPA GR1,LEN
000A 6300 0000 JZE REVE
オペランドのラベルが見つからない
000C 1001 0028 REV1 LD GR0,IBUF,GR1
000E 7000 0000 PUSH 0,GR0
<XR>レジスタ
0010 1211 0001 LAD GR1,1,GR1
0012 4010 0228 CPA GR1,LEN
0014 6200 000C JNZ REV1
0016 SUB GR1,GR1
ニーモニック
0018 7100 REV2 POP GR0
0019 1101 0128 ST GR0,OBUF,GR1
001B 1211 0001 LAD GR1,1,GR1
001D 4010 0228 CPA GR1,LEN
001F 6200 0018 JNZ REV2
0021 OUT OBUF,LEN
0023 REVE RPOP
ニーモニック
0025 8100 RET
0026 END
0028 0000 IBUF DS 256
0128 0000 OBUF DS 256
0228 0000 LEN DS 1
0715694
2007/05/24(木) 17:28:41ちなみにこんなかんじでした
MOVE START
IN RE,LE
LAD GR1,0
LD GR2,LE
LAD GR2,-1,GR2
LD GR3,LE
SRA GR3,1
LP JZE LIST
LD GR0,RE,GR1
LD GR4,RE,GR2
ST GR4,RE,GR1
ST GR0,RE,GR2
LAD GR1,1,GR1
LAD GR2,-1,GR2
SUBA GR3,C1
JUMP LP
LIST OUT RE,LE
RET
LE DS 1
RE DS 30
C1 DC 1
END
0716デフォルトの名無しさん
2007/05/24(木) 17:51:49SUBをSUBAに、R0をGR2にして、余分な空白は消さないと動かないね。
ENDの位置も間違ってる。
0717モンキーJ
2007/05/24(木) 17:57:09課題なのですが問題あるでしょうか?ご教授お願いします。
add $v0, $0, $0
slt $t0, $a0, $0
beq $t0, $0, loop
sub $a0, $0, $a0
loop:
add $v0, $v0, $a1
addi $a0, $a0, -1
bne $a0, $0, loop
beq $t0, $0, end
sub $v0, $0, $v0
end:
よろしくお願いします。
0718デフォルトの名無しさん
2007/05/24(木) 21:25:590719デフォルトの名無しさん
2007/05/24(木) 21:39:45スタック使ってないやん…
0720デフォルトの名無しさん
2007/05/26(土) 03:21:480721デフォルトの名無しさん
2007/05/26(土) 03:27:12MIPSのアセンブラって皆こうなん?
$とかすごく入力しにくいぞ
0722デフォルトの名無しさん
2007/05/26(土) 11:08:090723デフォルトの名無しさん
2007/05/27(日) 00:12:290724・∀・)っ-○◎●
2007/05/27(日) 00:48:170725デフォルトの名無しさん
2007/05/27(日) 02:09:030726デフォルトの名無しさん
2007/05/27(日) 23:22:21誰も答えないようなので一応答えてみる。
勝手に想像をめぐらすと変数aとbのかけ算の結果を返すソースコード
と思われる(C言語風にかくなら int mul(int a, int b);)ので、
その前提で問題点を指摘する。
問題点は2つ。
1. 変数$a0(int aに対応)が負の場合に符号反転して最後に再度反転するコードだが、
問題ではそうなっていない。
対策として3行目 beq $t0, $0, loopをbne $t0, $0, loopに変更すべき。
2. 変数$a0に0が入っている場合、結果$v0=0になるべきだが、1回だけループを通過
してしまうために、$v0=$a1(return b;)が返ってしまう。
対策として下記のような$a0の0チェックコードを1行目と2行目の間に挿入する。
beq $a0, 0, end
前提が間違っている可能性もあるので、そこは自分で検討してみてくれ。
0727デフォルトの名無しさん
2007/05/29(火) 13:45:390728webmaster@気まぐれアナスイ
2007/05/29(火) 15:14:19全てclear.出来る筈です…
0729デフォルトの名無しさん
2007/05/30(水) 21:20:42期限が明日に迫っていて間に合いそうにありません。
図がズレる可能性もあったのでtxtであげました。
http://www.csync.net/service/file/view.cgi?id=1180527442
よろしくお願いします。
0730デフォルトの名無しさん
2007/05/30(水) 21:45:130731デフォルトの名無しさん
2007/05/30(水) 23:31:190732デフォルトの名無しさん
2007/05/30(水) 23:46:410733デフォルトの名無しさん
2007/05/31(木) 00:02:030734デフォルトの名無しさん
2007/05/31(木) 08:47:1612時までには終わらせるから待っとけ。
0735デフォルトの名無しさん
2007/05/31(木) 10:22:47とりあえずやってみた。
コメントの形式がこれじゃダメな場合は、自分で書き直してくれ。
ttp://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4116.txt
0736デフォルトの名無しさん
2007/05/31(木) 11:14:23ありがとうございます!
コメント形式も完璧で本当に助かりました。
0737デフォルトの名無しさん
2007/05/31(木) 11:17:36二人が同時に家から出て互いに向かって走ってったら同じ場所になるのは何秒後?
0738デフォルトの名無しさん
2007/05/31(木) 11:47:4820/4.5=4.44444444・・・・秒後
A君は自分の家から8.88888888・・・・mの場所
B君は自分の家から11.1111111・・・・mの場所
両方の距離を足すと19.99999999・・・・m
検算でもだいたい合ってるのでこれでいいでしょう
0739デフォルトの名無しさん
2007/05/31(木) 11:50:43ありがとう
本当に助かった
0740デフォルトの名無しさん
2007/05/31(木) 11:52:050741デフォルトの名無しさん
2007/05/31(木) 12:31:310742デフォルトの名無しさん
2007/05/31(木) 12:40:11循環しますが
0743デフォルトの名無しさん
2007/05/31(木) 21:53:30接続したLEDの点灯パターンで表示される2進数値を
1ずつ1秒毎にカウントアップするプログラムを組めという課題が出たんですが
ORG 8000H ;8000番地から始める
LD A,8BH ;Aに8Bを入れる
OUT (33H),A ;33番地にAの値を入れる
XOR A ;Aの内容をクリアする
LD B,255 ;Bに255を入れる
LD C,40
LOOP1: INC A ;Aに1を加える
OUT(30H),A ;30番地に出力する
LOOP2: LD DE,24576 ;HLに24576を入れる
LOOP3: DEC DE ;HLから1引く
JP NZ,LOOP3 ;0でなければLOOP3に戻る
DEC C ;Cから1引く
JP NZ,LOOP2 ;0でなければLOOP2へ戻る
DEC B ;Bから1引く
JP NZ,LOOP1 ;0でないとループ1に戻る
JP 1000H
END
このように組んでも思ったように動作してくれません。
どこがどうおかしいのか教えてください。
CPUのクロック周波数は9.8304MHzです。
0744デフォルトの名無しさん
2007/05/31(木) 22:02:27そういう1命令ごとのミクロの視点じゃなくて、もう少し大局的なコメントを書いてくれ。
例:どうやって1秒間の時間稼ぎをするのか、とか。
添削はそれから。
0745743
2007/05/31(木) 22:29:23ORG 8000H ;8000番地から始める
LD A,8BH ;Aに8Bを入れる
OUT (33H),A ;33番地にAの値を入れる
XOR A ;Aの内容をクリアする
LD B,255 ;Bに255を入れる
LD C,40 ;Cに40入れる
LOOP1: INC A ;Aに1を加える
OUT(30H),A ;30番地に出力する
;以下時間稼ぎ
;9830400=24576×40×10(JPの所要クロックサイクル)
LOOP2: LD DE,24576 ;HLに24576を入れる
LOOP3: DEC DE ;HLから1引く
JP NZ,LOOP3 ;0でなければLOOP3に戻る
DEC C ;Cから1引く
JP NZ,LOOP2 ;0でなければLOOP2へ戻る
;時間稼ぎ終わり
DEC B ;Bから1引く
JP NZ,LOOP1 ;0でないとループ1に戻る
JP 1000H
END
このコメントの書き方でよろしいでしょうか
0746デフォルトの名無しさん
2007/05/31(木) 23:10:28>JP NZ,LOOP3 ;0でなければLOOP3に戻る
無意味無駄無様なコメントだな。
で、dec deはいつからフラグに影響するようになったのかね。
0747デフォルトの名無しさん
2007/05/31(木) 23:11:350748デフォルトの名無しさん
2007/05/31(木) 23:30:25こういうところは妙にテクってたりするw
0749デフォルトの名無しさん
2007/05/31(木) 23:38:12これは時間稼ぎループの中に入れないとまずい。
それにしてもループで時間稼ぎとは前時代的だなw
0750デフォルトの名無しさん
2007/06/01(金) 05:15:198000Hから始めて、終わったら1000Hへ行っちゃうのはいいの?
Bを255回のカウンタに使っているけど、DEC B してるとこで INC A ってやれば
Aだけで回せるんじゃない?・・・と思ったが、DEC DE の後でDとEの検査するのにAを
使うね。B=0から始めて、OUT (30H),Aの前でLD A,B 、 最後の判定の所 INC B でやれば
元のアイデアが生かせてpush/popも要らないかと。
0751デフォルトの名無しさん
2007/06/01(金) 09:17:451行ずつ命令の動作をそのままコメントに書かせる奴はいる。
0752デフォルトの名無しさん
2007/06/02(土) 13:10:390753デフォルトの名無しさん
2007/06/02(土) 15:53:100754デフォルトの名無しさん
2007/06/03(日) 10:55:410755デフォルトの名無しさん
2007/06/03(日) 13:27:19ゼロになるとかいろいろあると思う。計算の途中なら先を続けないとか、数値として編集するなら
「計算できません」的な表示を作るとか、要するに「正しい答以外の場合」の後始末が必要でしょ
0756デフォルトの名無しさん
2007/06/03(日) 17:25:43なんだか難しく考えすぎていたようです。>>755 ありがとうございました。
0757デフォルトの名無しさん
2007/06/04(月) 05:35:340758デフォルトの名無しさん
2007/06/07(木) 23:35:21の組み合わせはデータラベルを識別子とする変数や配列を定義してるようなものだと思えばいいんでしょうか?
0759デフォルトの名無しさん
2007/06/08(金) 01:53:300760デフォルトの名無しさん
2007/06/08(金) 02:00:17hoge DB "hanage",0
はC言語でいうところの
char* hoge = "hanage";
かなぁ。
0761デフォルトの名無しさん
2007/06/08(金) 03:57:59>>760は hoge: DW peke
peke: DB "hanage",0 になる。
0763デフォルトの名無しさん
2007/06/16(土) 12:01:130764デフォルトの名無しさん
2007/06/16(土) 12:04:200765デフォルトの名無しさん
2007/06/16(土) 13:20:14■ このスレッドは過去ログ倉庫に格納されています