アセンブラを勉強しようat TECH
アセンブラを勉強しよう - 暇つぶし2ch369:デフォルトの名無しさん
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でデジタル目覚まし時計の作成をせよ
> ・タイマ割り込みは必須
> ・設定した時間で音がなる
> ・複数のスイッチを入力する事で音が止まるようにする
回路図とかあるんかい?


447:デフォルトの名無しさん
08/11/12 22:04:36
>>446
無いです

フローチャートを作成して
それに乗っ取ったプログラミングをすることが課題となっています

448:デフォルトの名無しさん
08/11/12 22:12:02
>>446
うんじゃ、以下の質問に答えれ
o タイマり込みって何をどう叩いて割り込ませるの?
o 音って何をどう叩いて出てくるの?
o スイッチってどこを読めば ON/OFF 判定できるの?


449:445
08/11/12 22:20:05
>>448
ちょっと待っていてください
全部答えられるかわかりませんが
参考になるだろうプログラムがあるのでちょっとアップしてみます

450:445
08/11/12 22:43:22
>>448
パスはsageです
URLリンク(www.uploda.org)
中に説明も書いておきましたのでよろしくお願いします


中にも書いていますが今夜は徹夜でいる予定ですので何時でも質問してくださって大丈夫です

451:デフォルトの名無しさん
08/11/13 02:42:33
さっき起きたが、もう流れてる。とりあえず、手持ちのASMから使えそうなとこ拾ってあげる。
ファイルabs.asm=cのmainに飛ばすための初期化コードから:
  CSEG
  ORG  0000h
  LXI   SP,0A000h ; RAMの末尾番地
  JMP  MAIN    ; cのmainに飛ばすにはc_main_
  ORG  003Ch   ; RST7.5の割り込みベクタの番地
  JMP  TIMER   ; 8253という石をつなぎ、ここに割り込みを入れるよう設定する

452:デフォルトの名無しさん
08/11/13 02:51:00
P53_0 EQU 0F000h ; 8253がMAPされるアドレス空間
P53_1 EQU 0F001h
P53_2 EQU 0F002h
P53_3 EQU 0F003h
MAIN:     ; main loopの開始
/* 8253初期化 */
  P53_3 = 0x36; /* カウンタ0 Bin, mode3, ライトLSB,MSB */
  P53_3 = 0x76; /* カウンタ1 Bin, mode3, ライトLSB,MSB */
  P53_3 = 0xB6; /* カウンタ2 Bin, mode3, ライトLSB,MSB */
/* mode3だと方形波が出るだけなので、カウンタ2はmode0にして割込み
を使う方が正論だが、カウンタ2出力先の8085のRST7.5がエッジトリガ-
なのでmode3(方形波)でうまく行く。CPUによってはmode0を
使わなければならないが、その時は割込み処理でカウンタ2をリロード
しなければならない。 */
  P53_2 = 30720 & 0xFF; /* カウンタ 2 LSB */
  P53_2 = 30720 >> 8; /* カウンタ 2 MSB */
/* 3.072MHz/30720 = 100Hz ( 10mS毎 ) */
RST7.5割り込みを使う理由はコメントを読んでね。このcコードと同じ意味のASMは書ける?

453:455
08/11/13 02:52:13
>>451
ありです



とりあえず再うpしました
URLリンク(www.vipper.org)

454:デフォルトの名無しさん
08/11/13 02:54:42
メインループの概要:
  >>452のように8253を初期化
  時刻メモリを00:00:00に設定
loop:
  SWを読む
  SWの時刻とメモリが一致したら音を鳴らす/または止める
  loopへJMP

455:455
08/11/13 02:58:44
>>452
>このcコードと同じ意味のASMは書ける?
ちょっと辛いと思います・・・orz

456:455
08/11/13 03:00:27
>>454
ああ、非常にわかりやすいです
ありがとうございます

457:デフォルトの名無しさん
08/11/13 03:04:23
ざっと読んだ。ORGのアドレスとかは>>453の環境のように直せるよね?
CSEGは、リンカで再配置するための命令で、ASEGはASMが吐いたオブジェクトをそのまま
実行アドレスにするためなのは理解してる?
今回は音は単なる断続音でいいと思うから、MUSICのテーブルMUSIC:の所を、
音・休符のくり返しにしておけばいい。

