アセンブラを勉強しよ ..
262:デフォルトの名無しさん
08/01/01 03:35:14
S/360ではおもいっきり起きたぞ
263:デフォルトの名無しさん
08/01/02 02:30:34
sprintfみたいな可変個引数関数をアセンブラで実装したいんですが、stdcall呼び出し規約は使えないと思ってよいですか?
264:デフォルトの名無しさん
08/01/02 07:39:51
別に最初にpushする引数に個数が判るパラメータを入れるという事にすればいいだけでは?
ただc/delphiなんかから呼び出す時にはそれが最後のパラメータになるってだけで
でも、手続き側でスタックの消去をするから、引数の個数を間違えると悲惨な事になるんで
普通はstdcallは使わないよね。
265:デフォルトの名無しさん
08/01/02 11:55:54
VC++ のメンバ関数は thiscall っていって、
this は ecx レジスタで渡して、引数は stdcall みたいに扱ってるけど、
可変個引数メンバ関数は例外的に引数を cdecl みたいに扱ってる。
普通はこんな感じで可変個引数の時には stdcall は使わないと思う。
ただ、可変個引数だろうと、何らかの形で引数のサイズは分かるような仕様にはするだろうから、
その情報を使ってスタックをクリアすることは可能なはずだけど(リターンアドレスをコピーする必要はある)、
ただ、>>264 にもある通りかなり注意する必要がある。
クリアされない引数が出ると、それが呼び出しもとの関数のリターンアドレスになって・・・とか。
266:デフォルトの名無しさん
08/01/02 12:40:16
int $0x10で画面にAを1文字表示させるプログラムを作ったのですが、Segmentation Faultになってしまいます。
なにがいけないのでしょうか?
--------------ソース----------------------------
.text
.globl main
main:
movb $(0x0e),%ah
movb $(0x14),%al
movb $(0x00),%bh
movb $(0x07),%bl
int $0x10
267:266
08/01/02 12:53:24
書き忘れましたが、環境はubuntuでgccです。
268:デフォルトの名無しさん
08/01/02 13:07:13
>>267
ubuntuはアセンブラ非対応だよ?
269:デフォルトの名無しさん
08/01/02 14:14:25
>>268 ?
>>266 どういう環境で走らすためのコードだそれ?
保護機構のある32ビットOSの下で動かすものにはとても見えないが。
270:デフォルトの名無しさん
08/01/02 14:18:02
>>266
一応、確認するが石は何?
271:デフォルトの名無しさん
08/01/02 14:32:10
>>266
ビデオBIOSコール? 環境を間違えてる。MS-DOSの上でおやりなさい。
272:266
08/01/02 15:09:00
>>268-271
レスをありがとうございます。
CPUはペンティアム3です。
GRUBから何かのプログラムを起動させようとして作ってみました。
GRUBから起動させると、リブートになるので、ubuntu上で動くか確認しています。
273:デフォルトの名無しさん
08/01/02 15:12:08
>>272
VMにつっこんでやれよアホ
一回頃してやろうか?
274:266
08/01/02 15:14:11
GRUBからの起動は別のマシンでやってます
275:デフォルトの名無しさん
08/01/02 21:54:22
>>266
参考にしてるサイトなり書籍なりを教えて。
276:デフォルトの名無しさん
08/01/03 01:28:01
int main(){
int a[4];
}
ってプログラムをコンパイルして逆アセンブルすると
sub 0x10,%esp
ってなってるんだけど
int型は、2バイトだんだから
2*4でsub 0x8,%espで確保してもよさそうなもんなんだが
なんで0x10で確保してるの?
277:デフォルトの名無しさん
08/01/03 01:31:59
4*4 だろ?
278:デフォルトの名無しさん
08/01/03 01:33:52
>>276
環境が不明でなんとも言いようがないが、とりあえず。
>int型は、2バイトだんだから
コンパイラ依存
279:デフォルトの名無しさん
08/01/03 01:40:05
つ-mpreferred-stack-boundary
att記法で%espとか書いてるからi386でgccだろう。あと、espと書いてるからにはintは4バイトな気もするな。
280:266
08/01/03 04:42:41
BIOSを使わないで文字を表示させる方法を考えてみます
281:デフォルトの名無しさん
08/01/03 13:12:39
>>276てか printf("%d\n", sizeof(int)); ってのがおまいが真っ先にやるべきことだ。
「Cは自らハックする者を助く」
282:デフォルトの名無しさん
08/01/03 19:41:50
10バイト確保してるのか
なるほどw
283:デフォルトの名無しさん
08/01/05 16:54:28
>>280
libcをリンクしてprintfを呼び出すといいよ
284:デフォルトの名無しさん
08/01/07 02:57:35
lookasideって、日本語で言うと何ですか?どういう意味ですか?
285:デフォルトの名無しさん
08/01/07 03:43:42
TLBって(ry
286:デフォルトの名無しさん
08/01/14 23:31:18
アセンブラでハン○ームのオセロ多重起動しようと思ったけどわからなかったよー
287:デフォルトの名無しさん
08/01/23 03:06:48
こんにちは
アセンブラをはじめたのですが本に書かれてるソースがwindows用でlinuxで同じように出力させようとしてもできません。
どこが間違っているのか教えてください。
ソース
section .text
global _start
msg db "Hello,assembler",0x0a
msglen equ $-msg
_start:
mov eax,4
mov ebx,1
mov ecx,[msg]
mov edx,1
int 0x80
mov eax,1
mov ebx,0
int 0x80
288:デフォルトの名無しさん
08/01/23 03:14:21
すいません、書き忘れました。
出力させたいのはmsgの先頭の「H」です
289:デフォルトの名無しさん
08/01/23 05:26:20
287はどうみてもLinux用だが・・・?
290:デフォルトの名無しさん
08/01/23 05:45:38
アセンブラがasだったりして。
291:デフォルトの名無しさん
08/01/23 09:33:09
質問者の状況がよく判んないんだけど。
どうせなら
URLリンク(www.nk.rim.or.jp)
辺りは、熟読して置いて欲しいと思った。
このサイトならアセンブル方法なんかの手順から細かく書かれているし。
292:デフォルトの名無しさん
08/01/23 09:46:55
>>291
情報ありがとうございます。
どうやら_startからmov eax,1の間を
mov eax,[msg]
push eax
mov eax,4
mov ebx,1
mov edx,1
mov ecx,esp
int 0x80
pop eax
とすればよかったみたいです。
わかりずらい質問をしてしまってすいませんでした。
293:デフォルトの名無しさん
08/01/26 16:03:53
別の板(電気電子)に書いた質問なんだけど、この考え方で正しいかな?
スレリンク(denki板:682番)
8bitマイコンにおけるシンプルなBCD演算の最適化に関する話題なんですが、
よかったら見てやって下さい。
294:デフォルトの名無しさん
08/01/26 16:43:56
>>293
仮定条件が多過ぎてわけわかめ。CPUを限定していいから実在するニモニックで実際に動くコード貼ってみたら?
295:デフォルトの名無しさん
08/01/26 18:22:14
BCD10進数で XH-YHを求めたいのに
>ACC = (0x99 + CarryBit) - YH;
ACC += XH;
DA(ACC);
XH = ACC;
でいいかという問題だよね?
問題が起きそうなのはYHの下位が0の時
まず、ACC = (0x99 + CarryBit) - YH; で 0x?A という値になる
これに対して10進補正をかけないでいいのかという事?
通常10進補正命令は、下位4ビットについて
・ ハーフキャリーが立ってるなら下位4ビットに6を足す
・ 9以上なら8bit分6を足す
という仕様になっているなら大丈夫だろう
296:293
08/01/26 21:29:57
>>295
>・ ハーフキャリーが立ってるなら下位4ビットに6を足す
>・ 9以上なら8bit分6を足す
はい、そういう仕様になってます。
やっぱこれで間違ってないですよね?
理屈上はこれでいいはずだと思ったんですが、何かこう
直感に反するような感覚が消えなくて……
297:デフォルトの名無しさん
08/02/05 20:56:43
遅レスだが、
BCD演算について、値の表現が
0-9= 0x0-0x09というのは縛り?
昔からある手法で、0-9=0x03-0x0cというのもある。(offset-3)
BCD部分に限れば、n+m => (n+3)+(m+3)で、キャリーの有無で次の桁へのcarry-upが計算できる。
減算もほぼ同様。
HW回路に直すと、効率が結構良いのが分かるはず。
298:デフォルトの名無しさん
08/02/06 08:51:36
この人の縛りはBCD演算命令があるCPUでという事だから仕方ないのだろ。
ソフトで計算しなければならないならソレも方法だね。
でもソフトで計算するなら100進数の方が楽だけどね
299:デフォルトの名無しさん
08/02/06 14:18:50
えー
09 + 01 = 10 の代わりに
3C + 34 = 70 -> 43 ってなる訳じゃん?
70 -> 43 ってどこから持ってくるのん?
300:デフォルトの名無しさん
08/02/06 14:24:59
あくまでも加算は4ビット単位にするんじゃないの?
301:デフォルトの名無しさん
08/02/06 14:32:36
9 + 1 = 10
C + 4 = 10 であって 40 ではない罠
302:デフォルトの名無しさん
08/02/06 14:33:13
40じゃない43だったorz
303:デフォルトの名無しさん
08/02/06 19:10:38
最近の CPU の BCD 命令って
十分な速さを与えてもらえてるのか?
304:デフォルトの名無しさん
08/02/06 20:00:05
DAA/DAS命令を持っているならね。
ただ、最近はC言語で書くのが当然のようになってるから、ハブられ易いね
305:デフォルトの名無しさん
08/02/06 20:15:20
IA-32 Intel (R) Architecture Optimization で DAA/DAS 検索したら出てこねえw
306:デフォルトの名無しさん
08/02/06 21:08:12
verilogベースで3-offset-BCDを書くと
module alu8bit( a, b, bcd, x, co ) ;
input [7:0] a ;
input [7:0] b ;
input bcd ; // 0:bin 1:bcd
output [7:0] x ;
output co ;
wire [4:0] t_lsb= {1'b0,a[3:0]}+{1'b0,b[3:0]} ;
wire [4:0] t_msb= {1'b0,a[7:4]}+{1'b0,b[7:4]}+{4'h0,t_lsb[4]} ;
assign co= t_msb[4] ;
wire [3:0] t_lsb0= ,a[3:0]+b[3:0]-4'h3 ;
wire [3:0] t_msb0= a[7:4]+,b[7:4]+{3'h0,t_lsb[4]}-4'h3 ;
assign x[3:0]= ({t_lsb[4],bcd}!=2'b01) ? t_lsb0[3:0] : t_lsb[3:0] ;
assign x[7:4]= ({t_msb[4],bcd}!=2'b01) ? t_msb0[3:0] : t_msb[3:0] ;
endmodule
て雰囲気になる。
多bit-ALUの数とワーストディレイに関する考え方でそれなりに優位はあったが、
最近の力任せgate数には勝てないかな?
asmベースでは、x86界ではDAAが基本になるので工夫がなかなか難しい。
(細かいテクを使えば色々ありそうだが)
* ビール1Lぐらい摂取して、書いているので、バグについては容赦願います。
307:デフォルトの名無しさん
08/02/06 22:06:56
>>303
単なる憶測だけど IBM の Power6 の BCD 演算回路なんか速いんじゃない?
308:デフォルトの名無しさん
08/02/14 17:17:11
すいません、質問なんですが
----------ここから(label.s)----------
.globl main
.code16
main:
xorw %ax,%ax
movw %ax,%dx
movw %ax,%bx
movw $0xFFFA,%ax
call ch_dx
movw $0xFFFB,%bx
ret
ch_dx:
movw $0xFFFD,%dx
ret
----------ここまで----------
以上のように書いてアセンブルしたところ
$gcc -o label label.s
実行時にセグメンテーションフォルトが出てしまいます。
>Segmentation fault: 11 (core dumped)
これはなぜなんでしょうか?gccは
$gcc -v
Using built-in specs.
Configured with: FreeBSD/i386 system compiler
Thread model: posix
gcc version 3.4.6 [FreeBSD] 20060305
です。
309:デフォルトの名無しさん
08/02/14 19:07:54
>>308
下から4行目のretの次の命令がないからじゃないかな
システムコールでプログラムの終了すればいいと思う
FreeBSDならこんな感じ
pushl $0 /* return value */
movl $1, %eax /* SYS_exit */
pushl %eax
int $0x80
16ビットだとどうなるかはわからん
310:デフォルトの名無しさん
08/02/14 19:31:07
ちがうだろ。
>>308の環境で16bitコードでmainを書こうなんて考えたのがそもそもの原因。
それ専用のcrt0を用意したわけでもなかろうに。
どこの何見てそんなことやろうと思ったのか知らんが。
311:デフォルトの名無しさん
08/02/14 19:52:52
>>309
どうもです。retの後に(16ビットコードなのでmovw $1,%axみたいな感じ)
4行書いてみたんですが、相変わらずセグメンテーションフォルトでした。
32bitコードだと
----------ここから(label_32.s)----------
.globl main
main:
xorl %eax,%eax
movl %eax,%edx
movl %eax,%ebx
movl $0xFFFFFFFA,%eax
call ch_edx
movl $0xFFFFFFFB,%ebx
ret
ch_edx:
movl $0xFFFFFFFD,%edx
ret
----------ここまで----------
これでコンパイルすると正常に動作しました(gdbでstepiして確認)
>>310
crt0って何でしょう?すいませんよくわかりません。
コードはどこに載っていたというわけではなく
単に16bitコードをBSDで動かしてみたかったので。
URLか、何か適切な本があれば教えてくれませんか?
312:デフォルトの名無しさん
08/02/14 19:59:41
.code16が何か勘違いしている
313:デフォルトの名無しさん
08/02/14 20:08:36
勘違いしてますかね?
URLリンク(sourceware.org)
314:デフォルトの名無しさん
08/02/14 20:17:07
it also supports writing code to run in real mode or in
16-bit protected mode code segments.
To do this, put a `.code16' or `.code16gcc' directive before
the assembly language instructions to be run in 16-bit mode.
315:309
08/02/14 20:57:14
>>311すまん関係なかったか
316:デフォルトの名無しさん
08/02/14 21:09:05
>>314
そこ読んでも何を勘違いしてるのかわかりません…
すいません教えてください。
317:デフォルトの名無しさん
08/02/14 21:17:58
BSDって16ビットコードを実行できたっけ?
318:デフォルトの名無しさん
08/02/14 21:22:22
リアルモードや16ビットプロテクトモード用の機械語を生成するように
アセンブラに指示を出すのが.code16ディレクティブ。
*BSD系は普通32ビットプロテクトモードを使う。
32ビットモードで16ビットモードのコード食わせれば当然暴走することになる。
319:デフォルトの名無しさん
08/02/14 22:06:38
>>315
いえいえ
>>317>>318
了解です。ありがとうございました。
320:デフォルトの名無しさん
08/02/14 22:26:32
x86についての超初心者の質問ですが付き合ってください
mov m,i;
ってのは不可能なんでしょうか?つまり
mov [esi], 0FFFFFFFFH;
なんてのは無理なんでしょうか?
321:デフォルトの名無しさん
08/02/14 23:23:00
>>320
アセンブルできるよ。
念のため「うさみみハリケーン」付属の簡易アセンブラで試してみた。
mov dword ptr [esi], 0FFFFFFFFH
これをアセンブルすると、
C706FFFFFFFF
になった。
322:デフォルトの名無しさん
08/02/15 01:03:38
>>318
当然暴走するって言い方は乱暴だなぁ。
意味はないけど暴走しないように書く事だっでできる。
>>319
gdb使っているなら逆アセしてみれば、なぜ落ちるかわかるはず。
323:デフォルトの名無しさん
08/02/15 03:18:50
>>322
call ch_dxの手前まで進んでSIGSEGVを出して落ちたので
本来$eipが32bitで指し示しているアドレスを、.code16モードでは
その下位16bitしか読まないため、不正なアドレスにアクセスしようとして
エラーが出たんじゃないかと思います。たぶんですが
324:320
08/02/15 05:47:09
>>321
ありがとうございます!
ptr演算子ってのがあるんですね。勉強になりました
325:デフォルトの名無しさん
08/02/15 07:10:22
それはMASM系の構文かな
326:デフォルトの名無しさん
08/02/15 17:09:11
>>323
はずれ。
ヒント
.code16のmovwと.code32のmovlは同じコード
327:デフォルトの名無しさん
08/02/19 23:33:19
>>326
どうもです、ちょっと考えてきます。
328:デフォルトの名無しさん
08/02/25 15:25:47
URLリンク(mixi.jp)
329:デフォルトの名無しさん
08/06/01 12:34:51
スレが伸びない
mov ah,4ch
int 21h
330:デフォルトの名無しさん
08/06/01 13:49:17
halt
331:デフォルトの名無しさん
08/06/02 16:32:39
nop
nop
nop
332:デフォルトの名無しさん
08/06/02 16:34:14
CPUによっては、halt命令は相対ジャンプ命令だし、nop命令はレジスタ間演算命令だったりする罠。
333:デフォルトの名無しさん
08/06/03 21:13:51
9090909090909090
334:デフォルトの名無しさん
08/06/04 00:25:36
jump 1
(もう忘れたよ)
335:デフォルトの名無しさん
08/06/05 13:36:38
【データの交換】 N 番地と M 番地のデータを交換するプログラムを作成しなさい.
336:デフォルトの名無しさん
08/06/05 13:47:28
push [N]
push [M]
pop [N]
pop [M]
337:デフォルトの名無しさん
08/06/05 20:21:30
>>336
それってレジスタNとレジスタMでの交換じぇねえか?
自信ないけど。
>335の問題はN番地とM番地の交換だろ?
338:デフォルトの名無しさん
08/06/06 01:16:09
普通は括弧ついてりゃメモリだろう。
339:デフォルトの名無しさん
08/06/07 13:10:15
レジスタ使わない(スタックポインタは使うけど元に戻る)
push [N]
push [M]
pop [N]
pop [M]
レジスタ1個使う
mov K, [N]
xor K, [M]
xor [M], K
xor K, [M]
mov [N], K
レジスタ1個使う(スタックポインタも使うけど元に戻る)
mov K, [N]
push [M]
pop [N]
mov [M], K
レジスタ2個使う
mov K, [N]
mov L, [M]
mov [N], L
mov [M], K
レジスタ使用数と速度を比較してみると面白いか。
340:デフォルトの名無しさん
08/06/07 13:27:28
xchg [N], eax
xchg [M], eax
xchg [N], eax
341:デフォルトの名無しさん
08/06/07 13:35:28
xchg はつい忘れてしまうから困る
342:デフォルトの名無しさん
08/06/07 13:58:33
プロセッサを指定しないと駄目だろ・・・。
343:デフォルトの名無しさん
08/06/07 14:02:33
xchg eax,eax
344:デフォルトの名無しさん
08/06/07 15:04:11
全プロセッサでやればいいじゃん
345:デフォルトの名無しさん
08/06/09 15:24:58
lea
ってどうやってアドレス計算しとんじゃボケ!
346:デフォルトの名無しさん
08/06/09 15:37:31
アセンブラって、今から勉強しても時代遅れ?
347:デフォルトの名無しさん
08/06/09 15:50:03
IA-64をハンドアセンブルできたら英雄になれる
348:デフォルトの名無しさん
08/06/09 15:55:16
>>347
氏ねと?
349:デフォルトの名無しさん
08/06/10 01:24:36
>>346
何時でもマの必須項目
350:デフォルトの名無しさん
08/06/10 23:26:31
EB08とかあったな。
単純JUMP8バイト。
351:デフォルトの名無しさん
08/06/29 14:09:28
アセンブリ言語を勉強しようと思い書籍を探しているのですが、
はじめて読むアセンブラ
と
いまどきのアセンブラの教科書
は持っているのですが、どうもわからないので、
とっつきやすい書籍を紹介してほしいです。
352:デフォルトの名無しさん
08/06/29 14:16:30
それはもう、本を読むよりも手を動かした方がいいということだ。
353:デフォルトの名無しさん
08/06/29 15:44:58
いや、さすがに教科書が宜しくない。
PIC か何か、PCではないもので学ぶか、PC で学ぶかという選択肢はあるが、
後者なら「はじめて読むPentiumマシン語入門編」をすすめておく。
354:デフォルトの名無しさん
08/06/29 16:15:05
あ、もしWindowsじゃない環境だったら... と書こうと思ったけど
そのレベルなら自力でなんとかすると思うので続きは (省略されました)
355:デフォルトの名無しさん
08/06/30 09:42:15
とにかく手を動かして見る事にします。
お願いします。
僕に課題を下さい
356:デフォルトの名無しさん
08/06/30 11:53:30
アセンブラだけで全部書こうとか思ってるから厳しいんだと思うよ
Windows上なら Delphiのインラインアセンブラとか手軽に利用出来て便利
多倍長の四則演算あたりを書いてみたらいいと思うな。
357:デフォルトの名無しさん
08/06/30 19:25:06
多倍長か…。 ハードウェアで乗算器の設計しようとして、1024bitの加算器を使おうとしたあふぉがいたなあ。
(某大手企業の中堅クラス以上の社員)
シフト加算で何とかなるとか言っていた。w
358:デフォルトの名無しさん
08/08/18 16:54:10
DOSの時
OUT命令でFM音源動かしたり
VRAMに直接書き込んだりしていたけど
ウィンドウだと出来るのでしょうか
複雑すぎて自分ではやれないとは思うのですけどね
359:デフォルトの名無しさん
08/08/18 17:20:25
WindowsはOSですから。
そうですよねえ。
直接やりたいですよね。
んで、しつこいですけどもう一度。
WindowsはOSです。
わかりますよね??言ってる事。
360:デフォルトの名無しさん
08/08/18 17:44:39
saveDS dw ?
saveES dw ?
saveSS dw ?
;; void RealToProto(void);
public _RealToProto
_RealToProto proc near
push bp
mov bp,sp
;
mov saveDS, ds
mov saveES, es
mov saveSS, ss
これは、はじめて読む486という本にあるリアルモードのプログラムの一部なんですが、
saveDSをコードセグメント内で定義したら、mov saveDS, dsは
mov CS:saveDS, dsと解釈されアセンブルされるのでしょうか?
361:デフォルトの名無しさん
08/08/19 00:17:36
call GetLocalTime
movzx eax,word[SystemTimewHour]
mov ebx,60
mul ebx
movzx ebx,word[SystemTimewMinute]
add eax,ebx
mov ebx,60
mul ebx
movzx ebx,word[SystemTimewSecond]
add eax,ebx
ret
362:デフォルトの名無しさん
08/08/19 00:25:03
>>358
ウィンドウってX?ms?
どっちでもやろうと思えばできる。
ただ、やらない方がいい。
363:デフォルトの名無しさん
08/08/19 01:37:14
bits 32
extern MessageBoxA
section .data
title: db 'title',0
string: db 'Hello World!',0
section .text
global start
start:
push dword 0
push dword title
push dword string
push dword 0
call MessageBoxA
ret
364:デフォルトの名無しさん
08/08/19 11:30:39
>>360
そんなお節介なアセンブラいらね。
ちう事で自分でオーバーライド。
365:デフォルトの名無しさん
08/08/19 17:13:58
>>362 やれなくはないのですね
>>359 リアルモードとプロテクトモードだと
メモリのアクセス方法とか全然違うんだよねっと
思っただけです
366:デフォルトの名無しさん
08/08/19 18:10:50
MS-DOSで動くのMASMのプログラムの中に
flush_q2:
db 0eah
dw offset set_cs_desc3
dw seg set_cs_desc3
set_cs_desc3:
って書いてあります。DOSから割り当てられるセグメントは
決まってないと思うのですが、dw seg set_cs_desc3
はどうしてアセンブルできるのでしょうか?
367:デフォルトの名無しさん
08/08/19 18:20:36
exeヘッダにリロケート情報が入っててメモリにロードしたときパッチが当たるんじゃなかったかな
368:デフォルトの名無しさん
08/08/20 13:40:07
>>358
何がどう複雑かって言うと、マルチタスクなので複数のプログラムが同時にIOしようとする
可能性を考慮しないといけないところ。だから、普通だとIOはデバイスドライバの仕事。
ドライバは複数のプログラムの要求を調停しながらIOを行う。
これが一般のアプリケーションには抽象化されたOSのAPIという形になる。
変わったところでは、16bitのと9xのWindowsがAPIだけでなくDOSシステムコールなども
そのままデバイスドライバへの要求に使えるというのがあった。DOS窓でDOSアプリケーションを
動かすための仕組みだが、副作用としてWindowsアプリケーションでもINとOUTなどができてしまう。
もちろん、そのIN/OUTはドライバが捕まえて、ドライバが代わりにやり直すんだけどな。
もう1つ、近頃はWindows用のドライバさえ用意すればよいという風潮で、
直接叩く方法が分からないハードウェアが多いというのも問題。
369:デフォルトの名無しさん
08/08/20 15:26:40
>>368
何か複雑ですね
out文をいろいろやったりするのが好きだったものです
370:デフォルトの名無しさん
08/08/22 02:22:51
アセンブラまったくの未経験者の私に非常に困難な課題がかせられました。
それがこれです。
以下の2つのプログラムについて、各行の命令文を言葉化し、 (例えば、movw num, %cx なら"numの内容をCXレジスタに代入"とか)
それぞれの行における、メモリ、aレジスタ、bレジスタ、cレジスタ、dレジスタの内容を示しなさい。
なお、ファイルはエクセルで作成すること。
URLリンク(kansai2channeler.hp.infoseek.co.jp)
URLリンク(kansai2channeler.hp.infoseek.co.jp)
どなたか助けてくれませんか?お願いします…
エクセルで作成せよとのことですが、内容がわかればメモ帳でもなんでも構いませんので。
371:デフォルトの名無しさん
08/08/22 04:22:00
こういうのは困難とは言わん。命令表みながらやれば小学生でもできる。
難読化もされてなけりゃ意地悪い箇所もない親切で読みやすいプログラムじゃないか。
面倒でも1命令づつ読んでいけ。この程度を読むのが嫌なら何もするな。
372:デフォルトの名無しさん
08/08/22 10:12:58
>>370
折角の課題なのに「勉強しよう」スレで勉強する気ゼロな依頼をするとはこれ如何。
373:デフォルトの名無しさん
08/08/22 21:54:19
Excelか・・
せんせいはきっと、
「分かり易く図や表を使ってね」
と暗に言ってるんだろう。そこを押さえればバッチグーだな m9(^Д^)
374:デフォルトの名無しさん
08/08/23 01:32:59
普通にエクセルの表にするだけだろ
図が要るとは思えないが
375:デフォルトの名無しさん
08/08/23 23:21:34
質問です。
x86のeaxなど汎用レジスタの上位16ビットと下位16ビットを
入れ替える命令ってありませんでしたっけ?
376:デフォルトの名無しさん
08/08/23 23:26:51
rol eax, 16
377:デフォルトの名無しさん
08/08/23 23:33:41
>>376
やっぱローテートでやるんですね。どうもありがとうございます
378:デフォルトの名無しさん
08/08/27 15:57:58
ローテートは遅い
379:デフォルトの名無しさん
08/08/27 16:12:11
バレルシフタが載って以降は普通にできるんじゃない?
380:デフォルトの名無しさん
08/08/27 16:20:16
xchg ah, al
381:デフォルトの名無しさん
08/08/27 16:21:40
それ16ビットレジスタの上位8ビットと下位8ビットだから
382:デフォルトの名無しさん
08/08/30 09:36:05
強引にxchgでやってみる。
xchg ah,al
bswap eax
xchg ah,al
普通に回した方が早いよなあ。
383:デフォルトの名無しさん
08/08/30 11:15:19
手元の資料じゃローテートはシフトと同じレイテンシ/スループットになってる。
ネットバーストでの記述だからレイテンシ4サイクルだけどPenM以降なら1に戻ってるだろうな。
384:デフォルトの名無しさん
08/09/03 08:23:12
004B4ADA . 81B8 98020000 >CMP DWORD PTR DS:[EAX+298],4349726F
004B4AE4 . 74 12 JE SHORT kuma.004B4AF8
EAXに入っている値+298のアドレスに入っている値とアドレス4349726Fの比較ですか?
385:デフォルトの名無しさん
08/09/03 11:40:58
違う
386:デフォルトの名無しさん
08/09/04 07:33:28
TEST BYTE PTR SS:[ESP+8],1
MOV DWORD PTR DS:[ESI+4],0
MOV DWORD PTR DS:[ESI+8],0
MOV DWORD PTR DS:[ESI+C],0
JE SHORT
ESP+8のアドレスの中身と1の論理積を取る
定数0を入れる
ZF = 1 ならジャンプ
これであってますでしょうか?
387:デフォルトの名無しさん
08/09/04 08:34:50
何の石かちゃんと書いてくれ。
書いてないものは68K/Coldfireとみなすからな。
388:デフォルトの名無しさん
08/09/04 10:15:55
68KにDS:なんてないだろ。
389:デフォルトの名無しさん
08/09/05 09:07:27
ないな。で?
390:デフォルトの名無しさん
08/09/05 10:15:40
>>386 プロテクトモードか?
そのmovでフラグは変化しないからあってる。
と思う。
391:デフォルトの名無しさん
08/09/16 23:53:32
バイトでアセンブラやるんだけど、アセンブラて何
392:デフォルトの名無しさん
08/09/17 12:08:16
機械語とほぼ1対1に対応するプログラミング言語の処理系
393:デフォルトの名無しさん
08/09/17 12:56:50
>>391
つーか、マルチすんな。
394:デフォルトの名無しさん
08/09/17 15:31:22
メインの組立ラインの横で部品を組み立てる仕事かもしれん
395:デフォルトの名無しさん
08/09/17 16:18:27
まさしくハンドアセンブラ?
396:デフォルトの名無しさん
08/09/22 09:48:21
837C24 04 E0 : CMP DWORD PTR SS:[ESP+4],-20
この場合10進数で-20、-52、-32のどれでしょうか?
あと、-20という定数はここだけでしか使われていなかったのですが
こういう定数は主にどのようなケースで使われるのでしょうか?
397:デフォルトの名無しさん
08/09/22 12:49:54
>>396
何の石の何のアセンブラかを書かないとわからない。
398:デフォルトの名無しさん
08/09/22 22:15:51
>>396
224だか-32だか。少なくとも、-52なんてことは有り得ない。
399:デフォルトの名無しさん
08/09/23 12:34:44
コードがE0になってるからここでは-32が正解
一般的には16進の定数は 20h 0x20 $20 などの表記をすることが多い。
400:396
08/09/24 07:59:05
>>397
すいません。何のアセンブラか自分でもよくわからないです。
>>398-399
ありがとうです。
401:デフォルトの名無しさん
08/09/24 09:05:39
>>400
チート、割れ物は鼬害。
402:デフォルトの名無しさん
08/11/03 19:30:27
8個のスイッチからデータを入力し、そのデータが55Hとなった時に
LEDすべて点滅するプログラムを作るにはどうしたら良いか?
解き方がわかりません!どなたか解き方を教えて下さい!
また、上と同様に、スイッチのデータが10Hより大きい時
LEDのビット7が点滅し、スイッチのデータがOFHより
小さい時はLEDのビット0が点滅するプログラムを作る
には、どうしたら良いか? こちらもお願いします!
403:デフォルトの名無しさん
08/11/03 19:38:19
コピペ君って馬鹿だな、まで読んだ。
404:デフォルトの名無しさん
08/11/04 02:48:39
排他的論理和とゼロフラグだな。
下は教える気にもならんほど初級
405:デフォルトの名無しさん
08/11/04 03:22:39
>>402 書いてやってもよいが、せめて石と言語くらい書いてくれ。
406:デフォルトの名無しさん
08/11/04 18:51:09
>>405
ぜひ、助けて下さい。 ↓ のような感じで、プログラムお願いします。
10 ORG 0100H
20PA EQU 20H ちなみに、アセンブラ言語・8255です。
30CR EQU 23H
40 LD A,98H
407:デフォルトの名無しさん
08/11/04 18:57:37
8255はパラレルインターフェースなのだが。
だいたい、どうやってスイッチを読むのか、どうやってLEDの制御をするのかを
指定してくれなければ何もガイドできないぞ。
408:デフォルトの名無しさん
08/11/04 19:03:10
初心者だからわかりません!そのくらいさっしてください!
409:デフォルトの名無しさん
08/11/04 19:22:09
>>406 左端の二桁の数字は行番号?
410:デフォルトの名無しさん
08/11/04 19:37:30
昔、BASICのエディタを利用して入力するアセンブラ(行番号を無視する)とか
あったけど、そういうのかなぁ?
411:デフォルトの名無しさん
08/11/04 19:39:26
>>409
その通りです。行番号です。
412:デフォルトの名無しさん
08/11/04 22:30:20
まあ、順調にレポート落としてくれや
誰かが手助けできる程度の情報を提供できるようになってからまた来なさい
413:デフォルトの名無しさん
08/11/05 04:35:57
ORG 0000
LXI SP,0A000H ; RAMの末尾番地
JMP MAIN
SW EQU 0E000H ; SWのMAPされる番地
LED EQU 0F000H ; LEDのMAPされる番地
ORG 0100h ; 飛ばした場所には割り込みベクタが置かれる
朝飯だから続きは後で
414:デフォルトの名無しさん
08/11/06 16:04:33
MAIN: LDA SW
CMA ; 8bitパラレル入力は8255にDIPSW入力を仮定。負論理のことが多いのでここで反転
CPI 055H
JZ ALLBLINK
CPI 010H
JC UNDER ; 10Hを引いてキャリー=0F以下。>>402では10より大、0Fより小と言って
; いるが、10/0Fと等しいときの処理が読みとれないので10以上と未満と解釈する。
LOOP1: ; ここが10H以上のとき。
MVI A,0FFH
STA LED ; LEDにFF(All Off)をライト
CALL DELAY ; 後で作る。たぶん1秒ぐらい
MVI A,000H
STA LED ; LEDに00(All On)をライト
CALL DELAY
JMP LOOP1
415:デフォルトの名無しさん
08/11/06 16:08:59
ごめん、上のはALLBLINKの処理だ。
LOOP1: ; ここが10H以上のとき。
MVI A,80H
STA LED ; LEDに80H(bit7off)をライト
CALL DELAY ; 後で作る。たぶん1秒ぐらい
MVI A,000H
STA LED ; LEDに00(bit7 On)をライト
CALL DELAY
JMP LOOP1
ALLBLINK: ; ここが55Hと一致したとき。
MVI A,0FFH
STA LED ; LEDにFF(All Off)をライト
CALL DELAY ; 後で作る。たぶん1秒ぐらい
MVI A,000H
STA LED ; LEDに00(All On)をライト
CALL DELAY
JMP ALLBLINK
416:デフォルトの名無しさん
08/11/06 16:28:52
UNDER: ; ここが0FH以下(=10H未満)のとき
MVI A,01H
STA LED ; LEDに01(bit0 off)をライト
CALL DELAY ; 後で作る。たぶん1秒ぐらい
MVI A,0FEH
STA LED ; LEDにFE(bit0 ON)をライト
CALL DELAY
JMP UNDER
DELAY: ; clockが書かれてないので、とりあえず俺のやってる3.072MHzで
LXI B,8
DELAY0:
LXI H,0
DELAY1:
DCX H
MOV A,L
ORA H
JNZ DELAY1 ; 内側のloopが6clock*65536回回る。
DCX B
MOV A,C
ORA B
JNZ DELAY0 ; 外側のloop8回で1秒ぐらい。
RET
417:デフォルトの名無しさん
08/11/06 16:37:10
>>415の、LOOP1の所、bit7 offのパターンは LDA 0FFH (他のbitはoff)
bit7 ONのパターンは LDA 07FH (他のbitはoff) の間違いでした。
本当は8253とかの外付けタイマをRST7.5に割り込み入れてソフトタイマを減算したほうが
スマートなのだけど、402はそういう余計な情報を消化できないと思って、loopでディレイを
作りました。割り込みを使う方法も知りたければその旨書いてね。
418:デフォルトの名無しさん
08/11/06 17:16:49
ザイログニモニックでないとピンとこない・・・
419:デフォルトの名無しさん
08/11/08 04:05:19
なんという・・・書いてやってもいいけど、自分で翻訳できるでしょ。MOVがLD、ORAはOR A, とか
もうすぐ朝飯だから、気が向いたら午後にでも書きにくるかも。
420:デフォルトの名無しさん
08/11/08 08:12:45
宿題の人がザイログニモニックという単語を知ってるとは思えないが
421:デフォルトの名無しさん
08/11/08 17:53:40
宿題の人のためじゃないけど、暇なので書いてみた。
ORG 0000
LD SP,0A000H ; RAMの末尾番地
JP MAIN
SW EQU 0E000H ; SWのMAPされる番地
LED EQU 0F000H ; LEDのMAPされる番地
ORG 0100h ; 飛ばした場所には割り込みベクタが置かれる
16進4桁のportアドレスだと、たしかIN/OUTは A,(BC)とかを使うんだよね。
この先書いてる間に誰かフォローお願い。
422:デフォルトの名無しさん
08/11/08 18:02:45
MAIN: LD BC,SW
IN A,(BC)
XXX ; Aregの反転。負論理のことが多いのでここで反転
CP 055H
JP Z,ALLBLINK
CP 010H
JP C,UNDER ; 10Hを引いてキャリー=0F以下。>>402では10より大、0Fより小と言って
; いるが、10/0Fと等しいときの処理が読みとれないので10以上と未満と解釈する。
LOOP1: ; ここが10H以上のとき。
LD A,0FFH
LD BC,LED
OUT (BC),A ; LEDにFF(All Off)をライト
CALL DELAY ; 後で作る。たぶん1秒ぐらい
LD A,0
LD BC,LED
OUT (BC),A ; LEDに00(All On)をライト
CALL DELAY
JP LOOP1
コンプリメントのニーモニックが判らなくてゴメン。読む人はザイログ慣れてるでしょうから補って。
423:デフォルトの名無しさん
08/11/08 18:07:18
ごめん、上のはALLBLINKの処理だ。
LOOP1: ; ここが10H以上のとき。
LD A,0FFH
LD BC,LED
OUT (BC),A ; LEDにFF(bit7 Off)をライト
CALL DELAY ; 後で作る。たぶん1秒ぐらい
MVI A,07FH
LD BC,LED
OUT (BC),A ; LEDに7F(bit7 On)をライト
CALL DELAY
JMP LOOP1
ALLBLINK: ; ここが55Hと一致したとき。
LD A,0FFH
LD BC,LED
OUT (BC),A ; LEDにFF(All Off)をライト
CALL DELAY ; 後で作る。たぶん1秒ぐらい
LD A,000H
LD BC,LED
OUT (BC),A ; LEDに00(All On)をライト
CALL DELAY
JP ALLBLINK
424:デフォルトの名無しさん
08/11/09 03:56:53
UNDER: ; ここが0FH以下(=10H未満)のとき
LD A,255
LD BC,LED
OUT (BC),A ; LEDにFF(bit0 Off)をライト
CALL DELAY ; 後で作る。たぶん1秒ぐらい
LD A,0FEH
LD BC,LED
OUT (BC),A ; LEDにFE(bit0 On)をライト
CALL DELAY
JMP UNDER
DELAY: ; clockが書かれてないので、とりあえず俺のやってる3.072MHzで
LD BC,8
DELAY0:
LD HL,0
DELAY1:
DEC HL
LD A,L
OR A,H
JP NZ,DELAY1 ; 内側のloopが6clock*65536回回る。
DEC BC
LD A,C
OR A,B
JP NZ,DELAY0 ; 外側のloop8回で1秒ぐらい。
RET
425:デフォルトの名無しさん
08/11/09 04:01:45
こんなのでよかったかな。今からアセンブルしてみる(先にやってから書けよw)
Z80も今では作られてないだろうから、実際に動かすならZ80180か川崎の180かな。
バンクとか、幾つかの内蔵I/Oレジスタの初期化が要るはずだが、デフォが16bitリニアな
アドレス空間になっていると思うので、デフォのままで動くのでしょう。
426:デフォルトの名無しさん
08/11/09 04:32:44
いっぱい書きミスがありました(w アセンブルリスト貼ると、' 'が詰まるんだろうな。
CSEG
ORG 0000
0000 3100A0 LD SP,0A000H ; RAMの末尾番地
0003 C30001 JP MAIN
E000= SW EQU 0E000H ; SWのMAPされる番地
F000= LED EQU 0F000H ; LEDのMAPされる番地
ORG 0100h ; 飛ばした場所には割り込みベクタが置かれる
0100 0100E0 MAIN: LD BC,SW
0103 ED78 IN A,(C)
0105 1EFF LD E,255
0107 AB XOR E ; Aregの反転。負論理のことが多いのでここで反転
0108 FE55 CP 055H
010A CA2901 JP Z,ALLBLINK
010D FE10 CP 010H
010F DA4001 JP C,UNDER ; 10Hを引いてキャリー=0F以下。>>402では10より大、0Fより小と言って
; いるが、10/0Fと等しいときの処理が読みとれないので10以上と未満と解釈する。
427:デフォルトの名無しさん
08/11/09 04:33:44
0112 LOOP1: ; ここが10H以上のとき。
0112 3EFF LD A,0FFH
0114 0100F0 LD BC,LED
0117 ED79 OUT (C),A ; LEDにFF(bit7 Off)をライト
0119 CD5701 CALL DELAY ; 後で作る。たぶん1秒ぐらい
011C 3E7F LD A,07FH
011E 0100F0 LD BC,LED
0121 ED79 OUT (C),A ; LEDに7F(bit7 On)をライト
0123 CD5701 CALL DELAY
0126 C31201 JP LOOP1
0129 ALLBLINK: ; ここが55Hと一致したとき。
0129 3EFF LD A,0FFH
012B 0100F0 LD BC,LED
012E ED79 OUT (C),A ; LEDにFF(All Off)をライト
0130 CD5701 CALL DELAY ; 後で作る。たぶん1秒ぐらい
0133 3E00 LD A,000H
0135 0100F0 LD BC,LED
0138 ED79 OUT (C),A ; LEDに00(All On)をライト
013A CD5701 CALL DELAY
013D C32901 JP ALLBLINK
428:デフォルトの名無しさん
08/11/09 04:35:13
0140 UNDER: ; ここが0FH以下(=10H未満)のとき
0140 3EFF LD A,255
0142 0100F0 LD BC,LED
0145 ED79 OUT (C),A ; LEDにFF(bit0 Off)をライト
0147 CD5701 CALL DELAY ; 後で作る。たぶん1秒ぐらい
014A 3EFE LD A,0FEH
014C 0100F0 LD BC,LED
014F ED79 OUT (C),A ; LEDにFE(bit0 On)をライト
0151 CD5701 CALL DELAY
0154 C34001 JP UNDER
0157 DELAY: ; clockが書かれてないので、とりあえず俺のやってる3.072MHzで
0157 010800 LD BC,8
015A DELAY0:
015A 210000 LD HL,0
015D DELAY1:
015D 2B DEC HL
015E 7D LD A,L
015F B4 OR H
0160 C25D01 JP NZ,DELAY1 ; 内側のloopが6clock*65536回回る。
0163 0B DEC BC
0164 79 LD A,C
0165 B0 OR B
0166 C25A01 JP NZ,DELAY0 ; 外側のloop8回で1秒ぐらい。
0169 C9 RET
016A END
ここからcopyしてスペースの所をタブに変えれば読めるリストに戻ります。
429:デフォルトの名無しさん
08/11/09 17:35:51
Z80の可能なニーモニックを片っ端から書いてRZ80してみてるんですが、EX AF,AF' って書いて
*** missing quote syntax error ってエラーが出るんですよ。これどう書けばいいんだろ・・・
430:デフォルトの名無しさん
08/11/09 18:11:32
ハンドアセンブルしてDBで書く
431:デフォルトの名無しさん
08/11/09 18:29:54
take it easy
>126 名前: デフォルトの名無しさん [sage] 投稿日: 2008/09/22(月) 15:54:58
>今日のわたしはモード2なのよ
>URLリンク(www.youtube.com)
432:429
08/11/10 04:56:57
EX AF,AF でエラー消えました。メッセージの意味が反対ですよね。
IN r,(C) とか、OUT (C),r って、A以外の諸レジスタもrに(文法上は)書けるのですが、
BやCを使うことはないし、D〜Lだってまず使わないですよね。なんでこんなこと許してるのかな。
433:デフォルトの名無しさん
08/11/10 05:45:58
inrやoutrのため。それと、(c)と言いつつ実はアドレスバスにはbcが乗るので、
I/Oポートアドレス空間を64KiBフルにデコードすることも可能といえば可能。
それを利用したのがSonyのHitBitじゃなかったかな。
434:デフォルトの名無しさん
08/11/11 02:05:41
>>432
’〜で後ろの"'"が無いことになってるんだから別に間違ってなかろう。
EX AF,AF'だけ特別扱いするのはめんどいし。
rでA以外も受け付けるのは、その方が簡単だから。
435:429
08/11/11 05:01:14
>>433 INIRやOTIRのことですね? 連続したポートアドレスから幾つも読み書きするって
実機でそういう構成の奴はやったことないんですよね。どなたかありますか?
>>434 missing〜って、quoteがありませんよ、という文句だと思ってました。あるのに・・・
Z80のほぼ全ての命令を書いてASMリストを取り、コードの頭でsortして>z80.dicに出して、
同様に作った8085.dicと見比べると、面白いですね。8080の命令は実行できるように作られた
そうですが、けっこう違う所がありました。
8085 Z80
コード0F,1F RRC,RAR 無い RRC a、RR a で同機能の拡張命令がある
コード2F CMA 無い
コード30 SIM JR NC,xx
コード3F CMC 無い
コードC0 RNZ 無い
コードC4 CNZ 無い
コードC8 RZ 無い
コードCC CZ 無い
コードCB 無い bit操作命令の開始バイト
コードCF RST 1 無い
コードD0 RNC 無い
コードD4 CNC 無い
コードD8 RC 無い
コードDC CC 無い
コードDD 無い IXレジスタ操作命令の1バイト目
コードDF RST 3 無い
コードE0 RPO 無い
コードE2 JPO 無い
コードE4 CPO 無い
コードE7 RST 4 無い
436:デフォルトの名無しさん
08/11/11 08:49:52
8085にあってz80にないのは二つだけ。RRCはz80拡張命令とではフラグの動きが違う。
437:デフォルトの名無しさん
08/11/11 09:13:56
>>435
普通は「'hoge'」と書かなきゃいかんのに「AF'」て書いたんで、
「'」が閉じてないがなといわれてるんですな。
IN[ID]R/OT[ID]RはCの値変わんないので、同じ所をどかどか読み書きするんですな。
で、OTIRはZ80DMAとかZ80SIOの初期化に使ってた記憶が。
あのへんは無駄に初期設定大変だったからなあ…
なんて事を書いていたらZ80ファミリハンドブック読みたくなってきた。
どこにしまったかのう。
438:デフォルトの名無しさん
08/11/11 10:55:23
私の机の上にあるよ。
439:429
08/11/11 11:03:31
>>436 435で書いた諸々の無い命令は、どんな書式になりますか?
RST 1〜7はoperand errorになりました。return on condition とか call on condition とかも
書式が判りません。 今はコード照合しながら書いてない命令が無いかチェックしてます。
440:デフォルトの名無しさん
08/11/11 11:29:55
z80の命令表なんてぐぐればいくらでも出てくるのに
例えばこことか
URLリンク(tomocyan.net)
441:429
08/11/11 12:54:43
あ〜、これはいいものをありがとうございます。メモメモ・・・
RSTは番号じゃなくてマスクを書くんですね。
442:429
08/11/12 03:23:04
全部の命令コードをアセンブルできました。>>436の2つってどれのことですか?
443:デフォルトの名無しさん
08/11/12 03:31:56
>>442
rim, sim。それらのコードはz80では全く違うインストラクションに割り当てられている。
8085では8080にこのインストラクションを追加した仕様になっている。
面白いところでは、8085にもz80にもドキュメントされていない隠しニモニックが多数ある。
その辺りは、ますます8085とz80の互換性がなくなる結果になっている。
444:429
08/11/12 04:38:39
あ、ホントだ。JRとJR NC ですね。NR80ではrimとsimはDBで書いてました。
割り込みマスクのread/writeなんてごく一部のコードしか使わないから、
アプリ層だったら85のコードをZ80で実行するのはありですね。
でも実際には周辺ICも違うから、なかなかそういう場面はなさそう。
445:デフォルトの名無しさん
08/11/12 21:10:45
現在8085の課題をやっているのですが
他の課題に負われ8085の方の内容がまったくつかめないままここまで来てしまいました
八方塞の状態でまったく出来ません(独自でやっていたのですがとてもでは無いですができそうではないです)
とりあえず形になっていればいいのですが、提出が明日の午前11時が期限になっています
もしよければ協力してくれる方いらっしゃいませんか(当方、かなり必死です…)
課題の内容
8085でデジタル目覚まし時計の作成をせよ
・タイマ割り込みは必須
・設定した時間で音がなる
・複数のスイッチを入力する事で音が止まるようにする
以上の条件を満たす、フローチャートを作成し、プログラムを作成せよ
446:デフォルトの名無しさん
08/11/12 22:02:56
>>445
> 8085でデジタル目覚まし時計の作成をせよ
> ・タイマ割り込みは必須
> ・設定した時間で音がなる
> ・複数のスイッチを入力する事で音が止まるようにする
回路図とかあるんかい?
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
5186日前に更新/148 KB
担当:undef