アセンブラを勉強しようat TECH
アセンブラを勉強しよう - 暇つぶし2ch2:デフォルトの名無しさん
07/03/03 19:02:43
LDA 1

3:デフォルトの名無しさん
07/03/03 19:03:24
>>2
すいませんわかりませんwwwwwwwww

4:1 ◆LrnSVKDHBg
07/03/03 19:08:40
コテハン忘れたwwwwwwww

とりあえずおさらいというかメモ

C風に変換(俺がC使いなので)
mov命令
mov eax, ebx

eax = ebx;

xchg命令
xchg eax, ebx

eax = eax ^ ebx;
ebx = eax ^ ebx;
eax = eax ^ ebx;

and命令
and eax, ebx

eax = eax & ebx;

or命令
or eax, ebx

eax = eax | ebx;

xor命令
xor eax, ebx

eax = eax ^ ebx;


5:デフォルトの名無しさん
07/03/03 19:08:50
アセンブリ言語じゃないのか?

6:デフォルトの名無しさん
07/03/03 19:11:09
cpuは??

7:デフォルトの名無しさん
07/03/03 19:11:19
C 風ならこう書こうぜ

and命令
and eax, ebx

eax &= ebx;

or命令
or eax, ebx

eax |= ebx;

xor命令
xor eax, ebx

eax ^= ebx;

8:デフォルトの名無しさん
07/03/03 19:12:17
500番地と501番地の内容を足して、502番地に書き込む。

lha $500
clc
adc $501
sta $502

9:1 ◆LrnSVKDHBg
07/03/03 19:13:01
not命令
not ebx

eax = eax ~ eax;

neg命令
neg eax

eax = eax * -1;

test命令
test eax, ebx

flag = eax & ebx;

add命令
add eax, ebx

eax = eax + ebx;

sub命令
sub eax, ebx

eax = eax = ebx;

inc命令
inc eax

eax = eax + 1;


10:デフォルトの名無しさん
07/03/03 19:16:00
本当に C 使いなのか?

not命令
not ebx

ebx = ~ebx;

neg命令
neg eax

eax = -eax;

test命令
test eax, ebx

flag = eax & ebx;

add命令
add eax, ebx

eax += ebx;

sub命令
sub eax, ebx

eax -= ebx;

inc命令
inc eax

++eax;

11:1 ◆LrnSVKDHBg
07/03/03 19:24:50
>>5
正確には逆アセンブリなんだollydbg使ってる

mul命令(よくわからん上位ビットを代入?HIWORD, LOWORDとかそういう奴か)
mul ebx

ebx = eax & 0xF0;
eax = eax >> 8;

inuml命令
符号付演算のmul命令

div命令
div ebx
わからんwwwwww

idiv命令
符号付演算のdiv命令

cmp命令
cmp eax, ebx

eax == ebxの場合ZF = 1
eax < ebxの場合SF = 1
eax > ebxの場合SF = 0

JMP命令
JMP START(アドレスとか)

goto START;



12:1 ◆LrnSVKDHBg
07/03/03 19:30:15
>>10
C使いだが+=とか-=はある時期から使わなくなっただけだ。
その辺は好みの問題だからな。後アセンブリに関してはまったくの無知で一からの勉強w

JA命令、JNBE命令
JA START(アドレスとか)

if(CF == 0 && ZF == 0)
{
goto START;
}

JAE命令、 JNB命令、 JNC命令
JAE START(アドレスとか)

if(CF == 0)
{
goto START;
}

JB命令、 JNAE命令、 JC命令
JB START(アドレスとか)

if(CF == 1)
{
goto START;
}

JBE命令、 JNA命令
JBE START(アドレスとか)

if(CF == 1 || ZF == 1)goto START(文字数制限がwwwwwww)

13:1 ◆LrnSVKDHBg
07/03/03 19:33:56
JE命令、 JZ命令
JE START(アドレスとか)

if(ZF == 1)
{
goto START;
}

JNE命令、 JNZ命令
JNE START

if(ZF == 0)
{
goto START;
}

JCXZ命令
jcxz START

if(ecx == 0)
{
goto START;
}

loop命令
loop START

ecx = ecx - 1;
if(ecx != 0)
{
continue;
}

14:デフォルトの名無しさん
07/03/03 19:36:18
たいへんです!
ぜんぜん汎用レジスタが足りませんorz

15:デフォルトの名無しさん
07/03/03 19:37:54
EXX

16:デフォルトの名無しさん
07/03/03 19:38:10
その昔、BASE80と言うものがあってな、ゲフンゲフ
構造化マクロっちゅーものもあってな、ゲフ



17:1 ◆LrnSVKDHBg
07/03/03 19:38:37
>>13
loop間違ってたw

loope命令、 loopz命令
loope START

ecx = ecx - 1;
if(ecx != 0 && ZF == 1)
{
goto START;
}

loopne命令、 loopnz命令
ecx = ecx - 1;
if(ecx != 0 && ZF == 0)
{
goto START;
}

push命令
push eax

eaxの値をスタックへ格納する(右下っぽい画面だった気がするollydbg)

pop命令
pop eax

eaxに一番上(?)のスタックの値を格納する(右下っぽい画面だった気がするollydbg)


18:1 ◆LrnSVKDHBg
07/03/03 19:44:07
pushf命令、 pushfd命令
pushf

フラグレジスタをスタックへ退避する(使用用途がよくわからんが関数呼び出し時の退避のため?)

popf命令、 popfd命令
popf

フラグレジスタをスタックから復帰する(使用用途がよくわからんがreturn後のフラグ復帰の為?)

call START

WndProc(....);

ret命令
ret

サブルーチンから復帰する
オペランドが渡されていたらそのオペランドのバイト数だけ
スタックのデータを捨ててから復帰するらしい。

return Result;

rcl命令
rcl eax

CFフラグを含めたビットの左回転

よくわからんwwwwww




19:デフォルトの名無しさん
07/03/03 19:46:48
mul命令
mul ebx

edx = ((eax * (uint64_t)ebx) >> 32) & 0xFFFFFFFF;
eax = (eax * (uint64_t)ebx) & 0xFFFFFFFF;

imul命令
imul ebx

edx = ((eax * (int64_t)ebx) >> 32) & 0xFFFFFFFF;
eax = (eax * (int64_t)ebx) & 0xFFFFFFFF;

imul eax, ebx

eax *= ebx;

imul eax, ebx, 10

eax = ebx * 10;

div命令
div ebx

eax = (((uint64_t)edx << 32) & eax) / ebx
edx = (((uint64_t)edx << 32) & eax) % ebx

idiv命令
div ebx

eax = (((int64_t)edx << 32) & eax) / ebx
edx = (((int64_t)edx << 32) & eax) % ebx

20:1 ◆LrnSVKDHBg
07/03/03 19:48:43
rol命令
rol eax

ビットの左回転

しるかwwwwwwwww

ror命令
ror eax

ビットの右回転

しるかwwwwwwwwwww

sal命令、 shl命令
sal eax

ビットの左シフト

sar命令
sar eax

最上位ビットの変化がない右シフト

shr命令

ビットの論理右シフト(最上位に0)

疲れた

21:1 ◆LrnSVKDHBg
07/03/03 19:49:48
>>19
64ビットかよwwwww

22:1 ◆LrnSVKDHBg
07/03/03 19:54:28
さてまずは
MOV DWORD PTR SS:[ESP+4], EDXの意味がわからない

これはULONG型のPTR(?)のSSレジスタのESP+4(アドレスだと思う)にEDXの
値を代入?って意味でいいんだろうかwwwwwww

そもそもPTRってなんだよちくしょうが!!!!!!

23:デフォルトの名無しさん
07/03/03 20:00:00
cmp命令
cmp eax, ebx

eax - ebx; /* フラグだけ変更し、結果は捨てる */

JA命令、JNBE命令とかは、
フラグがどうのこうのというよりは、
cmp と対応させて考えた方が良さげ。
A は above 、B は below 、C は carry とか、そういう風に。
test の時は、その都度表を見て調べればいい。

loop命令
loop START

if(--exc != 0) goto START;

でも、loop はちょい遅いので、
速度より容量や分かりやすさが要求される時しか使わない。

push 命令
push eax