458:デフォルトの名無しさん
08/11/13 03:10:21
>>455 しょ~がねーなあ・・・
  P53_3 = 0x36; /* カウンタ0 Bin, mode3, ライトLSB,MSB */
  MVI A,036h
  STA P53_3
  P53_3 = 0x76; /* カウンタ1 Bin, mode3, ライトLSB,MSB */
  MVI A,076h
  STA P53_3
  P53_3 = 0xB6; /* カウンタ2 Bin, mode3, ライトLSB,MSB */
  MVI A,0B6h
  STA P53_3
  P53_2 = 30720 & 0xFF; /* カウンタ 2 LSB */
  MVI A,0FFh
  STA P53_2
  P53_2 = 30720 >> 8; /* カウンタ 2 MSB */
  MVI A,30720/256
  STA P53_2

459:デフォルトの名無しさん
08/11/13 03:17:02
>>457
>ORGのアドレスとかは>>453の環境のように直せるよね?
試行錯誤してみますが即時にはちょっと辛いかもしれません



>>458
あまりの優しさに。・゚・(ノД`)・゚・。

460:デフォルトの名無しさん
08/11/13 03:18:35
cのコメントを; にしてASMに振ってね。 なかなか本題に入れないな(w
TIMER:  ; 8253をつないで上のように初期化すると、10mSごとに割り込みが発生し、ここにジャンプしてくる
; 8253は___|~~~|___|~~~|___|~~~・・・という信号を出し、これの立ち下がりエッジを8085は割り込みと認識する訳。
  PUSH  H
  PUSH  D
  PUSH  B
  PUSH  PSW
(割り込み処理本体)
  POP  PSW
  POP  B
  POP  D
  POP  H  ; メインで使っているレジスタをこういうpush/popで保護する。順序は判るよね?
  EI      ; 割り込んだときいったんDI状態になるのでそれを回復(また割り込み可能に)
  RET    ; 割り込んだ次の番地(メインのどこか)に復帰
こういうのが割り込み処理プログラミングの基本的なお作法です。

461:445
08/11/13 03:22:32
>>460
了解しました

462:デフォルトの名無しさん
08/11/13 03:23:48
俺の環境は、プログラムのコード(実行命令部)はROMの0番地から、RAMは0A000番地~
数㌔バイト、という物なのでORG 0000hになってるわけ。>>455の環境はASMの吐いたコードを
RAMにロードして実行させる環境なのではないかと思う。ORG 8000hとか書かれてるから。

463:445
08/11/13 03:28:02
>>462
>RAMにロードして実行させる環境なのではないかと思う
はい、その通りです

464:デフォルトの名無しさん
08/11/13 03:32:33
割り込み処理本体:
TIMER1: DS 1  ; soft couter 1 100回をカウントし、1秒を作る
SEC:   DS 1 ; 秒カウンタ
MIN:   DS 1 ; 分カウンタ
HOUR:  DS ; 時カウンタ
変数としては最低限、この位は必要だね。

CSEGは上でも書いたけどROMにロードさせるためのアセンブラ命令なので、
>>455はASEGで書き始めればいい。

465:445
08/11/13 03:42:01
>>464
了解です

466:デフォルトの名無しさん
08/11/13 03:51:44
割り込み処理本体の実行部:
  TIMER1を減算、0になったらまた100を入れる。(MAINの初期化時に100にしておくべき)
  0になったときが「1秒ごと」だから、その時に
   秒を加算、59を越えたら、0に戻し、
    分を加算、59を越えたら、0に戻し、
     時を加算、23を越えたら、0に戻す(日付までやるとえらいことになるぞ。)
   時分秒を(表示器があれば)表示器に表示。
    (これは割り込み中にやらずに、メインループに対しフラグで通知して、メインループで
     表示してもらう手法が一般的だ。こういう情報(割り込みからメインループに伝える情報)
     が「イベント」という概念で教えられているものだ。
     時刻そのものではなく、「表示が必要だよ」という情報ね。
     割り込み処理では時刻を変更する、メインではそれを読みとるのみで変更はしない。)
   音が鳴っている状態であれば、音用のポートのON/OFFを切り換える
    (これで、警報音の断続が制御できる)

段付け毎にcのif文=ASMならCPI 、JCかJZかJNZで分岐が必要なのは判るよね。
時分秒は00:00:00~23:59:59だから、SW入力は8bitのDIPSWか何かが3器つながる必要がある。
その辺は455の環境に合わせてI/Oの番地を書いてね。
プログラムの基本構成はこれで伝わったとおもう。全部書いてあげるのじゃカンニングみたいだし、
そろそろ朝飯食って出勤なので、ここまでにしたい。

467:デフォルトの名無しさん
08/11/13 03:55:49
思い出した。毎年今頃に8085の質問投げてくるkitの学生か?

468:445
08/11/13 03:56:42
>>466
お疲れ様でした
大変、助かりました

これを元に頑張ってみます

本当にありがとうございました

469:445
08/11/13 03:58:14
>>467
kitは大当たりですw
前例いたんですねw

470:デフォルトの名無しさん
08/11/13 12:19:35
工芸繊維大!?

471:デフォルトの名無しさん
08/11/15 02:56:22
どこだ?九州工業大学か?

472:467
08/11/15 04:20:18
上の方で誰かがkitって書いてたんだが、俺もkitが何なのか知りたいな。

473:467
08/11/15 04:34:12
あ(*o*) Kyuusyuu Institute of Technology か

474:デフォルトの名無しさん
08/11/15 09:45:04
金馬鹿工業大学

475:デフォルトの名無しさん
08/11/15 11:30:34
Knight Industries Two Thousand

476:デフォルトの名無しさん
08/11/18 18:55:09
お邪魔します。基本情報処理試験(午後 アセンブラ)の問題集を解いているのですが
解らない問題で行き詰りました。
こちらで教えて頂ますでしょうか?
スレ違いでしたら申し訳ございません。(CASLⅡ 福嶋宏訓 著)

477:467
08/11/19 17:54:40
スレチじゃないけど、俺は85得意だがCASL音痴なんでお役に立てない(m_ _m)

478:デフォルトの名無しさん
08/11/23 06:50:58
教えてください。
MASMを使用したいのですが、現在PCにインストールされている
Visual C++ 2008 Expressには、付属していないようですので
URLリンク(www.microsoft.com)
このMASMをDLしてインストールしようとしました。
しかし、インストールしようとすると「Visual C++ 2005 Express Edition required」
というメッセージが出てインストールできません。
どうすればMASMを使えるようになるのでしょうか。

479:デフォルトの名無しさん
08/11/23 07:18:25
ダウンロードしたzipを強制解凍してくと~~ml_exe~~というファイルが出てくる。
これがml.exe本体だから適宜リネーム。

480:478
08/11/23 07:23:50
ありがとうございます。
しかし、なぜこんな面倒なことせにゃならんのでしょうかね。
MSはアホなのでしょうか。

481:デフォルトの名無しさん
08/11/23 08:18:26
つーか、VC++2008EEならそんな面倒なコトしなくてもSP1あてれば ml ver9が勝手に入んないか?

482:478
08/11/23 08:51:08
with SP1なるものが出ていたんですね。今から入れ直します。どうもです。

483:デフォルトの名無しさん
08/11/23 18:04:37
c言語のscanfと同じようなことをアセンブラで実行したいんですけど
どういうプログラムを書いたらいいか分かりません
どなたかヒントください

484:デフォルトの名無しさん
08/11/23 18:49:42
Cのscanfをアセンブラから呼べばいい。

485:デフォルトの名無しさん
08/11/23 18:50:15
>>483
地道に解析するしかない。

486:デフォルトの名無しさん
08/11/23 23:04:55
アセンブラって、書くのは労力いりそうですが、習得するのは簡単
ですよね?C言語とかよりも。

487:デフォルトの名無しさん
08/11/23 23:07:18
プロセッサによる。IA64のアセンブラは死ぬるぞよ。

488:デフォルトの名無しさん
08/11/23 23:07:51
x86は?

489:デフォルトの名無しさん
08/11/24 04:54:02
>>483 「可変個の引数リスト」 を扱うってとこがミソかな。
引数リストの場所を覚えておくポインタを設ければいい。cではそのような書き方をしてるはず。

490:デフォルトの名無しさん
08/11/24 10:17:20
インラインアセンブラを使う場合に
_asm{}と__asm{}と2種類を見かけたのですが、どう違うのでしょうか。

491:デフォルトの名無しさん
08/11/24 13:47:53
>>488
IA64よりは簡単。VLIWのアセンブラは人間が書くものじゃねえ。
まあ32bitでRing3だけなら簡単な方じゃないかと思う。

>>490
書き方。


492:デフォルトの名無しさん
08/11/24 20:41:41
IA-64はバンドルに無理やり詰め込まなければ難しくない。

493:デフォルトの名無しさん
08/11/24 21:51:34
IA-64というかItaniumって、けっきょく商業的には失敗作なんでしょ?
消えゆく運命か?

494:デフォルトの名無しさん
08/11/25 00:09:38
HPC用途でもうしばらくは・・・

まあ、そもそもアセンブラでガリガリ書くようなプロセッサじゃないし

495:デフォルトの名無しさん
08/11/25 08:32:10
とりあえず漠然とアセンブリを学習する場合は、16ビットプログラミングが
初心者にはいいの?
32ビットでも変わらない?

496:デフォルトの名無しさん
08/11/25 09:30:17
実行環境を確保できるものにしとけ。


497:デフォルトの名無しさん
08/11/25 22:24:25
MS-DOS はアセンブリ言語勉強するのにいい環境だったな・・・。
割り込みとか簡単にできたし。

498:デフォルトの名無しさん
08/11/26 17:36:49
16ビットっていうと今では無用なセグメント方式とか思い出すな

499:デフォルトの名無しさん
08/11/26 18:26:22
Linuxとかだとアドレッシングにセグメント機能通してるし、方式自体は生きてるけどなあ・・
でもいつまで残るんだろね。
Intelがそれを望む限り続くんだろうけどさ。


500:デフォルトの名無しさん
08/11/26 19:17:20
Linuxってどこでセグメントレジスタ活用しているの?
4GBフラットアドレスに設定しているだけだと思うのだが。

501:デフォルトの名無しさん
08/11/26 19:19:41
>>500
>4GBフラットアドレスに設定しているだけだと思うのだが。

え?そこで使ってるじゃんセグメントレジスタ。

502:デフォルトの名無しさん
08/11/26 19:20:30
だったらWindowsもそだね

503:デフォルトの名無しさん
08/11/26 19:22:09
Win2Kまで使えたOS/2 1.x 互換モードが何気に変態ぽくて好きだったな。

504:デフォルトの名無しさん
08/11/26 19:25:05
フラットに使うだけだと「活用」してるとは言えないな。
32ビットCPUでメモリ空間を拡張するカーネルオプションとか
あったような気もするけど...

505:デフォルトの名無しさん
08/11/26 19:35:37
>>501
それいったら、どうやってセグメントレジスタ抜きでx86を使うの。
64ビットモードならセグメントレジスタ無視が基本だから、使っていないと言えるだろうけど。

そういえば、x86-64はAMD発だから、
Intelはセグメントレジスタ潰したいのだろうと言う根拠に使うのは苦しいな。

506:デフォルトの名無しさん
08/11/26 19:56:47
x86版のWindowsは構造化例外処理にセグメントを思いっきり使っているが

507:デフォルトの名無しさん
08/11/26 20:00:52
いつの間にか追加され忘れ去られてしまったFSとGSのこと、時々でいいから思い出してください。

508:デフォルトの名無しさん
08/11/26 20:32:34
FSは例外で使われてるね

509:デフォルトの名無しさん
08/11/26 22:02:34
FSとGSはほんとに気が付いたらあった感じだね
386以降だっけか

510:デフォルトの名無しさん
08/11/26 22:18:21
Windowsのカーネルで使用するKPCR構造体はx86ではFS、x64ではGSを使ってアクセスしているよ。


511:デフォルトの名無しさん
08/11/26 23:02:29
GSって自由に使ってもいいの?

512:デフォルトの名無しさん
08/11/26 23:15:13
何をしたいのか環境によるっしょ

513:デフォルトの名無しさん
08/11/27 01:51:03
486から後のセグメントの意味と、386から前のセグメントの意味を混同している奴は恥ずかしいぞ。

514:デフォルトの名無しさん
08/11/27 02:11:51
すまん386と486の間のセグメントの違いはわからん。
リアルモードとプロテクトモードの違いのことじゃないよね?

515:デフォルトの名無しさん
08/11/27 02:34:49
それって、386以降のプロテクトモードでのメモリー空間マッピング機能とか領域保護機能のためのレジスタになったってやつ?

516:デフォルトの名無しさん
08/11/27 05:48:17
513は恥ずかしい奴。

517:デフォルトの名無しさん
08/11/27 11:02:24
513は386と286と言いたかったのだと思われ。

リアルモードとプロテクトモードと言い換えてもいいか。

518:デフォルトの名無しさん
08/11/27 11:15:39
286にも16bitプロテクトモードなんていうものがあって、186と286の間ではないかと。


519:デフォルトの名無しさん
08/11/27 11:24:28
GS, FSセグメントレジスタの使用、アドレッシングを目的を除く32Bitレジスタの使用は、
386以降ならリアルモードでも仮想86でも可能。
もちろんこのモードでのセグメントレジスタは伝統的な4ビットシフト型となる。


520:デフォルトの名無しさん
08/11/27 12:01:43
リアルモードに戻った直後のセグメントレジスタ更新前なら
プロテクトモード時に設定されたアドレスにアクセス可能

521:デフォルトの名無しさん
08/11/27 12:51:31
4Gリアルモードとか呼ばれてる奴ですな

522:デフォルトの名無しさん
08/11/27 14:18:52
いい加減、モード大杉

523:デフォルトの名無しさん
08/11/27 15:54:15
今でもSSとCSを別にしているOSがあると聞いたことがある。セキュリティ上の理由で。
詳細は知らんが。



524:デフォルトの名無しさん
08/11/27 21:10:15
Windowsがアプリケーションのメモリ空間の拡張にAWEなんてやっていたけど、
そんなことするくらいならセレクタ復活させたらいいのにと思っていた。

525:デフォルトの名無しさん
08/11/27 21:52:51
>>523
Windowsのカーネルモード時のセグメントセレクタの基本値
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000

CS!=SSですね。

>>524
それじゃAWEのかわりにならんだろ。

526:デフォルトの名無しさん
08/11/27 22:03:31
>>525
セレクタが違ってもディスクプリタが同じ領域をポイントしてる可能性もあるのでは。

527:デフォルトの名無しさん
08/11/27 22:41:20
>>523
Linuxとかそこらへん向けにそういう実装があったな、名前忘れたが。
4G全域でなく、必要な部分だけにきっちりセグメント範囲を限定することで
想定外のアクセスでフォルト起こすようにするんだったか。

528:デフォルトの名無しさん
08/11/28 01:36:24
>>522
だって互換性が・・・。

529:デフォルトの名無しさん
08/11/28 03:06:03
互換を言うならx64のロングモードに仮想86を復活汁

530: ◆0uxK91AxII
08/11/28 05:02:04
>>525
>>526
手元にあるW2kのkernelModeだと、同じ場所を示していた。

CS:0008 SS:0010 DS:0023 ES:0023 FS:0030 GS:0000
GDT base:80036000 limit:03ff
0: 00 00 00 00 00 00 00 00
1: 00 cf 9b 00 00 00 ff ff
2: 00 cf 93 00 00 00 ff ff
3: 00 cf fb 00 00 00 ff ff
4: 00 cf f3 00 00 00 ff ff
5: 80 00 8b 2c 10 00 20 ab
6: ff c0 93 df f0 00 00 01

どうでも良い事だけどね。

531:デフォルトの名無しさん
08/11/28 09:50:53
アセンブリの入門書を2冊持っているのですが、どちらも実数定数に
ついては、簡略・割愛しているのですが、実数定数は初心者には
複雑なのでしょうか?
実数の計算できないとお話にならない気もしますが…

532:デフォルトの名無しさん
08/11/28 10:01:44
複雑です
浮動小数点が必要な場面でアセンブラを使うような人なら
そのあたりの情報はだいたい見つけられます

533:デフォルトの名無しさん
08/11/28 10:50:32
>>531
何のアセンブラかにも拠るからねぇ。定数ロードのインストラクションを持つチップもあることだし、大した話じゃないけどね。

>>532
それは、フォーマットが複雑だといっているのか?

534:デフォルトの名無しさん
08/11/28 11:15:53
>>533
入門書を読んでる人にとっちゃ、いろんな意味で複雑でしょ
一通り分かった人ならともかく

535:デフォルトの名無しさん
08/11/28 12:36:20
アセンブラ使いが実数?
何を頓珍漢な事言ってるんだ??

実数演算が必要な所では計算式も煩雑だろうに
素直に高級言語使ってろって話だと思うがな。

536:デフォルトの名無しさん
08/11/28 12:40:33
例えばこんなコードなら複雑でもなんでもないじゃん。
# 実在するかは兎も角
invPi: ld rf0, #1.0
 ldpi rf1
 div rf0, rf1
 ret

>>535
そうは言うがな大佐、読める能力はあるに越したことはないと思うぞ。

537: ◆0uxK91AxII
08/11/28 13:55:39
例えば、100.0を掛ける場合、この値をどう書くかとか、そういう辺りだろうね。

538:デフォルトの名無しさん
08/11/28 14:52:44
アセンブラが実数をサポートしていないなら諦める。

539:デフォルトの名無しさん
08/11/28 14:54:24
CPUやアセンブラを限定しないと答えようが無いうえ、定数が何を指してるかもあいまいかな。
1.実数計算機能が無いCPU
2.実数計算機能があり、直値のロードができないCPU
3.実数計算機能があり、直値のロードが可能なCPU
と分けるとx86系は2になるので、x86で定数は静的なデータとして定義する必要がある。
 .DATA
hoge  REAL8  10.12345
 .CODE
  FLD  hoge
  FLDPI ; 円周率の定数ロードは専用命令があったりする。

540:デフォルトの名無しさん
08/11/28 19:44:11
x86 の実数計算は、浮動小数点レジスタの扱いがすげー面倒なので覚えてないわ・・・。
SSEx 使った方が楽なんじゃないか。

541:デフォルトの名無しさん
08/11/28 23:39:33
>>539
ボクの486SXマシンじゃ実行出来ません ><

542:デフォルトの名無しさん
08/11/29 00:34:00
>>541
Win9xやNTのWin32アプリならx87のエミュレーションやってくれる。

>>540
XMMをスカラで使うと何か損した気分になる。

543:デフォルトの名無しさん
08/11/29 11:03:27
MS-DOSでアセンブラするには16ビット版リンカってのが必ずいるの?

544:デフォルトの名無しさん
08/11/29 11:17:51
いるよ~。
アセンブラはVS2008についてくるWin32用のでいけるけどね。

545:デフォルトの名無しさん
08/11/29 11:50:46
どうもです。
lnk563.exeなるものを調達してきて、その中からlink.exeを取り出しました。
試しに実行ファイルを作ってみようと、ml ver9とそのlink.exeをasmファイルの
あるディレクトリにぶちこんで
ml /omf ???.asm
と打ち込んだら、アセンブルは完了したのにリンカが自動呼び出しさせません。
なぜでしょうか。

546:デフォルトの名無しさん
08/11/29 12:24:51
>>545
>リンカが自動呼び出しさせません
って、実行のことか?

547:デフォルトの名無しさん
08/11/29 12:40:35
32bit用と16bit用でLinkの引数の書式が違うから、呼び出す前に互換があるか確認してるのかも。

548:デフォルトの名無しさん
08/11/29 13:03:56
/omf オプション自体が /cと同じでlinkerの呼び出しを行わなくする作用がある。

549:545
08/11/29 13:10:02
確かに、32ビットリンカだと、mlコマンド打てば自動で呼び出されますね。
ただし、OMF形式でなくて、COFF形式でオブジェクトファイルを作成する
必要がありますが…。
16ビットの場合はOMF形式じゃないとだめらしいのですが、それで作っても
リンカは呼び出されません。自前で全部引数入れなきゃだめですかね。


550:デフォルトの名無しさん
08/11/29 18:37:46
ダメです。ちゃんとmakefileを作るか諦めてバッチでどうぞ。

551:545
08/11/30 00:52:02
そうですか、どうもです。

552:デフォルトの名無しさん
08/12/02 12:10:42
突然ですが、レガシーなDMAコントローラを使う場合、
CPUのキャッシュとDMAによる物理メモリへの書き込みとを同期させる
には、far jmp 命令を実行すれば良かったんでしょうか?

553:デフォルトの名無しさん
08/12/02 14:56:45
x86でのDMA転送は、I/O Agent が勝手にsnoopして、物理メモリとキャッシュ
と同期する、という噂がありますが、正式な資料がどこかにありませんかね。

IA-32 Intel Architecture Software Developer's Manualの
Volume 3「System Programming Guide」 の 9.3.2節の以下の
部分に何となく書かれていますが、「できる(can performe)」ことと
「実際にそうなっている」事とは別ですから。

9.3.2. Choosing a Memory Type
The simplest system memory model does not use memory-mapped I/O with read or write side
effects, does not include a frame buffer, and uses the write-back memory type for all memory.
An I/O agent can perform direct memory access (DMA) to write-back memory and the cache
protocol maintains cache coherency.

554:a
08/12/02 15:06:54
age

555:デフォルトの名無しさん
08/12/03 00:04:07
>>553
ハードの実装次第

556:デフォルトの名無しさん
08/12/03 00:59:39
>>552
far jmpはパイプラインが捨てられるだけだ。
キャッシュきれいにしたけりゃwbinvdあたり使わねば。




557:デフォルトの名無しさん
08/12/03 01:47:07
>>556
自己書き換えコードの直後に jmp するというのはキャッシュ・クリア
ではなくパイプライン・クリアでしたっけ?

言われてみれば、データ用のキャッシュは、CPU自身の書き換えでは
整合するに決まってますね。

558:デフォルトの名無しさん
08/12/03 01:53:55
>>555
PCIは、あるデバイスがマスターになって、メモリに転送する機能が
定められている。Legacy DMAは、ISAバスに繋がっているが、ISAバスは
ISA-PCIブリッジによってPCIバスに繋がっている。

Legacy DMA転送は、PCIのこの転送機能を利用しているのだろうか?

559:デフォルトの名無しさん
08/12/04 02:16:42
>>558
そりゃブリッジがバスマスタになってごにょごにょしなけりゃ、
DMAにならんだろう。


560:デフォルトの名無しさん
08/12/04 07:53:34
>>559
PCIバスマスタ転送は、自動的にチップセットによってsnoopされ、
CPU内部のキャッシュと同期が取られるはずなので、
Legacy DMA 転送も、CPUの内部キャッシュと勝手に同期される
ということで正しいのだろうか。

561:デフォルトの名無しさん
08/12/04 09:34:17
されなきゃ8237直に叩くような行儀の悪いコードが
動かなくなってしまうのではないかと。

ISAのバスマスタなんてとんでもないモノは無理だと思うが。


562:デフォルトの名無しさん
08/12/04 10:03:45
>>561
てっきり、仮想8086モードでjmp far ptrを行うと、キャッシュや
パイプラインなどが実メモリと同期される性質(未確認)を使っているの
かと思ってますた。

チップセット内蔵の8237同等パーツは、今でも実メモリに直に繋がっている
ようにエミュレートされているのかと思ってましたが、そうではないの
かも知れませんね。

今は、絶対に、PCIのバスマスタ転送を利用していて、勝手にsnoopされて
いるんだという明確な証拠が欲しいですが。

563:デフォルトの名無しさん
08/12/04 22:02:23
少なくとも論理的にはPCIデバイスの先につながっているようになっている。
ちなみにキャッシュは気にする必要がない。そうでなければ既存のOSが動かなくなる。

564:デフォルトの名無しさん
08/12/09 06:21:42
>>563
便乗質問ですが、この場合CPUからの書き込みも何も気にする必要がないんでしょうか?
それともドライバーで何かの処理(DMAの領域はキャッシュ不可(ライトスルー)にする
等)が必要でしょうか?

ちなみにむかーし自分がm68kの乗ったマシンのドライバを書いた時はその手の処理を
したように記憶しています。今どき(?)のx86 & PCIのドライバに関してこの辺の知識を
得たいと思ったら何かお勧めの書籍等ありますかね?

565:デフォルトの名無しさん
08/12/10 14:18:11
ちょっと質問しまつ

使うアセンブラはyasm

汎用32ビットレジスタは eax,ebx,ecx,edx とかあるけど
汎用64ビットレジスタって rax,rbx,rcx.. .とか先頭にrを付けるのでいいのかな

566:デフォルトの名無しさん
08/12/10 14:43:38
ドキュメント読まないYUTORIか

567:デフォルトの名無しさん
08/12/10 20:59:37
>>566
読まないんじゃなくて読めない
ゆとりです

568:565・567
08/12/10 21:48:48
自己解決しますた
nasmのドキュメソトにレジスタ名載ってますた

>>566


569:デフォルトの名無しさん
08/12/11 03:34:33
ARMなんですが,実行ファイル(ELF)を無理矢理で良いので
アセンブラの段階まで書き下してくれるようなソフトってすでにあったりしませんか?

FF DE FF E7 FF DE ・・・・・・

bx lr

なんていうかこんな感じで

570:デフォルトの名無しさん
08/12/11 03:50:02
>>569
あったな、あった。
昔はそんなの沢山あったな。

まあ、難しいもんでもないから自分で作ってみたら?

データとプログラムの区別とか、ジャンプテーブルの解釈がミソだぜ。

571:デフォルトの名無しさん
08/12/11 03:50:36
objdump -D

572:デフォルトの名無しさん
08/12/19 16:44:55
win32+VC++で、逆アセした関数をC++に組み込むのに安全で手っ取り早い方法を教えてケロ

573:デフォルトの名無しさん
08/12/19 17:02:33
MASMで書いてリンクじゃ駄目なの?

574:デフォルトの名無しさん
08/12/19 19:32:32
>>572
違法行為やめろ

575: ◆0uxK91AxII
08/12/19 19:48:25
途中でdisassembleしている辺りが、被効率的杉で、ハナシにならない。

576:デフォルトの名無しさん
08/12/19 20:28:38
>>574
なにがどう違法行為なんだかw

もうすぐ合法になって、契約による縛りも無意味になるご時世だというのに。

577: ◆0uxK91AxII
08/12/19 20:40:06
被 -> 非

VirtualAllocで確保して、書き込んで、呼べばokな気がするする。

578:デフォルトの名無しさん
08/12/20 01:18:10
それだと使いたい所が空いてなかったら困らんかい?

適当にもらってから頑張って再配置とか。


579:デフォルトの名無しさん
08/12/20 10:52:50
>>577
それじゃ命令内のアドレスが無茶苦茶だろ。

580: ◆0uxK91AxII
08/12/20 10:58:24
(゚Д゚)ハァ?
バカは死ね。

581:デフォルトの名無しさん
08/12/20 11:00:48
絶対ジャンプや静的変数の扱いをどうすんの。

582: ◆0uxK91AxII
08/12/20 11:04:14
関数に、そんなモノは無い。

583:デフォルトの名無しさん
08/12/20 11:05:50
゚o゚

584: ◆0uxK91AxII
08/12/20 11:14:57
572が想定している関数に、そんなモノは無い。
...と書くべきだったか。

585:デフォルトの名無しさん
08/12/20 11:22:07
もちろん無いなら問題ないんだが、
どうして何の情報も出してない572の想定が分かるのだろうか。

586: ◆0uxK91AxII
08/12/20 11:25:37
『手っ取り早い』という条件があるからね。
とにかく、バカは死ね。

587:デフォルトの名無しさん
08/12/20 13:22:16
・・・これはひどい。

588:デフォルトの名無しさん
08/12/21 11:56:49
取り敢えず、>572が諦めれば済むな。

589:デフォルトの名無しさん
08/12/21 20:09:21
アセンブラを安全に使うなんて、無理だろ。つうか使う意味が無い。
危険だけど好きな事が出来るのがアセンブラの醍醐味なんだからな。

590:デフォルトの名無しさん
08/12/22 08:24:12
危険つっても攻殻機動隊の世界みたく脳が焼かれるわけじゃなし

591:デフォルトの名無しさん
08/12/22 14:03:18
無茶すりゃOSに怒られるしなあ…


592:デフォルトの名無しさん
08/12/22 15:45:23
MS-DOS の時代に比べれば、みんな安全なプログラムだよなぁ。

593:デフォルトの名無しさん
08/12/23 10:31:13
そうだねえ。
ハード叩きまくりだったからなあ。

再起不能になって修理するハメになったり…


594:デフォルトの名無しさん
08/12/28 00:52:29
32ビットは対象外かな?

595:デフォルトの名無しさん
08/12/28 01:00:40
いくらでもOK

596:デフォルトの名無しさん
08/12/28 08:44:52
アセンブラ勉強ならmasm使うべき

597:デフォルトの名無しさん
08/12/29 01:21:28
x86が基本ってことはないと思うが・・。

598:デフォルトの名無しさん
08/12/29 07:11:30
目の前にあるじゃない

599:デフォルトの名無しさん
08/12/29 09:01:18
基本中の基本ということなら68000かな。

600:,,・´∀`・,,)っ-●◎○
08/12/29 09:11:44
そこはMMIXwareだろう



最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch