Message Log 41 Return to Parent Menu 
Last Updated by 07/01/05(Fri)  

 
Tips
 

 ログ整理の自動化できたらいいなっ!?


 
Message log list
 

 アセンブラ掲示板に書き込まれた過去のログです。


Message log 44 (05/01/0506/30/05)
Message log 43 (01/01/0504/30/05)
Message log 42 (01/01/0412/31/04)
Message log 41 (11/01/0312/31/03)
Message log 40 (10/01/0310/31/03)
Message log 39 (04/01/0309/30/03)
Message log 38 (12/01/0203/31/03)
Message log 37 (08/01/0211/30/02)
Message log 36 (05/01/0207/31/02)
Message log 35 (03/01/0204/30/02)
Message log 34 (01/01/0202/28/02)
Message log 33 (09/15/0112/31/01)
Message log 32 (08/01/0109/14/01)
Message log 31 (05/26/0107/31/01)
Message log 30 (05/15/0105/25/01)
Message log 29 (05/01/0105/14/01)
Message log 28 (02/01/0104/30/01)
Message log 27 (01/01/0101/31/01)
Message log 26 (10/01/0012/31/00)
Message log 25 (07/21/0009/30/00)
Message log 24 (06/16/0007/20/00)
Message log 23 (05/20/0006/15/00)
Message log 22 (05/01/0005/19/00)
Message log 21 (04/01/0004/30/00)
Message log 20 (02/01/0003/31/00)
Message log 19 (01/01/0001/31/00)
Message log 18 (11/01/9912/31/99)
Message log 17 (09/05/9910/31/99)
Message log 16 (08/21/9909/04/99)
Message log 15 (07/01/9908/20/99)
Message log 14 (04/01/9906/30/99)
Message log 13 (02/01/9903/31/99)
Message log 12 (11/01/9801/31/99)
Message log 11 (09/21/9810/31/98)
Message log 10 (08/01/9809/20/98)
Message log 09 (07/01/9807/31/98)
Message log 08 (05/04/9806/30/98)
Message log 07 (04/08/9805/03/98)
Message log 06 (02/23/9804/07/98)
Message log 05 (01/01/9802/22/98)
Message log 04 (11/09/9712/31/97)
Message log 03 (10/17/9711/08/97)
Message log 02 (08/22/9710/16/97)
Message log 01 (06/20/9708/21/97)


 
Message log 11/01/0312/31/03
 




poen  [2003/12/25 Thu 23:13:15]  [220.145.120.117]

>しろさん
分かりやすい説明を有り難うございました。
納得できましたー。

これからは英語もアセンブラの勉強と平行させようと思います(w
しろ  [2003/12/21 Sun 07:48:46]  [221.184.84.108]

『階乗』ではなく『べき(または累乗)』ですね。まちがえました。
しろ  [2003/12/21 Sun 07:42:33]  [221.184.84.108]

> poenさん
> この(=segment _DATA align=4)場合、16の倍数アドレスを...

いいえ、align=X は、Xの倍数を
そのオブジェクトファイル内のそのセクションの開始アドレスとするようにリンカ
に要求するものです。ただしXには2の階乗のごく一部の値しか指定できません(OMF
(いわゆる.obj形式)の場合) NASM Manual §6.2.1はこの制限を考慮して書かれた
ものでしょう。

http://nasm.sourceforge.net/doc/html/nasmdoc6.html#section-6.2.1

align=4 なら4の倍数という事になります。

ちなみにMASM互換アセンブラで指定できるalignment属性は byte, word, dword,
para, page の5種で、それぞれ align=1, 2, 4, 16, 256 に相当します。
かよ  [2003/12/19 Fri 09:21:42]  [202.33.240.232]

Yasさん、レスありがとうございます。
Yasさんの方法でうまく動作しました。
本当に、ありがとうございますm(_ _)m!

MSCの場合、セグメントを意識したコーディングが必要なんですね。
とても勉強になりました。

<ご参考>
MSCのほうを調べてみた結果、
FP_SEGというマクロを使ってセグメント指定が
できることもわかりました。(dos.hをインクルード)

poen  [2003/12/17 Wed 03:19:10]  [220.145.120.117]

>しろさん
こんにちは。
早速のご返答、有り難うございます。

お教え頂いた通りにやってみたところ、見事にリンクできました。
classオプションでセグメントクラスをリンカに指定しなくてはいけないのですね。
勉強になりましたー。有り難うございました。

ところで align=4 という部分なのですが、本家のFAQによると
「alignはセグメントの最初のアドレスの下位何ビットが0になるかを決める」
らしいので、この(=segment _DATA align=4)場合、16の倍数アドレスを、
データセグメントの(セグメント)ベースにするという意味で宜しいのでしょうか…?

しろ  [2003/12/14 Sun 23:23:59]  [221.188.23.20]

> poenさん、こんにちは。

(手元の ilink32 5.00 では segment _data USE32 だけでも問題なくリンクできて
しまうのですが...)
nasm はほとんど使っていないので勝手がちょっとわかりませんが、bcc32 を -S
オプションで起動したときにできる .asm ファイルから見て

segment _TEXT align=4 public use32 class=CODE flat
segment _DATA align=4 public use32 class=DATA flat

あたりになると思います。
(GROUPまわりはフラットメモリモデルならあまり気にしなくともよいはずですが、
調べ切れませんでした)

以下はbcc32 の出力の一部
model flat
_TEXT segment dword public use32 'CODE'
_TEXT ends
_DATA segment dword public use32 'DATA'
_DATA ends
_BSS segment dword public use32 'BSS'
_BSS ends
DGROUP group _BSS,_DATA
Yas  [2003/12/14 Sun 09:57:47]  [133.24.88.90]

はじめまして、こんにちは


>再びアセンブラさん

Mersenne Twisterという方法があります。
http://www.math.keio.ac.jp/~matumoto/mt.html
ただしFAQにあるとおり、そのままでは暗号用の乱数として適切ではありません。
暗号用の乱数として使いたい場合はgenrand()を実行した後の配列mt[0]の下位31bits以外
(mt[1...623]の全bitsとmt[0]のbit31)をSHA(Secure Hash Algorithm)にかけたものを用いるとよいようです。


>かよさん

プロテクトモードでのes(というか、セグメントレジスタ)はセレクタ値というものを指すものであって
論理/物理アドレスを直接指すものではありません。
本筋から逸れる詳細は割愛しますが、かよさんが求めているものとは違うものになります。

本題に入ります。

(USHORT _far*)の部分でデータポインタをfar指定していますが、farポインタは32bitで表現され、
上位16bitがセグメントレジスタへ、下位16bitがオフセットレジスタへ格納されます。

つまり、0x12345に0xaaaaを書き込みたいときには
*((USHORT _far*)(0x12345)) = (USHORT)0xaaaa;
ではなく、
*((USHORT _far*)(0x10002345)) = (USHORT)0xaaaa;
としなくてはなりません。

このときセグメントレジスタは0x1000、オフセットレジスタは0x2345になります。
なぜこのような面倒くさいことをしなくてはならないかというと、ある特定のアドレスを指す
セグメントレジスタとオフセットレジスタの組は無数に存在するため、人間が明示的に
セグメントとオフセットを特定しないとにコンパイラが勝手にこれらを割り振ることになるためだと思われます。

poen  [2003/12/14 Sun 01:18:02]  [220.145.120.117]

こんにちは。
これからさせて頂く質問があまりに低レベル過ぎる気がしまして、
お恥ずかしい限りですが、宜しければどなたかお教え願えませんでしょうか?

Borland C++ 5.5 と nasm で次のようなコードを組んでみました。

--------(main.c)----------------------------------------
#include <stdio.h>

extern void bit_swap(void);
extern char *print_str;

int main(void)
{
bit_swap();
return 0;
}
---------(bswap.asm)---------------------------------------

extern _printf
global _bit_swap,_print_str

segment _code USE32

_bit_swap:
push ebp
mov ebp,esp
push eax
push edi

mov eax,12345678h
mov edi,_print_str
push eax
push edi
call _printf
add esp,4

pop eax
bswap eax
push eax
push edi
call _printf
add esp,8

pop edi
pop eax
pop ebp
ret

segment _data USE32
_print_str:
db '%xh',0
------------------------------------------------

特に意味はないプログラムでして、
eaxに12345678hを代入したのち、Cのライブラリ関数printfを呼び出してeaxを表示し、
その後eaxにbswapをしたのち、またprintfでeaxを表示する
というだけのモノです。(bswap命令の挙動を確かめたくて作ったものです…)

以上のプログラムを
nasm -f obj bswap.asm
bcc32 main.c bswap.obj
としますと、
「Fatal: 'bswap.asm' : Additional segments need to be defined in a .def file」
というエラーが出てリンクできません。

しかし、_print_str以下をコードセグメントに置くと問題なくリンクされ、動作もしました。

この場合一体どうすれば、printfで使うフォーマット文をデータセグメント上に置けるのでしょうか…?

再びアセンブラ  [2003/12/12 Fri 17:19:50]  [210.63.108.10]

何方か32bit乱数発生の方法知りませんか ?
 使用言語は、勿論アセンブラです。

   宜しくお願いします。
かよ  [2003/12/12 Fri 09:41:12]  [202.33.240.232]

bonさん、レスありがとうございます。

環境についてです。
Windows2000のコマンドプロンプトを使ってコンパイルしています。
作りたいのは、8086/8088プロセッサ用の命令セットを使ったアセンブラコードです。

プロテクトモードだと、esレジスタの値が変わってしまうのでしょうか?

bon  [2003/12/12 Fri 03:52:07]  [218.222.84.140]

かよさん、動作環境不明。

プロテクトモードでないの?
かよ  [2003/12/11 Thu 11:10:02]  [202.33.240.232]

初めて投稿させていただきます。
(アセンブラの掲示板があって、とてもうれしいです)

私は今、MSC(Ver.7)とMASMを使ってC言語とアセンブラの勉強をしています。はじめたばかりで、わからない点が多いのですが・・・。

C言語がアセンブラになったファイル(CODファイル)を見ていて不思議に思うことがありました。よかったら教えてください。
よろしくお願いしますm(_ _)m。

C言語で、アドレス4AAAAhにAAAAhのデータを書くソースを書きました。

*((USHORT _far*)(0x4AAAA)) = (USHORT)0xAAAA;

これをコンパイルしたところ、

mov  bx,4
mov  es,bx
mov  bx,-21846 ;aaaaH
mov  WORD PTR es:[bx],-21846 ;aaaaH

となっていました。
私の予想では、esレジスタは、4000hになってくれるのかと思っていたのですが、実際には4hに設定されています。
これだと、AAAAh+40h=AAEAhへの書き込みとなってしまう気がします。
esレジスタは、4hで正しいのでしょうか?
(初歩的な質問ですみません・・・)

Xeno  [2003/12/09 Tue 10:03:32]  [220.110.19.138]

Bonさんレスありがとうございます。

ORG 100H
START:
ORG 0H

にしてコンパイルしたところ256バイトのCOMファイルが出来上がりました。 0バイトからコードになってました。
確かにEXE2BINを使う必要まったくありませんね。(^^;) 

bon  [2003/12/08 Mon 19:15:58]  [218.222.44.39]

こんにちは 超初心者のbonがレスします。
Xenoさんの過去発言を詠んでないので、外していたらゴメンね

> ブートコード用にコードの部分だけ取り出すにはどうしたらいいのでしょうか?

私、ディスクブートコードは、大昔にフッロピー用を書いた事あるだけですが、
ブートコードはプログラムのスタート番地が、ゼロだったはず。

ORG 0 の実行ファイルを生成するには、ソースを以下のようにして、COMファイルを生成します。それがそのままブートコードになり、ディスクの所定の位置にそのまま書きこめばOKのはず。Masm6.xでは、EXE2BINは不要です。

--[Start]-----
code segment byte
assume cs:code,ds:code,es:code,ss:code
org 100h
start:
org 0h

なんとか
かんとか


code ends
end start
--[End]-----

EXE2BINは、COMファイルか可能なEXEファイルのみを変換するものだったはず。
だから、ソースは、COMファイルを前提に書かれていなければいけません。

>なぜこんな古いものがWindows 2000のシステムディレクトリ内にある?
>しかも更新日時 1999/12/07...why?
単に、過去の遺産の継承でしょう。

Xeno  [2003/12/08 Mon 09:55:31]  [220.110.19.138]

解決しました。

4.ブートコードを書いたのはいいのですが、普通にコンパイル等をすると当然、exe,obj形式のファイルしかできません。
  ブートコード用にコードの部分だけ取り出すにはどうしたらいいのでしょうか?

実行ファイルをプログラムのメモリイメージに変換し出力する
ツールEXE2BIN。 他の人から貰ったEXE2BIN(更新日時 1994/12/08)はうまく使えなかった
のですが...
なぜこんな古いものがWindows 2000のシステムディレクトリ内にある? しかも更新日時 1999/12/07...why?


Xeno  [2003/12/08 Mon 09:17:53]  [220.110.19.138]

ぐりぽんさん、しろさん、
どうもありがとうございます。 週末はFATに苦戦してました。(^^;)

とりあえずNTFSフォーマット構造に関してはLinuxのソースコードを解析してみます。
ハードディスクのパーティション構造はMBRSCANのドキュメントに
確かに書いてあるようです。
私も作者に習って解析してみます。


しろ  [2003/12/08 Mon 07:27:39]  [220.96.34.5]

しろ

> Xeno さん
> 3.NTFSフォーマット構造の仕様書等

残念ながら詳細な仕様書は見つからなかったのですが、概要だけなら
"Linux-NTFS Project" 内の "NTFS documentation" が参考になると思います。

http://linux-ntfs.sourceforge.net/ntfs/index.html

# あとは "Linux-NTFS Project" 内のソースを読むとか

日本語で書かれたNTFSの概要としては『Inside Windows NTファイルシステム』
(ISBN:4-7561-0302-2) という書籍が存在したのですが、'95年発行ですので入手は
難しいでしょう。(この書籍も概要だけなのでこれを読んだだけでNTFSを読むプロ
グラムが書けるということはありません)
初心者  [2003/12/06 Sat 15:10:10]  [218.142.56.56]

ぐりぽんさんへ

MASMの文法への変換ができ、無事動作を確認しました!
ありがとうございます〜!
初心者  [2003/12/06 Sat 14:35:09]  [218.142.56.56]

わぉ。
おかしいなーと思いMASMの形式に手作業で変換しながらやっていたら・・・w
ご丁寧にありがとうございます!
ぐりぽん  [2003/12/06 Sat 13:42:01]  [210.249.5.39]

私MASMの文法がよくわからずFASMで書いていたので、アセンブル
できないと思います。以下にソースとバイナリを置いておきます。
http://guriponn.at.infoseek.co.jp/new.lzh
初心者  [2003/12/06 Sat 08:01:34]  [218.142.56.56]

ぐりぽんさんへ

ありゃ。。
すごい簡単にまとまってしまいましたね。
うーん。まだまだ勉強しないといけないなぁ^^;

アセンブル&実行してみますねー!
ありがとうございました!
ぐりぽん  [2003/12/05 Fri 21:39:38]  [210.249.5.142]

>Xenoさん
答えられるところだけ答えます。
ハードディスクのパーティションの仕様書というものは知りませんが、
MBRSCANというソフトのドキュメントが詳しいような気がします。

>初心者さん
興味があったので書き直してみました。動くはずです。
----
org 0x7c00

xor ax,ax
mov ds,ax
mov ss,ax
mov sp,0x7c00
cli
mov word [0x0020],int_timer
mov word [0x0022],0
mov al,0x36
out 0x43,al
mov al,0x52
out 0x40,al
mov al,0x09
out 0x40,al
sti
jmp $

int_timer:
cli
xor bx,bx
mov ah,0x0e
mov si,message
i1: lodsb
int 0x10
cmp al,0x20
jne i1
out 0x20,al
sti
iret

message db "(^-^) "
times 0x7dfe-$ db 0
dw 0xaa55
初心者  [2003/12/05 Fri 16:06:37]  [218.142.56.56]

すみません。
また伺いに来ました。。

前の資料等を参考にして、タイマー割り込みをテストするプログラムを作ったのですが、なぜか動きません。。
IPLのテストプログラムなのですが。

ソースは以下のようになっています。

----------
;タイマー割り込みテストプログラム
.486

START = 7c00h

TEXT segment byte public use16

jmp short BootProg

org 0030h

;メインコード
BootProg:
cld
cli
xor ax, ax
mov ds, ax
mov ss, ax
mov sp, 7c00h

mov ax, 0003h
int 10h ;ここまで、VGAの設定

call SetTimer

sti


MainLoop:
jmp short MainLoop



PrintStr:
lodsb
or al, al ; AL = 0 ?
je short Return
int 10h
jmp short PrintStr
Return:
ret

SetTimer:
mov ds:[0032h], offset Interrupt
mov ds:[0034h], word ptr 0000h

;タイマーカウンタの初期化
mov ah, 00h
mov ds:[8000h], ah

;タイマー モード3
mov al, 36h
out 43h, al

;0x952 = 2ms
mov al, 52h
out 40h, al

mov al, 09h
out 40h, al

;PICを設定
in al, 21h
and al, 0FEh
out 21h, al

ret

Interrupt:
cli
pusha

mov ah, ds:[8000h]

.if ah == 30
mov ah, 0Eh
mov al, '*'
mov bh, 0h
mov bl, 0h

xor bx, bx
lea si, Message2 + START
mov ah, 0eh
call PrintStr ; 文字列表示

mov ah, 0h
mov ds:[8000h], ah
.else
inc ah
mov ds:[8000h], ah
.endif

;EOI発行
mov al, 20h
out 20h, al

popa
sti

iret




org 0100h
Message1 db "Timer Test Program ver0.1", 0dh, 0ah, 0
Message2 db "---!Timer Interrupt!---", 0dh, 0ah, 0

org 0200h - 2
dw 0aa55h
TEXT ends
end
Xeno  [2003/12/01 Mon 21:02:21]  [220.110.19.138]

MASM6.11を使用して自分専用?のOSを作成しようと四苦八苦しています。(準備中)
今現在、ハードディスクの解析を進めています。

そこで皆様にお聞きしたいことが...た・く・さ・ん(^_^;;)

1.ハードディスクのパーティションの仕様書?みたいなものはないで
  しょうか?(FDISK/ハードディスク抹消ソフトみたなことがしたい
  のです)

2.Int 13だとドライブ単位でしかアクセスできないようなのですが、
 ディスク単位でアクセスするにはどうすればいいのでしょうか?(もしかしてInt 13Hで出来るのか?)

3.NTFSフォーマット構造の仕様書等
4.ブートコードを書いたのはいいのですが、普通にコンパイル等をすると当然、exe,obj形式のファイルしかできません。
  ブートコード用にコードの部分だけ取り出すにはどうしたらいいのでしょうか?


以上4点についてなにとぞよろしくお願いします。

初心者  [2003/12/01 Mon 12:40:18]  [218.142.56.56]

ぐりぽんさんへ

ありがとうございます!
なるほど。頑張って資料等を読んでみますね。
これからも、機会があれば質問させてもらうのでよろしくです。
ぐりぽん  [2003/11/30 Sun 22:27:16]  [210.249.5.26]

>初心者さん
ご紹介した「パソコンのレガシィI/O〜」のサイトで大体のことは
判ると思いますが、参考までに手元のソースを掲載します。

cli
mov al,0x11 ; icw1 - initialize (no setting icw4)
out 0x20,al
out 0xa0,al
mov al,0x18 ; icw2 - interrupt base address
out 0x21,al ; start at 0x18
mov al,0x20
out 0xa1,al
mov al,0x04 ; icw3 - it has slave pic
out 0x21,al
mov al,0x02
out 0xa1,al
mov al,0x01 ; icw4 - option but must set
out 0x21,al
out 0xa1,al

本来なら0x20以降にハードウェア割り込みを移すのが良いです。
この後、CLI状態のままで必要な割り込みハンドラをベクタに設定し、
それからSTIするのが定石のようです。
初心者  [2003/11/30 Sun 17:50:42]  [218.142.56.56]

ぐりぽんさんへ

ご回答ありがとうございます。
ええとですね、フロッピーディスクの割り込みと、
486のページフォルトの割り込みと区別ができるかどうかが知りたいんですよ。
ソフトウェア的に区別できるのか、割り込みコントローラの設定で区別するか・・。
で、私が聞いた話では、割り込みコントローラで設定するらしいんですよ。
ですから、その、どのように割り込み番号を変えるのかな・・・と。。

>で、情報提供をしてばかりでは回答者も気分が悪うございます。
はい。その気持ちはわかります。
私もGoogle等で調べたのですが、ピンとくるものがなかったのです。
解説の文だけですと理解ができず、今ココにて質問したわけです。

http://www.cqpub.co.jp/column/books/2001a/34331PC_Legacy/default.htm
なるほど。あとでゆっくり読ませてもらいます。

http://www.asahi-net.or.jp/~WR7S-NKMR/BeOS/Documents/IRQ.html
これはGoogleで検索した際、ヒットしました。
ディスクに保存してあるのですが、上に書いたとおり読解できずさっぱりです。。

よろしくお願いします。

ぐりぽん  [2003/11/30 Sun 14:39:34]  [210.249.5.200]

http://book.mycom.co.jp/user/preview/4-8399-1202-5/index.shtml
ここに載せられている本は悪書であると各サイトで書き込みが。。
それはともかく。閑話休題。

>初心者さん
その考え方はそもそも間違っていません。普通の考えです。
私としてはどのような理由でそれを変える必要があるのかが
知りたいです。宜しければ教えてください。

で、情報提供をしてばかりでは回答者も気分が悪うございます。
http://www.google.co.jp/ のような優秀なサーチエンヂンで
「割り込みコントローラ」と入力すれば、適当なサイトが見つかり
ますので、またそれで調べて回れば良いでしょう。。

私が見たところ、良いサイトが2つほど。
http://www.cqpub.co.jp/column/books/2001a/34331PC_Legacy/default.htm
http://www.asahi-net.or.jp/~WR7S-NKMR/BeOS/Documents/IRQ.html
情報収集能力は大事なものでございます。
自分でも是非そのような能力を磨かれることをお勧めします。
初心者  [2003/11/24 Mon 19:38:04]  [218.142.56.56]

ええと、たとえば
フロッピーディスクの割り込み番号の0Ehは
486のページフォルトの0Ehと重なりますよね?
例外割り込みのほうは変更できなくて、ハードウェア割り込みは独自で選べると聞いているんですが・・・。

そもそも考え方が違うのでしょうか。
澤口@一升金  [2003/11/23 Sun 20:51:50]  [221.184.146.46]

澤口@一升金です。

to 初心者さん:

誰から聞いたのか知りませんが、ぶつかるように設定すれば
ぶつかるし、そうでなければぶつかりません。
通常のPCでは電源ONでBIOSが設定するのですが、わ
ざわざ変更しなければならない理由は何でしょう。
どういう不具合があって、何を解決したいのかよく分からな
いのですが。
初心者  [2003/11/23 Sun 09:44:12]  [218.142.56.127]

はじめまして。早速質問させていただきます。

486系CPUでは、例外割り込みと
ハードウェア割り込みの番号が衝突してしまいますよね?
なので、ハードウェア割り込みの割り込み番号を変更したいのですが。
割り込みコントローラに設定するというのは分かったんですが、
どのようなポートで、どのように設定するのか、まったく分かりません。

Masmで開発を行っています

どなたか、ご伝授ください!
澤口@一升金  [2003/11/22 Sat 12:31:17]  [221.184.149.22]

澤口@一升金です。

to 質問者さん:

eor は exclusive or、すなわち
1 eor 1 = 0;
0 eor 0 = 0;
1 eor 0 = 1;
となる論理処理です。
従って、同じデータを eor すれば、データが何であっても
全ビットが 0 になります。
moveq とどう違うのかと言えば、機械語になったときのバイ
ト数と実行速度が違うわけです。(CISC CPU の場合は)
eor は 1 byte かせいぜい 2 byte 長の命令、moveq は
5 byte 以上ですから。
澤口@一升金  [2003/11/22 Sat 12:23:16]  [221.184.149.22]

澤口@一升金です。

to yuki さん:

何が、どううまくいかないのでしょう。
・汎用レジスタに書き込めない
・書き込んだけど読み出せない
・通信速度の設定の仕方がわからない

エントリポイントとは、要するに何かの処理をするときに
コールするかジャンプすることが予め決めているアドレス
のことです。
C言語では関数の先頭番地のことなのですが、アセンブラで
は関数単位の先頭番地でなくても呼び出せてしまうので、
「関数」とは言えないわけです。

質問者  [2003/11/20 Thu 10:57:42]  [219.127.232.253]

質問が1点ありますので、回答よろしくお願い致します。

(1)以下の2つの命令の結果は同じように思えるのですが(共に32bitを0に設定)
 その認識で間違いないのでしょうか?違いがあるのでしょうか?
・eor.l D1,D1
・moveq #0 , D1
yuki  [2003/11/20 Thu 09:24:05]  [210.81.92.130]

皆さんおはようございます。
私はH8_3687Tinyでアセンブラの勉強をしております。
質問があります
1.テーブルの使い方
例えば、汎用レジスタに格納されている情報(H'1C)を読んで、通信速度を変更したりする事は可能でしょうか?
H'1C = 9600bps
H'11 = 19200bps
H'05 = 38400bps
のような感じをテーブルを使ってみたいのです。
色々試してみましたが、うまくいきません・・・。

2.エントリーポイント($)とは何ですか?

ど素人ですので、仕様書を読んでも専門用語が出てきてチンプンカンプンです。どなたかよろしくお願いします。

yuki
質問者  [2003/11/19 Wed 10:32:07]  [219.127.232.253]

澤口さんへ

回答ありがとうございました。
今回も丁寧な回答で大変わかりやすかったです!
質問(4)については私のほうでもうちょっと調べてみて再度質問させて
頂くかもしれません。
よろしくお願い致します。

澤口@一升金  [2003/11/19 Wed 01:34:47]  [221.184.148.116]

澤口@一升金です。

to 質問者さん:

(1)MOVEQ #0 , D0
MOVEQ はQUAD BYTE,すなわち32bit 移動命令です。
D0 は 0 になります。
ちなみに、MOBVB で byte の 0 を書き込んでも D0
の 32bit はすべて 0 になります。

(2)MOVEQ #0 , D0
move.l #$00000000 ,D0
同じものですが、書式が混在するのはあまり感心しま
せん。どちらかに統一するべきですね。

(3)・MOVEC
・movec
アセンブラは普通、大文字と小文字を区別しませんから、
同じものです。現代的には小文字表記が普通です。
ラベルやマクロ定義を大文字で書いて地のニーモニックは
小文字で書けば、少しはソースが見やすくなります。

(4)_stack_top:
move.l #_stack_top , SP
本当にこれしか書いていないとすれば、間違いであろうと
思います。_stack_top: はラベル、すなわちアドレス値
であって、命令でも何でもないですから、メモリ確保はさ
れていません。
_stack_top: の前には何も書かれていないのですか?
質問者  [2003/11/17 Mon 15:24:36]  [219.127.232.253]

#CPUはMC68020です。

既存のソースファイルの意味を解析中なのですが、
下記4点質問がありますので、回答よろしくお願い致します。

(1)MOVEQ #0 , D0
上記の命令はD0を0で初期化している意味なのでしょうか?
また、この命令後のD0は32bitすべて0になっているのでしょうか?

(2)下記2つの命令は同値と考えても問題ないのでしょうか?
・MOVEQ #0 , D0
・move.l #$00000000 ,D0

(3)下記2つの命令は同値なのでしょうか?(大文字と小文字の違いです。)
・MOVEC
・movec

(4)下記の書式は問題ないのでしょうか?
また、問題ないようでしたら、意味も教えてもらえますでしょうか?
  (スタックポインタの初期化をしているとコメントには記載されているのですが
  _stack_top:としただけでメモリ領域は確保されるのでしょうか?)

_stack_top:
move.l #_stack_top , SP
 

初心者なもので質問の意図がご理解頂けないかもしれませんが、(的外れな質問をしているような。。)
回答よろしくお願い致します。

質問者  [2003/11/17 Mon 10:42:03]  [219.127.232.253]

澤口さんへ
回答ありがとうございました!
$は16進数値である事の意味なんですね!?
初心者なもので、今後たびたび基本的な質問をしてしまうかもしれませんが、
回答をよろしくお願い致します!
澤口@一升金  [2003/11/16 Sun 03:54:47]  [221.184.152.86]

澤口@一升金です。

to 質問者さん:

CPUとアセンブラが何なのかわかりませんが、常識的には
# ... イミディエイト値であることを宣言
$ ... 16進数値であることを宣言
ですから、
#$ .. 16進のイミディエイト値であることを宣言
となります。
0..9 までは10進表記でも16進表記でも数値表記と値は一致
しますから、どちらでも同じです。
澤口@一升金  [2003/11/16 Sun 03:48:57]  [221.184.152.86]

澤口@一升金です。

gccにアセンブラを吐かせてみました。
printsに渡されるアドレスは
str: ds 相対のオフセット
a[]: ss 相対のオフセット
です。

LC0:
.ascii "ABCDEFG\12\0"
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
subl $72, %esp
andl $-16, %esp
movl $0, %eax
movl %eax, -44(%ebp)
movl -44(%ebp), %eax
call __alloca
call ___main
movl $LC0, -12(%ebp)
movb $97, -40(%ebp)
movb $98, -39(%ebp)
movb $99, -38(%ebp)
movb $100, -37(%ebp)
movb $101, -36(%ebp)
movb $10, -35(%ebp)
movb $0, -34(%ebp)
movl -12(%ebp), %eax
movl %eax, (%esp)
call _prints
leal -40(%ebp), %eax
movl %eax, (%esp)
call _prints
leave
ret

質問者  [2003/11/14 Fri 14:16:53]  [219.127.232.253]

以下の件教えて頂けないでしょうか?
<質問>
(1)move.w #$0 , D0
(2)move.w #0 , D0

(1)と(2)って何が違うのですか??
質問者  [2003/11/14 Fri 14:16:39]  [219.127.232.253]

以下の件教えて頂けないでしょうか?
<質問>
(1)move.w #$0 , D0
(2)move.w #0 , D0

(1)と(2)って何が違うのですか??
帰ってきた通りすがり  [2003/11/13 Thu 19:58:11]  [208.181.21.195]

なんか変な間違いしてました。
aは定数だが、a[]はスタック上に存在。中身は{'a','b','c','d','e', '\n', 0}のコピー。
prints(a);で呼ばれたとき、stringはスタックに存在。中身はa[]のアドレス、つまりa
でした。

>ただ、とくにコンパイルオプションを指定していないので、
>スタック操作(a[]の初期化)と、データの操作(str="ABCDEFG\n")
>では使用するセグメントが違うはずたから、prints()を呼び出し
>た時におかしくなるのでは、と思っているのですが
多分そうでしょう。
FARデータアドレッシングできるメモリモデルを選択すればいいとおもいます。
それがなければ、フラットメモリモデルを選ぶしかないです。
gccを使ったことがないので具体的な方法は不明ですが。
ビックバン  [2003/11/12 Wed 23:28:16]  [219.179.224.59]

澤口@一升金さん、通りすがりさん、ありがとうございます。

# といっても、まだ頭はビッグバン状態です。
# 二重投稿すみませんでした。

OSは既存のではなく、自前でブートから作っている実験的な
コードです。gccを利用してプロテクトモード、ベージング機能
なしの状態です。
プロテクトモードに移行して、dsとssが異なっていると、
prints(str)かprints(a)のどちらかがうまく表示されてくれな
いので、なんでかなぁと思い投稿しました。dsとssを同じにして
おけばもちろん両方とも表示されます。linuxなんかでは全ての
セグメントレジスタはベース0x0にしているので、そういうもの
なのかなぁと思いました。

ただ、とくにコンパイルオプションを指定していないので、
スタック操作(a[]の初期化)と、データの操作(str="ABCDEFG\n")
では使用するセグメントが違うはずたから、prints()を呼び出し
た時におかしくなるのでは、と思っているのですが...


通りすがり  [2003/11/11 Tue 19:20:23]  [208.181.21.195]

修正
>stringはスタックに存在。中身は"ABCDEFG\n"のアドレス。
prints(str);で呼ばれたとき、>stringはスタックに存在。中身は"ABCDEFG\n"のアドレス。
prints(a);で呼ばれたとき、>stringはスタックに存在。中身は{'a','b','c','d','e', '\n', 0}のアドレス。

通りすがり  [2003/11/11 Tue 19:15:01]  [208.181.21.195]

>ビックバンさん
普通に考えれば

strはスタックに存在。中身は"ABCDEFG\n"のアドレス。
"ABCDEFG\n"はデータセグメント上に存在。
aは変数ではなく、ただのアドレス(定数)なのでどこにも存在しない。強いて言えばコード上にある。
{'a','b','c','d','e', '\n', 0}ははデータセグメント上に存在。
stringはスタックに存在。中身は"ABCDEFG\n"のアドレス。

となると思います。
別にdsとssが同じでも違っても関係ないです。
澤口@一升金  [2003/11/11 Tue 01:53:59]  [221.184.146.79]

澤口@一升金です。

to ビッグバンさん:

これは、コンパイラとメモリモデル、OSを特定していただかないと、答える方法がありません。
たしかに、かつての Turbo C などは、 auto 変数のアドレスを関
数の引数にすると ss の代わりに無関係な ds を渡すなどと言うバ
グがありましたが、当然 .COM 実行ファイルなら問題ないわけです
し、コンパイラオプションで強制的に ds=ss とすることもできます。
また、コンパイラによっては main 関数内の変数はスタックに割り
付けずにデータ領域に割り付ける(要するに static 宣言した変数
と同じ扱い)ものもあった気がします。
ま、実際にコンパイラをお持ちで実行できる環境があるのでしたら、
コンパイルにアセンブラソースを吐かせてそれを見るのが早いと思
いますが。
ビックバン  [2003/11/09 Sun 17:08:10]  [219.179.224.59]

よく分からなくなったので質問します。
下のコードなんですが、
-------------------------------
void prints (char *string) {
while (*string) putchar(*string++); // (a)
}
int main() {
char *str = "ABCDEFG\n"; // (b)
char a[] = {'a','b','c','d','e', '\n', 0}; // (c)

prints(str);
prints(a);
}
-------------------------------
まず確認項目として、
(a) *stringは<ds:strのアドレス>でメモリにアクセスするのか?
(b) strはデータセグメント上に置かれるのか?
(c) aはスタックセグメント上に置かれるのか?

で、質問というのは、
このコードを正しく動くようにするには、dsとssは等しくなけら
ばいけないのですか?dsとssが等しくなくても正しく動くように
するには何かテクニックがあるのですか?

以上よろしくお願いします。

ビックバン  [2003/11/09 Sun 17:08:06]  [219.179.224.59]

よく分からなくなったので質問します。
下のコードなんですが、
-------------------------------
void prints (char *string) {
while (*string) putchar(*string++); // (a)
}
int main() {
char *str = "ABCDEFG\n"; // (b)
char a[] = {'a','b','c','d','e', '\n', 0}; // (c)

prints(str);
prints(a);
}
-------------------------------
まず確認項目として、
(a) *stringは<ds:strのアドレス>でメモリにアクセスするのか?
(b) strはデータセグメント上に置かれるのか?
(c) aはスタックセグメント上に置かれるのか?

で、質問というのは、
このコードを正しく動くようにするには、dsとssは等しくなけら
ばいけないのですか?dsとssが等しくなくても正しく動くように
するには何かテクニックがあるのですか?

以上よろしくお願いします。

力卜  [2003/11/06 Thu 23:11:43]  [192.51.44.48]

To: kasiwaさん
外していたらごめんなさい。
「DiskBasic版」というのは、その本に付属してきた「Disk BASICで
実装されたアセンブラ」だと解釈しました。
また、そのBASICで書かれたアセンブラが、アセンブリソース
プログラムを読み込んでアセンブルしようとするときに、
おっしゃっているエラーメッセージが表示されるということ
と解釈しました。
そのアセンブラは、アセンブリソースプログラムとして以下のような
BASICプログラムファイルを読み込むものなのではないのでしょうか。
10 ' mov ax,1234h
20 ' mov bx,4321h
アセンブリソースとなるBASICプログラムがバイナリ形式でSAVE
されているために、アセンブラはASCII形式でファイルをオープン
して読み込んだが ' (REM文) が見つからない…ということに
なっている気がします。
だとしたら、BASICで書かれたアセンブリソースプログラムを一旦
LOADし、ASCII形式でSAVEしなおしてからアセンブラにかければ
問題が解決しそうな気がします。
N88-BASICは知らないのですが、SAVE "aaa.bas",A とか、
LIST "aaa.bas" とかすればASCII形式でSAVEできるのでは
ないかと思います。

kasiwa  [2003/11/02 Sun 01:07:28]  [220.96.6.170]

98ユーザーのための86アセンブリ言語入門 工学社
木原 伊都志 著
というのを買ったのですが
DiskBasic版をアセンブリしようとすると
Falt Rem Mark とでてしまいます。
これを回避する方法どなたかわからないでしょうか。
DiskBasicのVerは6.1です。
まつもと  [2003/11/01 Sat 15:15:30]  [61.203.92.78]

こんにちは 松本です。

皆さんありがとうございました。時間はかかりましたが、なんとかFDDの読み込みに成功しました。

カトさん 貴重なアドバイスありがとうございます。
今はブードディスクを書いているので、とりあえず自作のAT互換機で動けば良いかと思っていますが、不具合等でましたらBIOSコールを使って互換のあるプログラムを組みたいと思います。




e-mail: mist@e-net.or.jp
Structured Anchor Tree Return to Menu Return to Parent Menu 
Powered by Unit Missing Link.