*esp = eax;
esp -= 4;

pop命令
pop eax

eax = *esp;
esp += 4;

24:デフォルトの名無しさん
07/03/03 20:02:44
間違えた。

push命令
push eax

esp -= 4;
*esp = eax;

か。

25:1 ◆LrnSVKDHBg
07/03/03 20:06:11
EAX = 0x00000028
EDX = 0x00000002
ESP = 0x0012F9E8

①MOV DWORD PTR SS:[ESP+4],EDX
②MOV BYTE PTR SS:[ESP+8],0
③MOV DWORD PTR SS:[ESP+C],EAX
④MOV BYTE PTR SS:[ESP+10],0

この場合
0x0012F9E8 + 4 = 0x00000002
0x0012F9E8 + 8 = 0x00
0x0012F9E8 + 12 = 0x00000028
0x0012F9EB + 16 = 0x00
という解釈でいいのかな?
つまり4バイトの配列にそれぞれの値を代入してるのか。
でもなんで0代入の時はBYTEなんだろう・・・

26:デフォルトの名無しさん
07/03/03 20:06:14
間違えた

div命令
div ebx

eax = (((uint64_t)edx << 32) | eax) / ebx
edx = (((uint64_t)edx << 32) | eax) % ebx

idiv命令
div ebx

eax = (((int64_t)edx << 32) | eax) / ebx
edx = (((int64_t)edx << 32) | eax) % ebx

27:デフォルトの名無しさん
07/03/03 20:07:23
call命令
call START

esp -= 4;
*esp = eip;
eip = START;

ret命令
ret

eip = *esp;
esp += 4;

ret 8

eip = *esp;
esp += 4 + 8;

rcl命令
rcl eax

tmp = (eax >> 31) & 1;
eax = (eax << 1) | CF;
CF = tmp;

rol命令
rol eax

tmp = (eax >> 31) & 1;
eax = (eax << 1) | tmp;

28:1 ◆LrnSVKDHBg
07/03/03 20:07:46
>>23
なるほど参考にさせてもらいます。



29:1 ◆LrnSVKDHBg
07/03/03 20:11:30
MOV EDX モジュール名.00408AA0というのは恐らくモジュールの
メモリのアドレスの中身を示しているのかな?

後LEA命令ってのがよくわからんが・・

30:デフォルトの名無しさん
07/03/03 20:12:54
これで十分か。

rol命令
rol eax

eax = (eax << 1) | ((eax >> 31) & 1);

ror命令
ror eax

eax = ((eax >> 1) & 0x7FFFFFFF) | (eax << 31);

sal命令、shl命令
sal eax

eax <<= 1;

sar命令、shr命令
sar eax

eax = (eax >> 1) & 0x7FFFFFFF | (eax & 0x7FFFFFFF);

shr eax

eax = (eax >> 1) & 0x7FFFFFFF;

C の >> は int の場合は sar で、unsigned の場合は shr で実装されてることもあるが、
それは C の規約で規定されている訳ではない。
というわけで、こうややこしく書いたけど、もしそう実装されていればそれぞれ以下のようにしたのでよい。

eax >>= 1; /* eax は signed int */
eax >>= 1; /* eax は unsigned int */

31:デフォルトの名無しさん
07/03/03 20:16:25
push, pop, call, ret は良くない書き方をした。すまん。

esp は char* として、

push eax
esp -= 4; *(int*)esp = eax;

pop eax
eax = *(int*)esp; esp += 4;

call START
esp -= 4; *(char**)esp = eip; eip = START;

ret
eip = *(char**)esp;
esp += 4;

ret 8
eip = *(char**)esp;
esp += 4 + 8;

こうだな。

32:1 ◆LrnSVKDHBg
07/03/03 20:17:11
>>30
signedつきかつきじゃないかで変換される機械語が違ってくるのか

LEAはアドレス代入って奴か

ESP = 0x0012F9E8
LEA EAX,DWORD PTR SS:[ESP+4]という命令があるとすると

ESPの値が0x0012F9ECになるって事なのかな恐らく。

33:1 ◆LrnSVKDHBg
07/03/03 20:20:29
>>31
そんなポインタの嵐を使われてもwwwwwwww
俺のスキルを考えてくれorz

esp -= 4; *(char**)esp = eip; eip = START;
はespが0x40000000とすると
(char*)esp = 0x4000004
(char**)esp = 0x40000008
*(char**)esp = 0x40000008の中身って事かぐらい?
みたいな漠然としたものしかわからねぇw

34:デフォルトの名無しさん
07/03/03 20:25:11
で、これだが、

MOV DWORD PTR SS:[ESP+4], EDX

esp を char* とすれば、

*(int*)(esp + 4) = edx;

だな。
C でセグメントレジスタを扱う方法はもう忘れたけど、
esp はデフォルトで ss: 付きだから気にする必要はないね。

MOV BYTE PTR SS:[ESP+8],0

の場合は

*esp = 0;

だな。


多分、内部変数を扱ってるコードなんじゃないかな。
最初の方に sub esp, (内部変数のサイズ) か何か書いてあると思う。
これで内部変数の領域をスタック上に確保してる。
分かりやすいコードを書くときは esp を ebp に退避しといてから
ebp を通して参照するんだけど、
コンパイラはその辺最適化しちゃうことがあって、
可能な限り直接 esp を通して参照することがある。

35:デフォルトの名無しさん
07/03/03 20:26:46
>>30
signed か unsigned かで機械語が変わってくるかどうかはコンパイラ依存。
あまりあてにはしない方がいい。

36:デフォルトの名無しさん
07/03/03 20:28:54
>>33
この程度のポインタを理解できないようで
C 使いというのもどうかとは思うが、
まあアセンブリ言語を使う事によって
ポインタに対する理解も深まるだろう。多分。

というか、全然ポインタ分かってないな。
このキャストでアドレスは変わんないよ、普通の環境なら。

37:デフォルトの名無しさん
07/03/03 20:30:50
まあ、何というか、C を通して勉強しない方がいいと、俺は思う。
だって、C じゃ表現しきれない事だって多いし、
C の理解がその程度じゃむしろ誤解しそうで怖い。

おとなしく、本でも読んだ方がいいと思うぜ。

38:1 ◆LrnSVKDHBg
07/03/03 20:33:39
>>34
ものすごく漠然とだが見えてきた気がするw
配列に値を格納して言ってる感じかぁ

>>35
その辺の処理系についてはまだ俺には遠い世界。。

>>36
バカヤロウ!!!この程度のスキルしかないから勉強してるんだろうが!!!!!



39:デフォルトの名無しさん
07/03/03 20:43:07
>>38
俺もアセンブリ言語を通してポインタの理解を深めたクチだから、
悪い選択じゃないと思う。
なあに、分かってしまえば大したことは無いさ。

eax == 0x12031000 の場合、

mov byte ptr [eax], dl

|0x12031000|
|     dl    |

mov word ptr [eax], dx

|0x12031000|0x12031001|
|       dx        |

mov word ptr [eax], edx

|0x12031000|0x12031001|0x12031002|0x12031003|
|                edx               |

こういう風に代入される。
それぞれ、

*(char*)eax = dl;
*(short*)eax = dx;
*(int*)eax = edx;

に対応する感じ。
char が 1 バイト、short が 2 バイト(1 ワード)、int が 4 バイト(2 ワード)と仮定してるけど。
1 word == 2 bytes, 2 words == 1 dword == 4 bytes な。

40:デフォルトの名無しさん
07/03/03 20:45:24
間違えた。最後のは

mov dword ptr [eax], edx

|0x12031000|0x12031001|0x12031002|0x12031003|
|                edx               |

な。
まあ、分かるとは思うが。

41:デフォルトの名無しさん
07/03/03 21:03:44
英語だけど、このあたりのマニュアルが有用。

URLリンク(www.intel.com)

42:1 ◆LrnSVKDHBg
07/03/03 21:06:42
>>39
ふむ。

因みに(char*)eaxっていうのはchar型のポインタアドレスを
明示的に表しているっていう解釈でいいのかな?

つまり(char**)eaxの場合char型のアドレスを格納している
ポインタアドレスであって*(char**)はアドレスの先のアドレスの中身を
参照sd;gkjf;あwぇ;あ

char **pAddr;
char *string = "asm";

pAddr = string;

pAddrはpAddrのアドレス?
*pAddrはstringのアドレス?
**pAddrはstringアドレスの中身?

こういう解釈か!!!!
とりあえず腹が減っては戦はできないので何か食べてくる。


43:デフォルトの名無しさん
07/03/03 21:08:38
char** は char* へのポインタだよ。

char **pAddr;
char *string = "asm";

pp = &string;

pAddr は string のアドレス。
*pAddr は string と同じ。
**pAddr は 'a' 。

44:デフォルトの名無しさん
07/03/03 21:09:18
間違えた。

pAddr = &string;

だ。

45:デフォルトの名無しさん
07/03/03 21:11:20
typedef char *PCHAR;

PCHAR *pAddr;
PCHAR string = "asm";

pAddr = &string;

pAddr は string のアドレス。
*pAddr は string と同じ。



int *pAddr;
int string = 0;

pAddr = &string;

pAddr は string のアドレス。
*pAddr は string と同じ。

を比較すればいい。
全く同じ事。

46:1 ◆LrnSVKDHBg
07/03/03 21:37:50
>>43-45
まあまて。

char **pAddr;
char *string = "asm";

pAddr= &string;

pAddr は string のアドレス。
*pAddr は string と同じ。
**pAddr は 'a' 。

の部分で

pAddr = &stringとあるがこれはpAddr = stringとは違うのか!?

適当なアドレスで表すと

pAddr = 0xAAAAAAAA
string = 0xBBBBBBBB->"asm"

pAddr = &stringは0xAAAAAAAA = 0xBBBBBBBB
pAddr =  stringは0xAAAAAAAA = 0xBBBBBBBB

とはちがったりするんだろうかあああああああああ

&stringはstringのアドレス自体でstringはstringの先頭アドレス'a'という
解釈でいいんだろうか。だとすると納得。

47:1 ◆LrnSVKDHBg
07/03/03 21:42:40
>>45
おおおおおお!!
なんとなくつかめた気がする!
これで最強に一歩近づいたな。

48:1 ◆LrnSVKDHBg
07/03/03 23:35:49
ESI = 0x00000026

SAR ESI, 1

が何でESI = 0x00000013になるんだろう。


49:1 ◆LrnSVKDHBg
07/03/03 23:41:41
16進じゃなくて10進の26だった

50:デフォルトの名無しさん
07/03/04 02:51:05
x86の浮動小数点演算についてわかりやすく説明したページないですか?

51:デフォルトの名無しさん
07/03/04 07:13:15
一つ疑問がある。
なんでx86見たいな変態アーキテクチャでアセンブラ勉強しようと思ったんだ?
マゾなのか?

52:デフォルトの名無しさん
07/03/04 10:23:19
>>48
x を右へ n だけシフトすれば
x / (2 の n 乗) になるのは常識。

2進シフトで分かりにくければ、
10進シフトで考えてみるといい。
31239832 を右に2桁シフトすれば 312398 になる。
これは 31239832 / 100 でしょ?

53:デフォルトの名無しさん
07/03/04 10:24:40
>>50
浮動小数点数でググればいくらでも出てくる。

54:デフォルトの名無しさん
07/03/04 10:25:25
x86 以外で勉強する方が、環境用意するのが大変でマゾだろう・・・。

55:デフォルトの名無しさん
07/03/04 11:42:56
>>51
ぜんぜん問題ない。
86アーキを理解したいなら別だが、
それは言語とは別問題だ。

56:デフォルトの名無しさん
07/03/04 12:25:38
>>53
たとえばどれ?

57:デフォルトの名無しさん
07/03/04 14:05:23
>>56
上から全部読んでいけ。
IEEE754 ってのがそれだ。

58:デフォルトの名無しさん
07/03/04 14:59:35
動物には餌を与えるべきではないだろう。
餌を与えると自分で餌を探そうとする意思をなくす。

59:デフォルトの名無しさん
07/03/05 06:32:37
>54
俺としては、シミュレータも揃っててサンプルコードの多いCASLII辺りの方がお勧めだがな

60:デフォルトの名無しさん
07/03/05 07:36:38
>>57
そのページを参照すればx86で浮動小数点演算をアセンブラで書けることを証明してください。

61:デフォルトの名無しさん
07/03/05 07:46:32
馬鹿かコイツは。自分で証明しろよ。

62:デフォルトの名無しさん
07/03/05 07:51:54
馬鹿というよりもむしろ害虫

63:デフォルトの名無しさん
07/03/05 10:41:59
休み明けに新規スレチェックしてみてタイトルにアセンブラとあるから来てみたら……
何このCも碌に判っていない癖にC使いとかほざいている>>1
アセンブラを勉強する以前にやるべきことが腐るほどありそうだ。

64:デフォルトの名無しさん
07/03/05 18:05:04
このスレにいる人はアセンブラなんて書けない人ばかり

65:デフォルトの名無しさん
07/03/05 21:01:51
そうでもない。
68000とかH8とかARM7あたりならガリガリ書けるぞ。

66:デフォルトの名無しさん
07/03/05 22:36:06
アセンブラを勉強したいなら、
Cコンパイラに-Sオプションでも付けて
各CPUのソースを「同一のCソースから」生成してみると
かなりおもしろいという事を発見できる。

まずはgcc使って遊べ。

67:デフォルトの名無しさん
07/03/05 23:13:25
え~~、gasはよみにくいからきら~い♪

68:デフォルトの名無しさん
07/03/05 23:49:19
asmやるんなら、いちいちcでこう書いたらこうなるとか考えない。
最初からasmで考えないと。

69:デフォルトの名無しさん
07/03/06 00:17:02
>>60
ああ、fadd とかそういう話か。
>>41 のマニュアルでも見れば?

70:デフォルトの名無しさん
07/03/06 18:00:51
Intelは日本語でも色々揃えている。
URLリンク(www.intel.com)

71:デフォルトの名無しさん
07/03/06 19:38:56
インテルは頻繁にレイアウト変えてややこしすぎる。

72:デフォルトの名無しさん
07/03/06 22:45:10
>>54
あ?マイコンのほうが環境は揃いやすいですよ?
多少の出費があってもよければx86よりポケコンのほうが
純粋にアセンブラを学べる

73:デフォルトの名無しさん
07/03/06 22:56:51
ポケコンってまだ一般向けに売ってるのか?
今時持ってるのは工業高校の生徒くらいだろ。

74:デフォルトの名無しさん
07/03/06 22:58:26
秋葉原、日本橋ならいつでも買えるんだぜ?

75:デフォルトの名無しさん
07/03/06 23:14:26
x86 なら出費なんていらないだろ。
VC++ Express Edition で
デバッガの混合モードや
インラインアセンブラを使えばいいだけ。

76:デフォルトの名無しさん
07/03/06 23:22:53
>>74
それじゃ揃いやすいとは言えんだろ

77:デフォルトの名無しさん
07/03/06 23:33:01
>>76
誰もそんなことは言ってない

78:デフォルトの名無しさん
07/03/06 23:33:43
>>75
標準搭載してない

79:デフォルトの名無しさん
07/03/06 23:40:57
じゃあ、debug.exeで

80:デフォルトの名無しさん
07/03/07 00:07:15
結局>>1は三日坊主か

81:デフォルトの名無しさん
07/03/07 06:02:21
>79
Winでx86の最初の環境としては最良だよな
標準搭載だし

82:デフォルトの名無しさん
07/03/07 09:12:21
MASM は今フリーだっけか?
VC++ についてるってだけだっけ?

83:デフォルトの名無しさん
07/03/07 18:30:08
>>53>>57は論理的におかしいな。
>>50
「浮動小数点演算について説明したページ」ではなく
「浮動小数点演算についてわかりやすく説明したページ」を聞いているのだから。

検索で出てきたものが全て「わかりやすく説明したページ」であるはずがない。

84:デフォルトの名無しさん
07/03/07 20:11:29
病名でググって一番上にきた病院は繁盛するってNHKスペシャルで言ってた

85:デフォルトの名無しさん
07/03/07 20:29:53
>>83
そんぐらい自分で探せよ。

86:デフォルトの名無しさん
07/03/07 23:25:22
Wikipediaもまあよくまとまってるけど、「わかりやすい」ってこういうのとかじゃね?
URLリンク(pc.nikkeibp.co.jp)

87:デフォルトの名無しさん
07/03/08 04:28:28
間違っていなきゃね。

88:デフォルトの名無しさん
07/03/13 16:21:38
アセンブラかと思ったら…
インラインアセンブラにもなってなくてorz

89:デフォルトの名無しさん
07/03/13 20:39:36
>>88
こちらへどうぞ
アセンブラ… (゜□゜) ↑アッー!↓
スレリンク(tech板)l50

90:デフォルトの名無しさん
07/03/16 20:36:19
MASM初心者です。

OR AX, AX

CMP AX, 0

は同義だということをネットで見たのですが、意味がわかりませんでした。
また、OR命令はフラグレジスタのゼロフラグに影響を与えないと思ってたの
ですが、どうなのでしょうか?


91:デフォルトの名無しさん
07/03/16 20:40:33
>>90
まずはIntelのサイトに言って「IA-32 インテル アーキテクチャ
ソフトウェア・デベロッパーズ・マニュアル」を全部ダウンロードしなさい。

92:デフォルトの名無しさん
07/03/16 20:41:10
×言って
○行って

93:デフォルトの名無しさん
07/03/16 21:12:41
>>91
ありがとうございます。
なるほど思い切り書いてありました。。
ナットクです。

94:デフォルトの名無しさん
07/03/21 00:23:20
で、>>1 は勉強終わったのか?

95:デフォルトの名無しさん
07/04/11 04:05:26
486のポケコンねえ?

96:デフォルトの名無しさん
07/04/11 15:10:03
俺も今から勉強するぜ!
命令が27個でアドレッシングモードが7つ、レジスタが16個って16bitCPUのをな!!

97:デフォルトの名無しさん
07/04/12 13:36:24
>96
そのネタが全く分からない俺はここに居るべきじゃないんだろうな…

98:デフォルトの名無しさん
07/04/28 23:10:48
CASL e-Learning System
URLリンク(www.inf.ie.kanagawa-u.ac.jp)

99:デフォルトの名無しさん
07/05/09 04:06:24
今更アセンブラを勉強しようと思ってこのスレ覗いたんだが、
全くわけわからん。。。

一応C++、Javaなどは仕事で使ってきたからある程度はわかっているつもりだけど
アセンブラでメモリの内容書き換えたり、Jumpしたりして一体何がどうなるのか???
つながりが全くわからない俺はどこから手をつけたらいいんでしょうか。

100:デフォルトの名無しさん
07/05/09 05:25:04
>>99
>>98
見て勉強したら?

101:デフォルトの名無しさん
07/05/09 12:13:49
>>99
SIMD弄ってみたら?

102:デフォルトの名無しさん
07/05/09 13:11:09
C++がわかるならC++コンパイラにアセンブリコードを出力させるなり逆アセンブルするなりして比較するのがわかりやすい

103:デフォルトの名無しさん
07/05/09 14:58:36
>>100-102
レスサンクス。まずはC++からアセンブリコード出力させるとこからやってみるわー。

104:デフォルトの名無しさん
07/05/09 15:26:06
計算に使うレジスタ自体が書き換わるのがウザい

105:デフォルトの名無しさん
07/05/09 18:41:19
VC++ の混合モードとか便利ね。

106:デフォルトの名無しさん
07/05/09 21:29:40
>>105
つ[gcc -g -S]

107:デフォルトの名無しさん
07/05/10 02:26:25
>>98
そこ何度やっても
www.inf.ie.kanagawa-u.ac.jp のサーバからの応答が一定時間以内に返ってきませんでした。
ってなってつながらないんだが、どうしてだろう?

108:デフォルトの名無しさん
07/05/11 03:07:51
プロバイダで撥ねられてる or 夜中3:00~3:10のメンテナンス中に読みにいったキャッシュが残ってる。
じゃない?

109:デフォルトの名無しさん
07/05/20 16:10:03
>>1
学習は済んだのか?

110:デフォルトの名無しさん
07/05/30 18:26:16
uwAAvwAAtAay/80hdQPpggCIhRICR4P/A3XruQQA6BAAA9+D+zl127QJug8CzSHrz74AANAmFALQ
FhMC0BYSAtHW0CYUAtAWEwLQFhIC0dbQJhQC0BYTAtAWEgLR1tAmFALQFhMC0BYSAtHW0CYUAtAW
EwLQFhIC0dbQJhQC0BYTAtAWEgLR1rQGipTPAc0h4p/Dg/8DdQm0CboSAs0h6yGD/wJ1DrkDAOiF
/+gZAOgWAOsOg/8BdQm5AgDocv/oBgC0TLAAzSG0BrI9zSHDQUJDREVGR0hJSktMTU5PUFFSU1RV
VldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLw0KJDAwMCQ==

111:デフォルトの名無しさん
07/05/30 23:16:41
なんか最近いろんなスレで >>110 みたい書き込みを見るけど、
また掲示板に情報を書き込むタイプのウィルスでも流行ってる?

112:デフォルトの名無しさん
07/05/30 23:25:49
エンコードも知らんのかw

113:デフォルトの名無しさん
07/05/30 23:27:16
>>112
いや、base64だろうってことぐらいはわかるけど。
ん? エンコードかけてんのはただの馬鹿よけ?

114:デフォルトの名無しさん
07/06/19 00:33:45
カーネルの特定の部分をいじろうと思ってるんですが、
スーパーバイザーモードなときの話ってどっかにいい入門用の資料はないですかね?
x86でいいんですが。

115:デフォルトの名無しさん
07/06/19 01:32:47
はじめて読む486、じゃちょっと浅すぎるか

116:デフォルトの名無しさん
07/06/19 16:04:52
x86のアセンブリについて、助けてください。。。
XP付属のdebug.exeで勉強中です。
divニーモニックのところで躓きました。

-a 0100
3529:0100 mov ax, 000a
3529:0103 mov dx, 0003
3529:0106 div dx
3529:0108
-g =100 108

 実行すると、debug.exeが終了してしまいます。
多分、何か間違いがあるんだと思いますが、
いったい何がまずいのでしょうか。

axに商が、dxにあまりが入るものと思って書いているのですが。。。


117:デフォルトの名無しさん
07/06/19 19:07:24
商がでかくてaxレジスタに入らなくて例外が発生。

118:デフォルトの名無しさん
07/06/19 20:13:42
>>116
div dx だと dx:ax 割る dx = ax 余り dx になるから>>117のいうとおり例外が起きてるで正解。


119:116
07/06/20 21:19:07
>>117-118
ありがとうございました。
丁寧な解説のおかげで勘違いに気づけました。
「ax 割る dx」だとばかり。。。

予期せぬ空き時間ができたので、ここを見ながら勉強してました。
URLリンク(wisdom.sakura.ne.jp)

1文字ずつロードしてhello worldが出せたときは、久々に
コンピュータを使っていて楽しいと思えました。
さて、次は何を参考に勉強を進めようか。。。
いつまでもこの秋時間は続かないので、どこまで進むかわからないんですが。

120:デフォルトの名無しさん
07/08/01 01:31:45
初歩過ぎる質問なのですが
incとdecってどういう作業をするのでしょうか


121:デフォルトの名無しさん
07/08/01 03:32:21
++a;
--a;

122:デフォルトの名無しさん
07/09/06 21:02:45
その昔、VCはリリースモードでコンパイルすると、変数の並びが変わるから
アセンブラの勉強に使えない糞コンパイラとか言ってたあほがいたな。

123:デフォルトの名無しさん
07/09/18 16:15:39
age

124:デフォルトの名無しさん
07/09/18 22:27:43
>>122
あのメルマガか
お勧めが最適化の無い無料コンパイラでワロタ

125:デフォルトの名無しさん
07/09/30 14:47:12
INT 0x13でディスクへのRAW書き込みをするアセンブラ関数を作成して、
C言語(コンパイラ:BCC)から、その関数を使ってデータを書き込もうとしています。

その際に、データを引数でアドレス渡しでやろうとしているのですが、

ES:BX

へのデータのアドレス指定は、どうやったらいいのでしょうか?
Cから渡されてくるアドレスは32ビットなので、ここのアドレスの指定の仕方がわかりません・・・。

126:デフォルトの名無しさん
07/09/30 15:30:24
このスレで質問する大きなお友達が守るべき3つのおやくそく。

・質問するときはどの石についての質問であるか明記すること。
・マニュアルを参照すればわかる質問は極力しないこと。
・自己解決したときはその方法をきちんと報告すること。

127:デフォルトの名無しさん
07/09/30 15:44:32
BIOSコールは16bitモード以外では使うな。
以上。

128:125
07/09/30 15:48:56
すまそ
x86です。nasmとBCCでやろうとしています。
Cのソースで
char data[512];
func(data);
という形でnasmで作ったfuncをコールしようとしています。

funcでは
mov eax,[ESP+4]
でdataへのアドレスは取得できます。
このデータをINT 13hを使って、ディスクに書き込みたいのですが、
ES:BXにバッファのアドレスを指定する方法がわかりません。
mov eax,[ESP+4]
mov [addr],eax
mov es,[addr+2] ;ここでエラー
mov bx,[addr]

addr: db 0x00,0x00,0x00,0x00
とすると、デバッガで
mov es,[addr+2]
でセグメントを更新している!というメッセージが出ていて、ここで停止してしまいます。

129:125
07/09/30 15:51:34
>>127
32ビットモードではやっぱり使えないんでしょうか?

130:デフォルトの名無しさん
07/09/30 16:58:08
どうしても必要なら拡張INT13Hを使おう。
INT 13 拡張書き込み
AH = 0x43
AL = bir0 ベリファイフラグ(多分)
DL = ドライブ番号
DS:SI = ディスクアドレスパケットのアドレス

ディスクアドレスパケット(アセンブラ側で作業領域として確保)
0x00 BYTE パケット自身のサイズ (0x10 or 0x18)
0x01 BYTE 予約領域
0x02 WORD 転送ブロック数
0x04 DWORD 転送バッファ
0x08 QWORD 開始絶対ブロック番号
(以下オプション)
0x10 QWORD 転送バッファへのフラットな64bitアドレス(使うときは0x04をFFFFFFFFで埋めておく)


131:デフォルトの名無しさん
07/09/30 19:16:51
>>130
ありがとうございます!
拡張INT 13hで、資料漁ってみます!!!

132:デフォルトの名無しさん
07/10/06 12:41:13
>>128さん
そういう場合は、LES命令じゃありませんでしたっけ?
MOV命令で、メモリからセグメントレジスタへの直接ロードは、
出来ないと思いますよ。


133:デフォルトの名無しさん
07/10/06 13:35:33
それ以前に、bccとかデバッガ云々言ってることから、win32でやろうとしてるんじゃないだろうか。
根本的に間違ってる気がする。

134:デフォルトの名無しさん
07/10/15 17:59:38
プログラムの「前」ってどっちですか?

SAMPLE:
  move.l d0, #0  ← こっちが前?
  move.l d1, #1
L1:
  add.l d0, d1
  add.l d1, #1
  cmp.l d1, #10
  blt L1      ← こっちが前?
  rts


135:デフォルトの名無しさん
07/10/15 19:03:57
プログラムカウンタが進む方向

136:デフォルトの名無しさん
07/10/15 19:46:27
じゃぁ前方参照って?


137:デフォルトの名無しさん
07/10/15 20:01:12
そんな事も自分で考えられないのか?
小学校からやり直してこい

138:デフォルトの名無しさん
07/10/16 00:29:25
アセンブラでDOSプログラムやるなら便利そうなの見つけたので貼っておきます

URLリンク(reef.path.ne.jp)
の DOS.CHM です

139:デフォルトの名無しさん
07/10/21 10:54:20
Cから呼ばれる関数内でFPUを使う場合、
戻るときにレジスタスタックの深さを戻す必要ありますか?
それとも特に何も考えなくていいのでしょうか?

140:デフォルトの名無しさん
07/10/21 13:26:57
すみません宿題なのですがどなたか教えてください
次の実行結果を説明せよ。なぜそうなるか理由も書くこと。
という問題なのですがわかりません・・
お願いします・・
問1
CLR R0
ADD #1, RO
ADD #2, R0
ADD #3, R0
ADD #4, R0

問2
MOV #100, R1
CLR -(R1)
CLR -(R1)
CLR -(R1)
CLR -(R1)

問3
CLR @#100


141:デフォルトの名無しさん
07/10/21 20:42:35
誰か>>140教えてくださいお願いします・・・

142:デフォルトの名無しさん
07/10/21 20:59:58
本気で聞いてるのならせめてCPUの種類くらい書けや。

143:デフォルトの名無しさん
07/10/21 21:24:22
ニーモックみりゃわかるだろ糞虫

144:デフォルトの名無しさん
07/10/21 21:38:50
>>143
分からんだろ?

145:デフォルトの名無しさん
07/10/21 22:29:05
>>140
勉強したいのなら自分でやれ。
ヒントは命令表だ。にらめっこしながら自分で解け。

アセンブラを勉強するのなら、命令表を見るのは必須だ。
それすらせずに宿題を丸投げする馬鹿者は糞でも食って死ね。

146:デフォルトの名無しさん
07/10/21 22:51:37
>>140
勉強する気のない糞虫野郎はこれでももってとっとと消えろ。
問1
CLR R0 ;R0を0にする
ADD #1, RO ;R0に1を加算
ADD #2, R0 ;R0に2を加算
ADD #3, R0 ;R0に3を加算
ADD #4, R0 ;R0に4を加算
ここまでR0=1+2+3+4。糞の詰まった頭でじっくり考えろ。答えはいくつだ?
いいか、4じゃないぞ?ちゃんと指を折って数えるんだぞ?

問2
MOV #100, R1 ;R1に100を格納
CLR -(R1) ;R1を1サイズ分減算した内容が指すアドレスを0にする。
CLR -(R1) ;同上
CLR -(R1) ;同上
CLR -(R1) ;同上
1サイズが2バイトなら98,96,94,92番地の内容が0だ。
1サイズが1バイトや4バイトなら・・・あとはわかるな?

問3
CLR @#100 ;実効番地100の内容を0に
ここまで書けば、糞を食うしか能のないお前でも分かるだろう。

ところで、この問題、前にVIPあたりで見かけたことがあるんだが
釣りのつもりなのか?

147:デフォルトの名無しさん
07/10/21 23:54:55
>>142
>>144
それ、マジで言ってんの?ネタだよね?

148:デフォルトの名無しさん
07/10/22 00:01:42
分かる分からんではなく質問の仕方に問題があるつーこったろ。

149:デフォルトの名無しさん
07/10/22 00:38:15
ちなみに俺なら、
予想はできるが間違っている可能性を否定できないので分かるとは言わない。

150:デフォルトの名無しさん
07/10/22 09:43:59
>ADD #1, RO
このようなニーモニックのは俺はいじったことが無いな

151:デフォルトの名無しさん
07/10/22 09:54:06
レジスタR0…RISCプロセッサの何かかな?
何かの雑誌で見たような見てないような?


152:デフォルトの名無しさん
07/10/22 16:34:10
俺も同じ質問を前に見た記憶があるな。
PDP-11だっけ?



153:デフォルトの名無しさん
07/10/22 20:09:06
>>140
ここで回答されてるよ
URLリンク(m.oshiete1.goo.ne.jp)

154:デフォルトの名無しさん
07/10/22 20:54:38
>>152
同じ大学なんじゃね
アセンブラ… (゜□゜) ↑アッー!↓
スレリンク(tech板:614番)

155:デフォルトの名無しさん
07/10/22 21:57:36
そこら中にマルチしてるのか、それとも受講した学生が軒並み馬鹿ばっかだったのか・・・

156:デフォルトの名無しさん
07/10/23 11:17:19
後者。

157:デフォルトの名無しさん
07/10/23 20:00:11
結局、ROレジスタの謎だけが残ったのか・・・・

158:デフォルトの名無しさん
07/10/27 00:44:25
>>146
お前、ベジータか?

159:デフォルトの名無しさん
07/11/22 16:00:27
よ、よくわかったな・・・

160:デフォルトの名無しさん
07/11/24 04:23:05
mov ebx,eax

lea ebx,[eax]
って、ebxにロードされる値は同一ですか?

161:デフォルトの名無しさん
07/11/24 09:32:57
セグメントディスクリプタ(古いCPUだとセグメントレジスタ)の値によって変わる
もちろん同じになることもある


162:デフォルトの名無しさん
07/11/24 09:48:06
lea ebx, [eax * 2 + eax] で eax の3倍の値を入れたり。

163:デフォルトの名無しさん
07/11/24 10:03:25
猫娘のおフェラ~♪ww

URLリンク(userdisk.webry.biglobe.ne.jp)

164:デフォルトの名無しさん
07/11/24 12:04:16
通報しました

165:デフォルトの名無しさん
07/11/30 17:37:23
Windowsソフトの逆アセの中に

LEA EBX,DWORD PTR [EBX+00000000]

というのを見かけるんだけど、イマイチようわからん・・・なんじゃこりゃ?

166:デフォルトの名無しさん
07/11/30 17:55:17
入れろ EBX に 、32ビット値で 後述の番地から (EBXの中身 足す 00000000)

167:デフォルトの名無しさん
07/11/30 18:04:18
ひとつの命令でアラインメントするためだと思う


168:デフォルトの名無しさん
07/11/30 18:18:20
>>166
おい

169:デフォルトの名無しさん
07/11/30 18:20:53
>>166
それじゃMOV文じゃね?

>>167
う~ん、
AND EBX,-04
で良い様な気もしたんでね・・・。
ひょっとしてフラグかフラグなのか?

170:デフォルトの名無しさん
07/11/30 18:29:30
ANDだとフラグ変わっちゃう

171:デフォルトの名無しさん
07/11/30 18:31:29
フラグを変えたくなかったんだろという事で理解。
レスくれた人ありがとう。
先に進める事にします。

172:デフォルトの名無しさん
07/11/30 22:04:53
ループの分岐先を16byte境界に整列するために
コンパイラがNOPを挿入することがある

173:デフォルトの名無しさん
07/12/01 02:37:38
コンパイラ技術者のオナニー

174:デフォルトの名無しさん
07/12/02 16:50:59
ウチが見たのは整列するのに
INT 03
で埋まってたな。

テキストだと フ になるんだけど、並んでとなんかこう気持ち悪い。

175:デフォルトの名無しさん
07/12/02 17:03:44
プ

176:デフォルトの名無しさん
07/12/02 17:08:31
フフフフフフフフフフフフフフフ

177:デフォルトの名無しさん
07/12/02 17:53:42
VisualStudio2008って64bitのアセンブラ使えますか?

178:デフォルトの名無しさん
07/12/02 19:36:35
>>176
ガリでもくってろフフフ(ry

って、やめんかw

179:デフォルトの名無しさん
07/12/07 12:56:58
コォォォォォォォォ

180:デフォルトの名無しさん
07/12/07 22:14:24
ゴゴゴゴゴゴ

181:デフォルトの名無しさん
07/12/10 12:29:50
FLD DWORD PTR [00B8AFB7]

ロ-キック

182:デフォルトの名無しさん
07/12/12 15:04:33
C++なんかのクラス構造の逆アセ解析マンドクセ

183:デフォルトの名無しさん
07/12/12 15:33:42
「メモリのX番地以降にN個の符号付整数が格納 されている.これらの整数の絶対値を求めて, Y番地以降に順に格納するプログラムを作成せよ. データの個数NはN番地に格納されているものとする.」
という課題が出されているんだがサッパリ解らない
誰か助けてくれ

184:デフォルトの名無しさん
07/12/12 15:39:00
個数(N)を得るのに必要な情報である、格納アドレス(N)が必要だとなると、循環参照になるから絶対得られないのだが。
つーか、何のアセンブラの話なんだか。

185:デフォルトの名無しさん
07/12/12 15:41:46
>>183
>データの個数NはN番地に格納されている
これおかしいだろw

1. データの個数の取得
2. X番地からn個目のデータを読み出す
3. 絶対値を求める
4. そのままY番地からn個目に書き出す
5. N個終わるまで2,3,4を繰り返す

ここまで分解すればあとは1つ1つやっつけるだけだ。

186:デフォルトの名無しさん
07/12/12 15:41:28
すまんかった
COMETII/CASLIIだ

187:デフォルトの名無しさん
07/12/12 15:43:41
>>186
なんで>184の2行目しか読まないかねぇ……

188:デフォルトの名無しさん
07/12/12 15:44:04
すまんかった
COMETII/CASLIIだ

189:デフォルトの名無しさん
07/12/12 15:45:31
二重書き込みしてしまった・・・
>>185
とりあえず試行錯誤してみる
>>187
すまん、何を言っているのかすら解らなかったんだ

190:デフォルトの名無しさん
07/12/12 15:47:10
TEST START
LAD GR1,0
LOOP LD GR2,X,GR1
ST GR2,Y,GR1
LAD GR1,1,GR1
CPA GR1,N
JMI LOOP
RET
N DC 5
Y DS 5
X DC 3
DC 5
DC 8
DC 9
DC 7
END

ここまで書いたが、絶対値の求め方ってなんだっけ?

191:デフォルトの名無しさん
07/12/12 15:50:26
>>189
> 個数NはN番地に格納されている
って、私の住所は私の住んでいる所ですって言ってるようなものだ

192:デフォルトの名無しさん
07/12/12 15:58:24
>>191
なるほど、でも問題文そのままなんだよなぁ・・

193:デフォルトの名無しさん
07/12/12 16:06:48
>3. 絶対値を求める
これのやり方がわからない

194:デフォルトの名無しさん
07/12/12 16:12:37
まあ個数NのNは個数への名前付けであって個数がN個あるわけではないってのは常識的には分かるけどねw
「データの個数はN番地に格納されている」とかなら文句はたぶん出ない

195:デフォルトの名無しさん
07/12/12 16:15:26
>絶対値
負の数だったら0から引けばOK。アセンブラによっては符号反転のニモニックがあるかも知らん。
CASL知らんからCで書いておく。

signed foo;
if (foo < 0) foo = 0 - foo;
or
if (foo < 0) foo = -foo;


196:デフォルトの名無しさん
07/12/12 16:20:48
なるほど、つまり
>190に正だったらそのまま格納
負だったら0からその数を引けばいいんだな

197:デフォルトの名無しさん
07/12/12 16:23:18
>>193
CASLには符号反転命令はないから正負を判断して負なら0からその値を引く
1.正なら3へジャンプ
2.0から値を引く
3.
みたいな感じでいいんじゃまいか?

198:デフォルトの名無しさん
07/12/12 16:29:25
>>197

TEST START
LAD GR1,0
LOOP LAD GR3,0
LD GR2,X,GR1
CPA GR3,GR2
JMI MAINA
JPL HUTU
MAINA SUBA GR3,GR2
LAD GR2,GR3
HUTU ST GR2,Y,GR1
LAD GR1,1,GR1
CPA GR1,N
JMI LOOP
RET
N DC 5
Y DS 5
X DC 3
DC -5
DC 8
DC -9
DC 7
END

としてみたんだがエラーが発生してしまう・・・

199:デフォルトの名無しさん
07/12/12 16:43:20
>>198
LAD GR2,GR3
じゃなくて
LD GR2,GR3
じゃないかな?

あと、零の場合は0から引いても0なので
CPA GR3,GR2
JMI MAINA
JPL HUTU
MAINA SUBA GR3,GR2
LD GR2,GR3
HUTU ST GR2,Y,GR1

CPA GR3,GR2
JPL HUTU
SUBA GR3,GR2
LD GR2,GR3
HUTU ST GR2,Y,GR1
でもいいかも
アセンブルとか動作チェックとかして確かめていないが

200:199
07/12/12 16:58:06
見直すと比較が逆っぽい
CPA GR3,GR2
でなく
CPA GR2,GR3
かな

201:デフォルトの名無しさん
07/12/12 17:10:20
TEST START
LAD GR1,0
LOOP LAD GR3,0
LD GR2,X,GR1
CPA GR2,GR3
JPL HUTU
SUBA GR3,GR2
LD GR2,GR3
HUTU ST GR2,Y,GR1
CPA GR1,N
JMI LOOP
RET
N DC 5
Y DS 5
X DC 3
DC -5
DC 8
DC -9
DC 7
END


アセンブルではうまく言ったんだけど
無限ループしてしまった

202:デフォルトの名無しさん
07/12/12 17:17:05
TEST START
LAD GR1,0
LOOP LAD GR3,0
LD GR2,X,GR1
CPA GR2,GR3
JPL HUTU
SUBA GR3,GR2
LD GR2,GR3
HUTU ST GR2,Y,GR1
LAD GR1,1,GR1
CPA GR1,N
JMI LOOP
RET
N DC 5
Y DS 5
X DC 3
DC -5
DC 8
DC -9
DC 7
END

これで提出してみました
合格してるといいなぁ

203:デフォルトの名無しさん
07/12/12 17:19:54
>>201
HUTUの次の行の
LAD GR1,1,GR1
が抜けてる気がする

204:デフォルトの名無しさん
07/12/12 17:27:11
>>202
正負の判断で分岐させたくなければ
LAD GR1,0
LOOP LD GR2,X,GR1
LD GR3,GR2
SRA GR3,BWM1
ADDA GR2,GR3
XOR GR2,GR3
ST GR2,Y,GR1
LAD GR1,1,GR1
CPA GR1,N
JMI LOOP
...
BWM1 DC 15
みたいなのも
CASLIIのGR*って16ビット幅だったよね?

205:デフォルトの名無しさん
07/12/12 17:32:02
やったー、合格できた!
お前らのおかげだ!ありがとう!
>>202
あ、うん直前で気づいていれておいた
>>203
すまないが見たことの無い単語が出てきて解らない
16ビットなのは合ってるよ


さて、最後の課題だ
「メモリのDATA番地以降にN個の符号付整数が格納されている. 指標レジスタを用いて,これらの中の正の整数の合計を求め,結果 をSUM番地に格納するプログラムを作成せよ.データの個数NはN番地 に格納されているものとする.」
もう早速意味の解らない
data番地とか指標レジスタって日本語?

206:デフォルトの名無しさん
07/12/12 17:46:15
「メモリのDATA番地以降にn個の符号付整数が格納されている。
指標レジスタを用いて、これらの中の正の整数の合計を求め、結果 をSUM番地に格納するプログラムを作成せよ。
データの個数nはN番地 に格納されているものとする。」
とすると
こんな感じのメモリマップがあるって事か

SUM番地 [ ... ]
N番地 [ n ]
DATA+0番地 [ ... ]
DATA+1番地 [ ... ]
DATA+2番地 [ ... ]
...
DATA+(n-1)番地 [ ... ]


指標レジスタってのは while ループをレジスタで再現しるってだけジャマイカ?
x86とSHしか知らないから違うかもしれないけど。

207:デフォルトの名無しさん
07/12/12 17:46:42
xの絶対値はxが負なら(x+(-1))と(-1)の排他的論理和をとればいい
xが正なら(x+(0))と(0)の排他的論理和をとる
0と-1はxを右に15ビット算術シフトすれば出てくる

DATA番地も指標レジスタも日本語だw
DATA番地はN個の符号付整数が格納されているブロックの先頭の番地のラベルじゃないかな
指標レジスタはCASLIIの仕様書にちゃんと載ってるぞ

208:デフォルトの名無しさん
07/12/12 17:53:46
え、えーと つまり?
排他的論理和ってのを使えばいいのかな?

209:デフォルトの名無しさん
07/12/12 17:55:10
排他的論理和は先週の講義でやったなぁ
XORだよな?
っというかもうやっぱり問題文の日本語がわからない
なにをさせたいのかさっぱり

210:デフォルトの名無しさん
07/12/12 17:58:31
指標レジスタってのはインデッテクスレジスタのことか!

211:デフォルトの名無しさん
07/12/12 18:01:12
>>208
いや、素直に正か負で分岐して負の場合だけ0から引くとかにしておいた方がいいと思う
自分で書いててアレだが素直で見やすくて何をやっているかすぐに分かるコードの方が好きだ
ちなみに
LD GR3,GR2
SRA GR3,BWM1
で15ビット右にシフトした値をGR3に入れて
ADDA GR2,GR3
で元の値GR2に0か-1を足して
XOR GR2,GR3
で排他的論理和をとってGR2に入れている

212:デフォルトの名無しさん
07/12/12 18:04:31
あ、つまり
「メモリのDATA番地以降にN個の符号付整数が格納されている. 指標レジスタを用いて,これらの中の正の整数の合計を求め,結果 をSUM番地に格納するプログラムを作成せよ.データの個数NはN番地 に格納されているものとする.」
ではなくその前の課題についてだったのか

213:デフォルトの名無しさん
07/12/12 18:12:32
LD GR2,X,GR1
とかで既に指標レジスタとしてのGRレジスタの使い方をしているんじゃないか?
指標レジスタを用いてっていうのは、DATA番地以降にある整数に上のような方法でアクセスするってことじゃないか?
あとは
LDA GR3,0
LOOP GR2にデータを一つ入れる
CPA GR2,GR3 ; GR2と0を比較
JMI MAINA ; 負ならジャンプする
SUM番地にGR2を加算
MAINA ...
...
JMI LOOP
みたく正の場合だけ加算処理をする

>>212
すまん、混乱させてしまった

214:デフォルトの名無しさん
07/12/12 18:12:30
たったいま講義が終わった
最後の問題はクリアしてなくても帰れるみたいだ
今日はお前ら本当にありがとう

215:デフォルトの名無しさん
07/12/12 18:16:11
> SUM番地にGR2を加算
CASLはメモリをディスティネーションにする加算命令はなかったかも
途中の和を入れるためのレジスタを用意してループ中ではそれに加算して
最後にSUMにSTする形をとったほうがいいか

216:デフォルトの名無しさん
07/12/12 22:46:44
ところで、64-bitアセンブラのいい本ありませんか?

217:デフォルトの名無しさん
07/12/12 22:58:04
>>216
何を(どういうことを)勉強したいの?

218:デフォルトの名無しさん
07/12/12 23:34:20
x64のやさしい解説書が欲しいんですが。

219:デフォルトの名無しさん
07/12/12 23:43:07
x86-64 ? ...x64 とも言うのか。
まだなさげ?

220:デフォルトの名無しさん
07/12/13 00:59:12
>>218
ビットサイズだけじゃアセンブラが特定できん。

221:デフォルトの名無しさん
07/12/13 01:04:57
MASM8.0のまともな解説書とかありませんか?

222:デフォルトの名無しさん
07/12/13 01:07:45
>>221
5から大してかわってない。

223:デフォルトの名無しさん
07/12/13 01:31:01
fURLリンク(rtfm.mit.edu)
前何かで参考になった

224:デフォルトの名無しさん
07/12/13 05:36:47
MASM8.0のまともなマクロライブラリとかありませんか?

225:デフォルトの名無しさん
07/12/13 15:03:35
MASM って自分でカスタマイズするための言語だべ?
既存のライブラリでやるなら何もASMでやる必要は無いんじゃね?

226:デフォルトの名無しさん
07/12/13 16:44:57
MASMのマクロキットつったら、
アセンブラMACROSしか知らないなぁ。公開されたものは。
使ったことないけど。

これね。
URLリンク(www.vector.co.jp)

227:デフォルトの名無しさん
07/12/13 23:14:23
>>224
もし、一連の質問の同一人物なら、
質問に答えてもらったら・・・後はわかるな?

228:226
07/12/14 10:43:12

別にいいんじゃないか2チャソだし

ひろゆこ曰
URLリンク(www.asks.jp)

A :20xx/mm/dd hh:mm:ss
HDDの残り容量の調べ方を教えれ

>A B :20xx/mm/dd hh:mm:ss
df

こういう空間を良しと考えていたみたいだし
(個人的にはこのひろゆこのエントリにはいろいろツッコミたい点は覆いが)

229:デフォルトの名無しさん
07/12/19 14:22:19
214だがまた実験が始まった
前にも増して日本語なのか理解できないので助けて欲しい


【問題4-4-1】以下のリストは,シフト演算命令を使った乗算プログラムであり,5×164を求めている.リストの [ ] 部分を埋めて完成せよ.(ヒント)164を2のべき数の和に直す.

ラベル欄 命令コード オペランド欄
PGM7 START
LD GR1,DATA
SLA GR1,2
ST GR1,KOTAE
LD GR1,DATA
[ ] ;(GR1)×32
ADDA GR1,KOTAE
[ ] ;(GR1) -> KOTAE
[ ] ;GR1 <- (DATA)
[ ] ;(GR1)×128
[ ] ;GR1<-(GR1)+(KOTAE)
ST GR1,KOTAE
RET
DATA DC 5
KOTAE DS 1
END


ご助力頼む!

230:デフォルトの名無しさん
07/12/19 15:07:35
PGM7 START
LD GR1,DATA
SLA GR1,2
ST GR1,KOTAE
LD GR1,DATA
SLA GR1,5 ;(GR1)×32
ADDA GR1,KOTAE
ST GR1,KOTAE ;(GR1) -> KOTAE
LD GR1,DATA ;GR1 <- (DATA)
SLA GR1,7 ;(GR1)×128
ADDA GR1,KOTAE ;GR1<-(GR1)+(KOTAE)
ST GR1,KOTAE
RET
DATA DC 5
KOTAE DS 1
END

とりあえず自分でやってみた
どうだろうか

231:デフォルトの名無しさん
07/12/19 15:11:17
よし、合格できた
だが次の課題がもっと意味不明すぎる
誰か助けてくれ


【問題4-4-2】
(a)アドレスDATAの第15ビットから第8ビットまでの8ビットを取出し,残りを0とした情報をアドレスOPに格納し,
同じく第7ビットから第4ビットまでの4ビットを取出し,残りを0とした情報をアドレスGRに格納し,
さらに第3ビットから最後までの4ビットを取出し,残りを0とした情報をアドレスXRに格納するプログラムを以下のリストの [ ]を埋めて完成せよ.

ラベル欄 命令コード欄 オペランド欄
MASK START
LD GR0,DATA
[ ]
ST GR0,OP
L1 LD GR1,DATA
[ ]
ST GR1,GR
LD GR2,DATA
[ ]
ST GR2,XR
RET
DATA DC #3012
MASK1 DC #FF00
MASK2 DC [ ]
MASK3 DC [ ]
OP DS 1
GR DS 1
XR DS 1
END



232:デフォルトの名無しさん
07/12/19 15:21:17
MASK START
LD GR0,DATA
[ ]
ST GR0,OP
L1 LD GR1,DATA
[ ]
ST GR1,GR
LD GR2,DATA
[ ]
ST GR2,XR
RET
DATA DC #3012
MASK1 DC #FF00
MASK2 DC #00F0
MASK3 DC #000F
OP DS 1
GR DS 1
XR DS 1
END

ここまで自分で入れてみた

233:デフォルトの名無しさん
07/12/19 17:19:13
・・・コメント部分に答えが丸ごと書いてあるのにこれ以上どうしろと。

234:デフォルトの名無しさん
07/12/20 00:20:59
Intel Core2の1次、2次キャッシュって、何wayで、キャッシュブロックは何バイトでしょうか?


235:デフォルトの名無しさん
07/12/20 00:34:28
>>234
スレ違い。寧ろ鼬害かも。

236:デフォルトの名無しさん
07/12/20 00:52:16
>>235
日本語でおk

237:デフォルトの名無しさん
07/12/20 01:00:31
ヒト以外の生物は巣にお帰りください。

238:デフォルトの名無しさん
07/12/20 07:35:31
x86命令の所要クロック計測スレPart3
スレリンク(tech板)l50


239:デフォルトの名無しさん
07/12/20 16:38:17
mpeg compass.jp
名古屋駅近辺でお話しましょう

240:デフォルトの名無しさん
07/12/23 15:23:17
MMXで最大値を求めるには、どっちを使った方が良い?
pmaxubかpcmpgtb

後者の使い方がよくわからないorz

241:デフォルトの名無しさん
07/12/23 15:48:23
簡単な使い方としては結果を使ってANDしたりAND NOTしたり

242:デフォルトの名無しさん
07/12/23 22:42:50
初心者の質問です。
32bitレジスタにSSEレジスタの内容を書込む場合は、
どうしたら良いのでしょうか?
movapsを使って転送しようとしたところで落ちます。

movaps xmm0, [esi]
// ~処理~
movaps [ecx], xmm0 <-- ここで落ちる.

243:デフォルトの名無しさん
07/12/23 22:50:12
>> 242
自己レス、ごめんなさいループ条件を間違えていただけでした。

244:デフォルトの名無しさん
07/12/27 00:15:18
スクラッチレジスタってなんですか?

245:デフォルトの名無しさん
07/12/27 00:20:22
答えはWebで
URLリンク(www.google.co.jp)

246:デフォルトの名無しさん
07/12/27 03:29:12
レジスタで何を対決させるんだろう?

247:デフォルトの名無しさん
07/12/27 09:47:32
jumpとbranchはどう違いますか?

248:デフォルトの名無しさん
07/12/27 10:24:20
命令語と動作が違う。
具体的な違いは石に依存するので種類を明記しない質問にはこれ以上答えようがない。

249:デフォルトの名無しさん
07/12/27 13:11:10
条件分岐がbra だったり 相対アドレッシングでの分岐がbra だったり
逆だったり

250:デフォルトの名無しさん
07/12/27 14:28:29
Cで作成した、プログラムを逆アセンブルしてみると
and $0xfffffff0,%esp
って記述が必ずあるんだが、これはなんのためにやってるの?

251:デフォルトの名無しさん
07/12/27 14:42:11
>>250
ローカル変数をメモリ上でアライメントするため、
だと思われる。


252:デフォルトの名無しさん
07/12/29 14:50:54
>>251
アライメント?
wikiでみたら、データを特定のサイズに調節することって書いてあるんだが
意味がわからない
int型だと2バイトcharだと1バイト見たいなのが関係してんの?

253:デフォルトの名無しさん
07/12/29 14:58:10
>>252
URLリンク(www5d.biglobe.ne.jp)

254:デフォルトの名無しさん
07/12/29 22:04:47
>>252
「32ビット整数を格納するときはアドレスが4の倍数でないとすごくアク
セスが遅くなる」とか聞いたことないかい?

いまのx86は最大で128ビットのXMMレジスタまであるので、とりあえず
アドレスを16の倍数にしておけばどんなデータも遅くならない。



255:デフォルトの名無しさん
07/12/29 22:57:54
バスがエラーだ電車を使え

256:デフォルトの名無しさん
07/12/31 01:35:07
4の倍数で数字を格納しないと、2回読み込みしたり、エラーが起きたりするから
and演算でespレジスタに格納されてるアドレスの最下位の値を0にしてるって考えていいの?

257:デフォルトの名無しさん
07/12/31 05:35:56
その理解で合ってます。もっと昔は、「参照番地が4の倍数でない」 というだけで実行時エラー
になったりしたものだが、後にいくらか親切になって、半端なアドレスのときは回路が二度読み
してくれるようになった。その分実行が遅くなるので、高速が要求される場面では参照アドレスが
4の倍数になるようにコードで保証するテクニックです。

258:デフォルトの名無しさん
07/12/31 08:48:16
>>257
>になったりしたものだが、後にいくらか親切になって、半端なアドレスのときは回路が二度読み
真ん中辺が禿げ上がるほど大間違い。

259:デフォルトの名無しさん
07/12/31 10:10:41
ダンゴさんの鋭い解説が期待されるところだ

260:デフォルトの名無しさん
07/12/31 11:40:52
68Kなど、他の16bitCPUにはそういうアライメントのミスで実行時エラーというのは実在したが

x86という書き方をするけど、実は初期のIBM-PC のデータバスは8ビットで 8086ではなく8088だった。
だから、昔はワードデータが奇数番地から始まろうが偶数番地から始まろうが関係なかった。

そんなわけでx86シリーズに限るとアライメントミスで実行時エラーになることはなかった。

261:デフォルトの名無しさん
07/12/31 11:43:37
MIPSやSPARCは無視ですか

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でディレイを
作りました。割り込みを使う方法も知りたければその旨書いてね。


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