アセンブラを勉強しよう
レス数が1000を超えています。これ以上書き込みはできません。
00011 ◆LrnSVKDHBg
2007/03/03(土) 19:00:320002デフォルトの名無しさん
2007/03/03(土) 19:02:430003デフォルトの名無しさん
2007/03/03(土) 19:03:24すいませんわかりませんwwwwwwwww
00041 ◆LrnSVKDHBg
2007/03/03(土) 19:08:40とりあえずおさらいというかメモ
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;
0005デフォルトの名無しさん
2007/03/03(土) 19:08:500006デフォルトの名無しさん
2007/03/03(土) 19:11:090007デフォルトの名無しさん
2007/03/03(土) 19:11:19and命令
and eax, ebx
eax &= ebx;
or命令
or eax, ebx
eax |= ebx;
xor命令
xor eax, ebx
eax ^= ebx;
0008デフォルトの名無しさん
2007/03/03(土) 19:12:17lha $500
clc
adc $501
sta $502
00091 ◆LrnSVKDHBg
2007/03/03(土) 19:13:01not 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;
0010デフォルトの名無しさん
2007/03/03(土) 19:16:00not命令
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;
00111 ◆LrnSVKDHBg
2007/03/03(土) 19:24:50正確には逆アセンブリなんだ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;
00121 ◆LrnSVKDHBg
2007/03/03(土) 19:30:15C使いだが+=とか-=はある時期から使わなくなっただけだ。
その辺は好みの問題だからな。後アセンブリに関してはまったくの無知で一からの勉強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)
00131 ◆LrnSVKDHBg
2007/03/03(土) 19:33:56JE 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;
}
0014デフォルトの名無しさん
2007/03/03(土) 19:36:18ぜんぜん汎用レジスタが足りませんorz
0015デフォルトの名無しさん
2007/03/03(土) 19:37:540016デフォルトの名無しさん
2007/03/03(土) 19:38:10構造化マクロっちゅーものもあってな、ゲフ
00171 ◆LrnSVKDHBg
2007/03/03(土) 19:38:37loop間違ってた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)
00181 ◆LrnSVKDHBg
2007/03/03(土) 19:44:07pushf
フラグレジスタをスタックへ退避する(使用用途がよくわからんが関数呼び出し時の退避のため?)
popf命令、 popfd命令
popf
フラグレジスタをスタックから復帰する(使用用途がよくわからんがreturn後のフラグ復帰の為?)
call START
WndProc(....);
ret命令
ret
サブルーチンから復帰する
オペランドが渡されていたらそのオペランドのバイト数だけ
スタックのデータを捨ててから復帰するらしい。
return Result;
rcl命令
rcl eax
CFフラグを含めたビットの左回転
よくわからんwwwwww
0019デフォルトの名無しさん
2007/03/03(土) 19:46:48mul 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
00201 ◆LrnSVKDHBg
2007/03/03(土) 19:48:43rol eax
ビットの左回転
しるかwwwwwwwww
ror命令
ror eax
ビットの右回転
しるかwwwwwwwwwww
sal命令、 shl命令
sal eax
ビットの左シフト
sar命令
sar eax
最上位ビットの変化がない右シフト
shr命令
ビットの論理右シフト(最上位に0)
疲れた
00221 ◆LrnSVKDHBg
2007/03/03(土) 19:54:28MOV DWORD PTR SS:[ESP+4], EDXの意味がわからない
これはULONG型のPTR(?)のSSレジスタのESP+4(アドレスだと思う)にEDXの
値を代入?って意味でいいんだろうかwwwwwww
そもそもPTRってなんだよちくしょうが!!!!!!
0023デフォルトの名無しさん
2007/03/03(土) 20:00:00cmp 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;
0024デフォルトの名無しさん
2007/03/03(土) 20:02:44push命令
push eax
esp -= 4;
*esp = eax;
か。
00251 ◆LrnSVKDHBg
2007/03/03(土) 20:06:11EDX = 0x00000002
ESP = 0x0012F9E8
�@MOV DWORD PTR SS:[ESP+4],EDX
�AMOV BYTE PTR SS:[ESP+8],0
�BMOV DWORD PTR SS:[ESP+C],EAX
�CMOV BYTE PTR SS:[ESP+10],0
この場合
0x0012F9E8 + 4 = 0x00000002
0x0012F9E8 + 8 = 0x00
0x0012F9E8 + 12 = 0x00000028
0x0012F9EB + 16 = 0x00
という解釈でいいのかな?
つまり4バイトの配列にそれぞれの値を代入してるのか。
でもなんで0代入の時はBYTEなんだろう・・・
0026デフォルトの名無しさん
2007/03/03(土) 20:06:14div命令
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
0027デフォルトの名無しさん
2007/03/03(土) 20:07:23call 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;
00291 ◆LrnSVKDHBg
2007/03/03(土) 20:11:30メモリのアドレスの中身を示しているのかな?
後LEA命令ってのがよくわからんが・・
0030デフォルトの名無しさん
2007/03/03(土) 20:12:54rol命令
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 */
0031デフォルトの名無しさん
2007/03/03(土) 20:16:25esp は 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;
こうだな。
00321 ◆LrnSVKDHBg
2007/03/03(土) 20:17:11signedつきかつきじゃないかで変換される機械語が違ってくるのか
LEAはアドレス代入って奴か
ESP = 0x0012F9E8
LEA EAX,DWORD PTR SS:[ESP+4]という命令があるとすると
ESPの値が0x0012F9ECになるって事なのかな恐らく。
00331 ◆LrnSVKDHBg
2007/03/03(土) 20:20:29そんなポインタの嵐を使われてもwwwwwwww
俺のスキルを考えてくれorz
esp -= 4; *(char**)esp = eip; eip = START;
はespが0x40000000とすると
(char*)esp = 0x4000004
(char**)esp = 0x40000008
*(char**)esp = 0x40000008の中身って事かぐらい?
みたいな漠然としたものしかわからねぇw
0034デフォルトの名無しさん
2007/03/03(土) 20:25:11MOV 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 を通して参照することがある。
0035デフォルトの名無しさん
2007/03/03(土) 20:26:46signed か unsigned かで機械語が変わってくるかどうかはコンパイラ依存。
あまりあてにはしない方がいい。
0036デフォルトの名無しさん
2007/03/03(土) 20:28:54この程度のポインタを理解できないようで
C 使いというのもどうかとは思うが、
まあアセンブリ言語を使う事によって
ポインタに対する理解も深まるだろう。多分。
というか、全然ポインタ分かってないな。
このキャストでアドレスは変わんないよ、普通の環境なら。
0037デフォルトの名無しさん
2007/03/03(土) 20:30:50だって、C じゃ表現しきれない事だって多いし、
C の理解がその程度じゃむしろ誤解しそうで怖い。
おとなしく、本でも読んだ方がいいと思うぜ。
00381 ◆LrnSVKDHBg
2007/03/03(土) 20:33:39ものすごく漠然とだが見えてきた気がするw
配列に値を格納して言ってる感じかぁ
>>35
その辺の処理系についてはまだ俺には遠い世界。。
>>36
バカヤロウ!!!この程度のスキルしかないから勉強してるんだろうが!!!!!
0039デフォルトの名無しさん
2007/03/03(土) 20:43:07俺もアセンブリ言語を通してポインタの理解を深めたクチだから、
悪い選択じゃないと思う。
なあに、分かってしまえば大したことは無いさ。
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 な。
0040デフォルトの名無しさん
2007/03/03(土) 20:45:24mov dword ptr [eax], edx
|0x12031000|0x12031001|0x12031002|0x12031003|
| edx |
な。
まあ、分かるとは思うが。
0041デフォルトの名無しさん
2007/03/03(土) 21:03:44ttp://www.intel.com/products/processor/manuals/index.htm
00421 ◆LrnSVKDHBg
2007/03/03(土) 21:06:42ふむ。
因みに(char*)eaxっていうのはchar型のポインタアドレスを
明示的に表しているっていう解釈でいいのかな?
つまり(char**)eaxの場合char型のアドレスを格納している
ポインタアドレスであって*(char**)はアドレスの先のアドレスの中身を
参照sd;gkjf;あwぇ;あ
char **pAddr;
char *string = "asm";
pAddr = string;
pAddrはpAddrのアドレス?
*pAddrはstringのアドレス?
**pAddrはstringアドレスの中身?
こういう解釈か!!!!
とりあえず腹が減っては戦はできないので何か食べてくる。
0043デフォルトの名無しさん
2007/03/03(土) 21:08:38char **pAddr;
char *string = "asm";
pp = &string;
pAddr は string のアドレス。
*pAddr は string と同じ。
**pAddr は 'a' 。
0044デフォルトの名無しさん
2007/03/03(土) 21:09:18pAddr = &string;
だ。
0045デフォルトの名無しさん
2007/03/03(土) 21:11:20PCHAR *pAddr;
PCHAR string = "asm";
pAddr = &string;
pAddr は string のアドレス。
*pAddr は string と同じ。
と
int *pAddr;
int string = 0;
pAddr = &string;
pAddr は string のアドレス。
*pAddr は string と同じ。
を比較すればいい。
全く同じ事。
00461 ◆LrnSVKDHBg
2007/03/03(土) 21:37:50まあまて。
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'という
解釈でいいんだろうか。だとすると納得。
00481 ◆LrnSVKDHBg
2007/03/03(土) 23:35:49SAR ESI, 1
が何でESI = 0x00000013になるんだろう。
00491 ◆LrnSVKDHBg
2007/03/03(土) 23:41:410050デフォルトの名無しさん
2007/03/04(日) 02:51:050051デフォルトの名無しさん
2007/03/04(日) 07:13:15なんでx86見たいな変態アーキテクチャでアセンブラ勉強しようと思ったんだ?
マゾなのか?
0052デフォルトの名無しさん
2007/03/04(日) 10:23:19x を右へ n だけシフトすれば
x / (2 の n 乗) になるのは常識。
2進シフトで分かりにくければ、
10進シフトで考えてみるといい。
31239832 を右に2桁シフトすれば 312398 になる。
これは 31239832 / 100 でしょ?
0053デフォルトの名無しさん
2007/03/04(日) 10:24:40浮動小数点数でググればいくらでも出てくる。
0054デフォルトの名無しさん
2007/03/04(日) 10:25:250055デフォルトの名無しさん
2007/03/04(日) 11:42:56ぜんぜん問題ない。
86アーキを理解したいなら別だが、
それは言語とは別問題だ。
0056デフォルトの名無しさん
2007/03/04(日) 12:25:38たとえばどれ?
0057デフォルトの名無しさん
2007/03/04(日) 14:05:23上から全部読んでいけ。
IEEE754 ってのがそれだ。
0058デフォルトの名無しさん
2007/03/04(日) 14:59:35餌を与えると自分で餌を探そうとする意思をなくす。
0059デフォルトの名無しさん
2007/03/05(月) 06:32:37俺としては、シミュレータも揃っててサンプルコードの多いCASLII辺りの方がお勧めだがな
0060デフォルトの名無しさん
2007/03/05(月) 07:36:38そのページを参照すればx86で浮動小数点演算をアセンブラで書けることを証明してください。
0061デフォルトの名無しさん
2007/03/05(月) 07:46:320062デフォルトの名無しさん
2007/03/05(月) 07:51:540063デフォルトの名無しさん
2007/03/05(月) 10:41:59何このCも碌に判っていない癖にC使いとかほざいている>>1…
アセンブラを勉強する以前にやるべきことが腐るほどありそうだ。
0064デフォルトの名無しさん
2007/03/05(月) 18:05:040065デフォルトの名無しさん
2007/03/05(月) 21:01:5168000とかH8とかARM7あたりならガリガリ書けるぞ。
0066デフォルトの名無しさん
2007/03/05(月) 22:36:06Cコンパイラに-Sオプションでも付けて
各CPUのソースを「同一のCソースから」生成してみると
かなりおもしろいという事を発見できる。
まずはgcc使って遊べ。
0067デフォルトの名無しさん
2007/03/05(月) 23:13:250068デフォルトの名無しさん
2007/03/05(月) 23:49:19最初からasmで考えないと。
0069デフォルトの名無しさん
2007/03/06(火) 00:17:02ああ、fadd とかそういう話か。
>>41 のマニュアルでも見れば?
0070デフォルトの名無しさん
2007/03/06(火) 18:00:51http://www.intel.com/jp/developer/download/
0071デフォルトの名無しさん
2007/03/06(火) 19:38:560072デフォルトの名無しさん
2007/03/06(火) 22:45:10あ?マイコンのほうが環境は揃いやすいですよ?
多少の出費があってもよければx86よりポケコンのほうが
純粋にアセンブラを学べる
0073デフォルトの名無しさん
2007/03/06(火) 22:56:51今時持ってるのは工業高校の生徒くらいだろ。
0074デフォルトの名無しさん
2007/03/06(火) 22:58:260075デフォルトの名無しさん
2007/03/06(火) 23:14:26VC++ Express Edition で
デバッガの混合モードや
インラインアセンブラを使えばいいだけ。
0076デフォルトの名無しさん
2007/03/06(火) 23:22:53それじゃ揃いやすいとは言えんだろ
0077デフォルトの名無しさん
2007/03/06(火) 23:33:01誰もそんなことは言ってない
0078デフォルトの名無しさん
2007/03/06(火) 23:33:43標準搭載してない
0079デフォルトの名無しさん
2007/03/06(火) 23:40:570080デフォルトの名無しさん
2007/03/07(水) 00:07:150081デフォルトの名無しさん
2007/03/07(水) 06:02:21Winでx86の最初の環境としては最良だよな
標準搭載だし
0082デフォルトの名無しさん
2007/03/07(水) 09:12:21VC++ についてるってだけだっけ?
0083デフォルトの名無しさん
2007/03/07(水) 18:30:08>>50は
「浮動小数点演算について説明したページ」ではなく
「浮動小数点演算についてわかりやすく説明したページ」を聞いているのだから。
検索で出てきたものが全て「わかりやすく説明したページ」であるはずがない。
0084デフォルトの名無しさん
2007/03/07(水) 20:11:290085デフォルトの名無しさん
2007/03/07(水) 20:29:53そんぐらい自分で探せよ。
0086デフォルトの名無しさん
2007/03/07(水) 23:25:22ttp://pc.nikkeibp.co.jp/pc21/special/gosa/eg4.shtml
0087デフォルトの名無しさん
2007/03/08(木) 04:28:280088デフォルトの名無しさん
2007/03/13(火) 16:21:38インラインアセンブラにもなってなくてorz
0089デフォルトの名無しさん
2007/03/13(火) 20:39:36こちらへどうぞ
アセンブラ… (゜□゜) ↑アッー!↓
http://pc11.2ch.net/test/read.cgi/tech/1148402614/l50
0090デフォルトの名無しさん
2007/03/16(金) 20:36:19OR AX, AX
と
CMP AX, 0
は同義だということをネットで見たのですが、意味がわかりませんでした。
また、OR命令はフラグレジスタのゼロフラグに影響を与えないと思ってたの
ですが、どうなのでしょうか?
0091デフォルトの名無しさん
2007/03/16(金) 20:40:33まずはIntelのサイトに言って「IA-32 インテル アーキテクチャ
ソフトウェア・デベロッパーズ・マニュアル」を全部ダウンロードしなさい。
0092デフォルトの名無しさん
2007/03/16(金) 20:41:10○行って
0093デフォルトの名無しさん
2007/03/16(金) 21:12:41ありがとうございます。
なるほど思い切り書いてありました。。
ナットクです。
0094デフォルトの名無しさん
2007/03/21(水) 00:23:200095デフォルトの名無しさん
2007/04/11(水) 04:05:260096デフォルトの名無しさん
2007/04/11(水) 15:10:03命令が27個でアドレッシングモードが7つ、レジスタが16個って16bitCPUのをな!!
0097デフォルトの名無しさん
2007/04/12(木) 13:36:24そのネタが全く分からない俺はここに居るべきじゃないんだろうな…
0098デフォルトの名無しさん
2007/04/28(土) 23:10:48ttp://www.inf.ie.kanagawa-u.ac.jp/uchida/eCASL/index.html
0099デフォルトの名無しさん
2007/05/09(水) 04:06:24全くわけわからん。。。
一応C++、Javaなどは仕事で使ってきたからある程度はわかっているつもりだけど
アセンブラでメモリの内容書き換えたり、Jumpしたりして一体何がどうなるのか???
つながりが全くわからない俺はどこから手をつけたらいいんでしょうか。
0100デフォルトの名無しさん
2007/05/09(水) 05:25:04>>98
見て勉強したら?
0101デフォルトの名無しさん
2007/05/09(水) 12:13:49SIMD弄ってみたら?
0102デフォルトの名無しさん
2007/05/09(水) 13:11:090103デフォルトの名無しさん
2007/05/09(水) 14:58:36レスサンクス。まずはC++からアセンブリコード出力させるとこからやってみるわー。
0104デフォルトの名無しさん
2007/05/09(水) 15:26:060105デフォルトの名無しさん
2007/05/09(水) 18:41:190106デフォルトの名無しさん
2007/05/09(水) 21:29:40つ[gcc -g -S]
0107デフォルトの名無しさん
2007/05/10(木) 02:26:25そこ何度やっても
www.inf.ie.kanagawa-u.ac.jp のサーバからの応答が一定時間以内に返ってきませんでした。
ってなってつながらないんだが、どうしてだろう?
0108デフォルトの名無しさん
2007/05/11(金) 03:07:51じゃない?
0109デフォルトの名無しさん
2007/05/20(日) 16:10:03学習は済んだのか?
0110デフォルトの名無しさん
2007/05/30(水) 18:26:16FhMC0BYSAtHW0CYUAtAWEwLQFhIC0dbQJhQC0BYTAtAWEgLR1tAmFALQFhMC0BYSAtHW0CYUAtAW
EwLQFhIC0dbQJhQC0BYTAtAWEgLR1rQGipTPAc0h4p/Dg/8DdQm0CboSAs0h6yGD/wJ1DrkDAOiF
/+gZAOgWAOsOg/8BdQm5AgDocv/oBgC0TLAAzSG0BrI9zSHDQUJDREVGR0hJSktMTU5PUFFSU1RV
VldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLw0KJDAwMCQ==
0111デフォルトの名無しさん
2007/05/30(水) 23:16:41また掲示板に情報を書き込むタイプのウィルスでも流行ってる?
0112デフォルトの名無しさん
2007/05/30(水) 23:25:490113デフォルトの名無しさん
2007/05/30(水) 23:27:16いや、base64だろうってことぐらいはわかるけど。
ん? エンコードかけてんのはただの馬鹿よけ?
0114デフォルトの名無しさん
2007/06/19(火) 00:33:45スーパーバイザーモードなときの話ってどっかにいい入門用の資料はないですかね?
x86でいいんですが。
0115デフォルトの名無しさん
2007/06/19(火) 01:32:470116デフォルトの名無しさん
2007/06/19(火) 16:04:52XP付属の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にあまりが入るものと思って書いているのですが。。。
0117デフォルトの名無しさん
2007/06/19(火) 19:07:240118デフォルトの名無しさん
2007/06/19(火) 20:13:42div dx だと dx:ax 割る dx = ax 余り dx になるから>>117のいうとおり例外が起きてるで正解。
0119116
2007/06/20(水) 21:19:07ありがとうございました。
丁寧な解説のおかげで勘違いに気づけました。
「ax 割る dx」だとばかり。。。
予期せぬ空き時間ができたので、ここを見ながら勉強してました。
ttp://wisdom.sakura.ne.jp/programming/asm/index.html
1文字ずつロードしてhello worldが出せたときは、久々に
コンピュータを使っていて楽しいと思えました。
さて、次は何を参考に勉強を進めようか。。。
いつまでもこの秋時間は続かないので、どこまで進むかわからないんですが。
0120デフォルトの名無しさん
2007/08/01(水) 01:31:45incとdecってどういう作業をするのでしょうか
0121デフォルトの名無しさん
2007/08/01(水) 03:32:21--a;
0122デフォルトの名無しさん
2007/09/06(木) 21:02:45アセンブラの勉強に使えない糞コンパイラとか言ってたあほがいたな。
0123デフォルトの名無しさん
2007/09/18(火) 16:15:390124デフォルトの名無しさん
2007/09/18(火) 22:27:43あのメルマガか
お勧めが最適化の無い無料コンパイラでワロタ
0125デフォルトの名無しさん
2007/09/30(日) 14:47:12C言語(コンパイラ:BCC)から、その関数を使ってデータを書き込もうとしています。
その際に、データを引数でアドレス渡しでやろうとしているのですが、
ES:BX
へのデータのアドレス指定は、どうやったらいいのでしょうか?
Cから渡されてくるアドレスは32ビットなので、ここのアドレスの指定の仕方がわかりません・・・。
0126デフォルトの名無しさん
2007/09/30(日) 15:30:24・質問するときはどの石についての質問であるか明記すること。
・マニュアルを参照すればわかる質問は極力しないこと。
・自己解決したときはその方法をきちんと報告すること。
0127デフォルトの名無しさん
2007/09/30(日) 15:44:32以上。
0128125
2007/09/30(日) 15:48:56x86です。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]
でセグメントを更新している!というメッセージが出ていて、ここで停止してしまいます。
0129125
2007/09/30(日) 15:51:3432ビットモードではやっぱり使えないんでしょうか?
0130デフォルトの名無しさん
2007/09/30(日) 16:58:08INT 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で埋めておく)
0131デフォルトの名無しさん
2007/09/30(日) 19:16:51ありがとうございます!
拡張INT 13hで、資料漁ってみます!!!
0132デフォルトの名無しさん
2007/10/06(土) 12:41:13そういう場合は、LES命令じゃありませんでしたっけ?
MOV命令で、メモリからセグメントレジスタへの直接ロードは、
出来ないと思いますよ。
0133デフォルトの名無しさん
2007/10/06(土) 13:35:33根本的に間違ってる気がする。
0134デフォルトの名無しさん
2007/10/15(月) 17:59:38SAMPLE:
move.l d0, #0 ← こっちが前?
move.l d1, #1
L1:
add.l d0, d1
add.l d1, #1
cmp.l d1, #10
blt L1 ← こっちが前?
rts
0135デフォルトの名無しさん
2007/10/15(月) 19:03:570136デフォルトの名無しさん
2007/10/15(月) 19:46:270137デフォルトの名無しさん
2007/10/15(月) 20:01:12小学校からやり直してこい
0138デフォルトの名無しさん
2007/10/16(火) 00:29:25http://reef.path.ne.jp/~hero/hero.htm
の DOS.CHM です
0139デフォルトの名無しさん
2007/10/21(日) 10:54:20戻るときにレジスタスタックの深さを戻す必要ありますか?
それとも特に何も考えなくていいのでしょうか?
0140デフォルトの名無しさん
2007/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
0141デフォルトの名無しさん
2007/10/21(日) 20:42:350142デフォルトの名無しさん
2007/10/21(日) 20:59:580143デフォルトの名無しさん
2007/10/21(日) 21:24:220144デフォルトの名無しさん
2007/10/21(日) 21:38:50分からんだろ?
0145デフォルトの名無しさん
2007/10/21(日) 22:29:05勉強したいのなら自分でやれ。
ヒントは命令表だ。にらめっこしながら自分で解け。
アセンブラを勉強するのなら、命令表を見るのは必須だ。
それすらせずに宿題を丸投げする馬鹿者は糞でも食って死ね。
0146デフォルトの名無しさん
2007/10/21(日) 22:51:37勉強する気のない糞虫野郎はこれでももってとっとと消えろ。
問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あたりで見かけたことがあるんだが
釣りのつもりなのか?
0148デフォルトの名無しさん
2007/10/22(月) 00:01:420149デフォルトの名無しさん
2007/10/22(月) 00:38:15予想はできるが間違っている可能性を否定できないので分かるとは言わない。
0150デフォルトの名無しさん
2007/10/22(月) 09:43:59このようなニーモニックのは俺はいじったことが無いな
0151デフォルトの名無しさん
2007/10/22(月) 09:54:06何かの雑誌で見たような見てないような?
0152デフォルトの名無しさん
2007/10/22(月) 16:34:10PDP-11だっけ?
0153デフォルトの名無しさん
2007/10/22(月) 20:09:06ここで回答されてるよ
http://m.oshiete1.goo.ne.jp/search/eturan3.php3?qid=3431805&cid=709&keyword=&start=9
0154デフォルトの名無しさん
2007/10/22(月) 20:54:38同じ大学なんじゃね
アセンブラ… (゜□゜) ↑アッー!↓
http://pc11.2ch.net/test/read.cgi/tech/1148402614/614
0155デフォルトの名無しさん
2007/10/22(月) 21:57:360156デフォルトの名無しさん
2007/10/23(火) 11:17:190157デフォルトの名無しさん
2007/10/23(火) 20:00:110158デフォルトの名無しさん
2007/10/27(土) 00:44:25お前、ベジータか?
0159デフォルトの名無しさん
2007/11/22(木) 16:00:270160デフォルトの名無しさん
2007/11/24(土) 04:23:05と
lea ebx,[eax]
って、ebxにロードされる値は同一ですか?
0161デフォルトの名無しさん
2007/11/24(土) 09:32:57もちろん同じになることもある
0162デフォルトの名無しさん
2007/11/24(土) 09:48:060163デフォルトの名無しさん
2007/11/24(土) 10:03:25ttp://userdisk.webry.biglobe.ne.jp/002/078/73/N000/000/000/117897859702816119025.jpg
0164デフォルトの名無しさん
2007/11/24(土) 12:04:160165デフォルトの名無しさん
2007/11/30(金) 17:37:23LEA EBX,DWORD PTR [EBX+00000000]
というのを見かけるんだけど、イマイチようわからん・・・なんじゃこりゃ?
0166デフォルトの名無しさん
2007/11/30(金) 17:55:170167デフォルトの名無しさん
2007/11/30(金) 18:04:180168デフォルトの名無しさん
2007/11/30(金) 18:18:20おい
0169デフォルトの名無しさん
2007/11/30(金) 18:20:53それじゃMOV文じゃね?
>>167
う〜ん、
AND EBX,-04
で良い様な気もしたんでね・・・。
ひょっとしてフラグかフラグなのか?
0170デフォルトの名無しさん
2007/11/30(金) 18:29:300171デフォルトの名無しさん
2007/11/30(金) 18:31:29レスくれた人ありがとう。
先に進める事にします。
0172デフォルトの名無しさん
2007/11/30(金) 22:04:53コンパイラがNOPを挿入することがある
0173デフォルトの名無しさん
2007/12/01(土) 02:37:380174デフォルトの名無しさん
2007/12/02(日) 16:50:59INT 03
で埋まってたな。
テキストだと フ になるんだけど、並んでとなんかこう気持ち悪い。
0175デフォルトの名無しさん
2007/12/02(日) 17:03:440176デフォルトの名無しさん
2007/12/02(日) 17:08:310177デフォルトの名無しさん
2007/12/02(日) 17:53:420178デフォルトの名無しさん
2007/12/02(日) 19:36:35ガリでもくってろフフフ(ry
って、やめんかw
0179デフォルトの名無しさん
2007/12/07(金) 12:56:580180デフォルトの名無しさん
2007/12/07(金) 22:14:240181デフォルトの名無しさん
2007/12/10(月) 12:29:50で
ロ-キック
0182デフォルトの名無しさん
2007/12/12(水) 15:04:330183デフォルトの名無しさん
2007/12/12(水) 15:33:42という課題が出されているんだがサッパリ解らない
誰か助けてくれ
0184デフォルトの名無しさん
2007/12/12(水) 15:39:00つーか、何のアセンブラの話なんだか。
0185デフォルトの名無しさん
2007/12/12(水) 15:41:46>データの個数NはN番地に格納されている
これおかしいだろw
1. データの個数の取得
2. X番地からn個目のデータを読み出す
3. 絶対値を求める
4. そのままY番地からn個目に書き出す
5. N個終わるまで2,3,4を繰り返す
ここまで分解すればあとは1つ1つやっつけるだけだ。
0186デフォルトの名無しさん
2007/12/12(水) 15:41:28COMETII/CASLIIだ
0187デフォルトの名無しさん
2007/12/12(水) 15:43:41なんで>184の2行目しか読まないかねぇ……
0188デフォルトの名無しさん
2007/12/12(水) 15:44:04COMETII/CASLIIだ
0189デフォルトの名無しさん
2007/12/12(水) 15:45:31>>185
とりあえず試行錯誤してみる
>>187
すまん、何を言っているのかすら解らなかったんだ
0190デフォルトの名無しさん
2007/12/12(水) 15:47:10LAD 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
ここまで書いたが、絶対値の求め方ってなんだっけ?
0191デフォルトの名無しさん
2007/12/12(水) 15:50:26> 個数NはN番地に格納されている
って、私の住所は私の住んでいる所ですって言ってるようなものだ
0192デフォルトの名無しさん
2007/12/12(水) 15:58:24なるほど、でも問題文そのままなんだよなぁ・・
0193デフォルトの名無しさん
2007/12/12(水) 16:06:48これのやり方がわからない
0194デフォルトの名無しさん
2007/12/12(水) 16:12:37「データの個数はN番地に格納されている」とかなら文句はたぶん出ない
0195デフォルトの名無しさん
2007/12/12(水) 16:15:26負の数だったら0から引けばOK。アセンブラによっては符号反転のニモニックがあるかも知らん。
CASL知らんからCで書いておく。
signed foo;
if (foo < 0) foo = 0 - foo;
or
if (foo < 0) foo = -foo;
0196デフォルトの名無しさん
2007/12/12(水) 16:20:48>190に正だったらそのまま格納
負だったら0からその数を引けばいいんだな
0197デフォルトの名無しさん
2007/12/12(水) 16:23:18CASLには符号反転命令はないから正負を判断して負なら0からその値を引く
1.正なら3へジャンプ
2.0から値を引く
3.
みたいな感じでいいんじゃまいか?
0198デフォルトの名無しさん
2007/12/12(水) 16:29:25TEST 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
としてみたんだがエラーが発生してしまう・・・
0199デフォルトの名無しさん
2007/12/12(水) 16:43:20LAD 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
でもいいかも
アセンブルとか動作チェックとかして確かめていないが
0200199
2007/12/12(水) 16:58:06CPA GR3,GR2
でなく
CPA GR2,GR3
かな
0201デフォルトの名無しさん
2007/12/12(水) 17:10:20LAD 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
アセンブルではうまく言ったんだけど
無限ループしてしまった
0202デフォルトの名無しさん
2007/12/12(水) 17:17:05LAD 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
これで提出してみました
合格してるといいなぁ
0203デフォルトの名無しさん
2007/12/12(水) 17:19:54HUTUの次の行の
LAD GR1,1,GR1
が抜けてる気がする
0204デフォルトの名無しさん
2007/12/12(水) 17:27:11正負の判断で分岐させたくなければ
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ビット幅だったよね?
0205デフォルトの名無しさん
2007/12/12(水) 17:32:02お前らのおかげだ!ありがとう!
>>202
あ、うん直前で気づいていれておいた
>>203
すまないが見たことの無い単語が出てきて解らない
16ビットなのは合ってるよ
さて、最後の課題だ
「メモリのDATA番地以降にN個の符号付整数が格納されている. 指標レジスタを用いて,これらの中の正の整数の合計を求め,結果 をSUM番地に格納するプログラムを作成せよ.データの個数NはN番地 に格納されているものとする.」
もう早速意味の解らない
data番地とか指標レジスタって日本語?
0206デフォルトの名無しさん
2007/12/12(水) 17:46:15指標レジスタを用いて、これらの中の正の整数の合計を求め、結果 をSUM番地に格納するプログラムを作成せよ。
データの個数nはN番地 に格納されているものとする。」
とすると
こんな感じのメモリマップがあるって事か
SUM番地 [ ... ]
N番地 [ n ]
DATA+0番地 [ ... ]
DATA+1番地 [ ... ]
DATA+2番地 [ ... ]
...
DATA+(n-1)番地 [ ... ]
指標レジスタってのは while ループをレジスタで再現しるってだけジャマイカ?
x86とSHしか知らないから違うかもしれないけど。
0207デフォルトの名無しさん
2007/12/12(水) 17:46:42xが正なら(x+(0))と(0)の排他的論理和をとる
0と-1はxを右に15ビット算術シフトすれば出てくる
DATA番地も指標レジスタも日本語だw
DATA番地はN個の符号付整数が格納されているブロックの先頭の番地のラベルじゃないかな
指標レジスタはCASLIIの仕様書にちゃんと載ってるぞ
0208デフォルトの名無しさん
2007/12/12(水) 17:53:46排他的論理和ってのを使えばいいのかな?
0209デフォルトの名無しさん
2007/12/12(水) 17:55:10XORだよな?
っというかもうやっぱり問題文の日本語がわからない
なにをさせたいのかさっぱり
0210デフォルトの名無しさん
2007/12/12(水) 17:58:310211デフォルトの名無しさん
2007/12/12(水) 18:01:12いや、素直に正か負で分岐して負の場合だけ0から引くとかにしておいた方がいいと思う
自分で書いててアレだが素直で見やすくて何をやっているかすぐに分かるコードの方が好きだ
ちなみに
LD GR3,GR2
SRA GR3,BWM1
で15ビット右にシフトした値をGR3に入れて
ADDA GR2,GR3
で元の値GR2に0か-1を足して
XOR GR2,GR3
で排他的論理和をとってGR2に入れている
0212デフォルトの名無しさん
2007/12/12(水) 18:04:31「メモリのDATA番地以降にN個の符号付整数が格納されている. 指標レジスタを用いて,これらの中の正の整数の合計を求め,結果 をSUM番地に格納するプログラムを作成せよ.データの個数NはN番地 に格納されているものとする.」
ではなくその前の課題についてだったのか
0213デフォルトの名無しさん
2007/12/12(水) 18:12:32とかで既に指標レジスタとしてのGRレジスタの使い方をしているんじゃないか?
指標レジスタを用いてっていうのは、DATA番地以降にある整数に上のような方法でアクセスするってことじゃないか?
あとは
LDA GR3,0
LOOP GR2にデータを一つ入れる
CPA GR2,GR3 ; GR2と0を比較
JMI MAINA ; 負ならジャンプする
SUM番地にGR2を加算
MAINA ...
...
JMI LOOP
みたく正の場合だけ加算処理をする
>>212
すまん、混乱させてしまった
0214デフォルトの名無しさん
2007/12/12(水) 18:12:30最後の問題はクリアしてなくても帰れるみたいだ
今日はお前ら本当にありがとう
0215デフォルトの名無しさん
2007/12/12(水) 18:16:11CASLはメモリをディスティネーションにする加算命令はなかったかも
途中の和を入れるためのレジスタを用意してループ中ではそれに加算して
最後にSUMにSTする形をとったほうがいいか
0216デフォルトの名無しさん
2007/12/12(水) 22:46:440217デフォルトの名無しさん
2007/12/12(水) 22:58:04何を(どういうことを)勉強したいの?
0218デフォルトの名無しさん
2007/12/12(水) 23:34:200219デフォルトの名無しさん
2007/12/12(水) 23:43:07まだなさげ?
0220デフォルトの名無しさん
2007/12/13(木) 00:59:12ビットサイズだけじゃアセンブラが特定できん。
0221デフォルトの名無しさん
2007/12/13(木) 01:04:570222デフォルトの名無しさん
2007/12/13(木) 01:07:455から大してかわってない。
0223デフォルトの名無しさん
2007/12/13(木) 01:31:01前何かで参考になった
0224デフォルトの名無しさん
2007/12/13(木) 05:36:470225デフォルトの名無しさん
2007/12/13(木) 15:03:35既存のライブラリでやるなら何もASMでやる必要は無いんじゃね?
0226デフォルトの名無しさん
2007/12/13(木) 16:44:57アセンブラMACROSしか知らないなぁ。公開されたものは。
使ったことないけど。
これね。
ttp://www.vector.co.jp/soft/dos/prog/se001158.html
0227デフォルトの名無しさん
2007/12/13(木) 23:14:23もし、一連の質問の同一人物なら、
質問に答えてもらったら・・・後はわかるな?
0228226
2007/12/14(金) 10:43:12別にいいんじゃないか2チャソだし
ひろゆこ曰
ttp://www.asks.jp/users/hiro/20193.html
A :20xx/mm/dd hh:mm:ss
HDDの残り容量の調べ方を教えれ
>A B :20xx/mm/dd hh:mm:ss
df
こういう空間を良しと考えていたみたいだし
(個人的にはこのひろゆこのエントリにはいろいろツッコミたい点は覆いが)
0229デフォルトの名無しさん
2007/12/19(水) 14:22:19前にも増して日本語なのか理解できないので助けて欲しい
【問題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
ご助力頼む!
0230デフォルトの名無しさん
2007/12/19(水) 15:07:35LD 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
とりあえず自分でやってみた
どうだろうか
0231デフォルトの名無しさん
2007/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
0232デフォルトの名無しさん
2007/12/19(水) 15:21:17LD 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
ここまで自分で入れてみた
0233デフォルトの名無しさん
2007/12/19(水) 17:19:130234デフォルトの名無しさん
2007/12/20(木) 00:20:590235デフォルトの名無しさん
2007/12/20(木) 00:34:28スレ違い。寧ろ鼬害かも。
0236デフォルトの名無しさん
2007/12/20(木) 00:52:16日本語でおk
0237デフォルトの名無しさん
2007/12/20(木) 01:00:310238デフォルトの名無しさん
2007/12/20(木) 07:35:31http://pc11.2ch.net/test/read.cgi/tech/1168399966/l50
0239デフォルトの名無しさん
2007/12/20(木) 16:38:17名古屋駅近辺でお話しましょう
0240デフォルトの名無しさん
2007/12/23(日) 15:23:17pmaxubかpcmpgtb
後者の使い方がよくわからないorz
0241デフォルトの名無しさん
2007/12/23(日) 15:48:230242デフォルトの名無しさん
2007/12/23(日) 22:42:5032bitレジスタにSSEレジスタの内容を書込む場合は、
どうしたら良いのでしょうか?
movapsを使って転送しようとしたところで落ちます。
movaps xmm0, [esi]
// 〜処理〜
movaps [ecx], xmm0 <-- ここで落ちる.
0243デフォルトの名無しさん
2007/12/23(日) 22:50:12自己レス、ごめんなさいループ条件を間違えていただけでした。
0244デフォルトの名無しさん
2007/12/27(木) 00:15:180245デフォルトの名無しさん
2007/12/27(木) 00:20:22http://www.google.co.jp/
0246デフォルトの名無しさん
2007/12/27(木) 03:29:120247デフォルトの名無しさん
2007/12/27(木) 09:47:320248デフォルトの名無しさん
2007/12/27(木) 10:24:20具体的な違いは石に依存するので種類を明記しない質問にはこれ以上答えようがない。
0249デフォルトの名無しさん
2007/12/27(木) 13:11:10逆だったり
0250デフォルトの名無しさん
2007/12/27(木) 14:28:29and $0xfffffff0,%esp
って記述が必ずあるんだが、これはなんのためにやってるの?
0251デフォルトの名無しさん
2007/12/27(木) 14:42:11ローカル変数をメモリ上でアライメントするため、
だと思われる。
0252デフォルトの名無しさん
2007/12/29(土) 14:50:54アライメント?
wikiでみたら、データを特定のサイズに調節することって書いてあるんだが
意味がわからない
int型だと2バイトcharだと1バイト見たいなのが関係してんの?
0253デフォルトの名無しさん
2007/12/29(土) 14:58:10http://www5d.biglobe.ne.jp/~noocyte/Programming/Alignment.html
0254デフォルトの名無しさん
2007/12/29(土) 22:04:47「32ビット整数を格納するときはアドレスが4の倍数でないとすごくアク
セスが遅くなる」とか聞いたことないかい?
いまのx86は最大で128ビットのXMMレジスタまであるので、とりあえず
アドレスを16の倍数にしておけばどんなデータも遅くならない。
0255デフォルトの名無しさん
2007/12/29(土) 22:57:540256デフォルトの名無しさん
2007/12/31(月) 01:35:07and演算でespレジスタに格納されてるアドレスの最下位の値を0にしてるって考えていいの?
0257デフォルトの名無しさん
2007/12/31(月) 05:35:56になったりしたものだが、後にいくらか親切になって、半端なアドレスのときは回路が二度読み
してくれるようになった。その分実行が遅くなるので、高速が要求される場面では参照アドレスが
4の倍数になるようにコードで保証するテクニックです。
0258デフォルトの名無しさん
2007/12/31(月) 08:48:16>になったりしたものだが、後にいくらか親切になって、半端なアドレスのときは回路が二度読み
真ん中辺が禿げ上がるほど大間違い。
0259デフォルトの名無しさん
2007/12/31(月) 10:10:410260デフォルトの名無しさん
2007/12/31(月) 11:40:52x86という書き方をするけど、実は初期のIBM-PC のデータバスは8ビットで 8086ではなく8088だった。
だから、昔はワードデータが奇数番地から始まろうが偶数番地から始まろうが関係なかった。
そんなわけでx86シリーズに限るとアライメントミスで実行時エラーになることはなかった。
0261デフォルトの名無しさん
2007/12/31(月) 11:43:370262デフォルトの名無しさん
2008/01/01(火) 03:35:140263デフォルトの名無しさん
2008/01/02(水) 02:30:340264デフォルトの名無しさん
2008/01/02(水) 07:39:51ただc/delphiなんかから呼び出す時にはそれが最後のパラメータになるってだけで
でも、手続き側でスタックの消去をするから、引数の個数を間違えると悲惨な事になるんで
普通はstdcallは使わないよね。
0265デフォルトの名無しさん
2008/01/02(水) 11:55:54this は ecx レジスタで渡して、引数は stdcall みたいに扱ってるけど、
可変個引数メンバ関数は例外的に引数を cdecl みたいに扱ってる。
普通はこんな感じで可変個引数の時には stdcall は使わないと思う。
ただ、可変個引数だろうと、何らかの形で引数のサイズは分かるような仕様にはするだろうから、
その情報を使ってスタックをクリアすることは可能なはずだけど(リターンアドレスをコピーする必要はある)、
ただ、>>264 にもある通りかなり注意する必要がある。
クリアされない引数が出ると、それが呼び出しもとの関数のリターンアドレスになって・・・とか。
0266デフォルトの名無しさん
2008/01/02(水) 12:40:16なにがいけないのでしょうか?
--------------ソース----------------------------
.text
.globl main
main:
movb $(0x0e),%ah
movb $(0x14),%al
movb $(0x00),%bh
movb $(0x07),%bl
int $0x10
0267266
2008/01/02(水) 12:53:240268デフォルトの名無しさん
2008/01/02(水) 13:07:13ubuntuはアセンブラ非対応だよ?
0269デフォルトの名無しさん
2008/01/02(水) 14:14:25>>266 どういう環境で走らすためのコードだそれ?
保護機構のある32ビットOSの下で動かすものにはとても見えないが。
0270デフォルトの名無しさん
2008/01/02(水) 14:18:02一応、確認するが石は何?
0271デフォルトの名無しさん
2008/01/02(水) 14:32:10ビデオBIOSコール? 環境を間違えてる。MS-DOSの上でおやりなさい。
0272266
2008/01/02(水) 15:09:00レスをありがとうございます。
CPUはペンティアム3です。
GRUBから何かのプログラムを起動させようとして作ってみました。
GRUBから起動させると、リブートになるので、ubuntu上で動くか確認しています。
0273デフォルトの名無しさん
2008/01/02(水) 15:12:08VMにつっこんでやれよアホ
一回頃してやろうか?
0274266
2008/01/02(水) 15:14:110275デフォルトの名無しさん
2008/01/02(水) 21:54:22参考にしてるサイトなり書籍なりを教えて。
0276デフォルトの名無しさん
2008/01/03(木) 01:28:01int a[4];
}
ってプログラムをコンパイルして逆アセンブルすると
sub 0x10,%esp
ってなってるんだけど
int型は、2バイトだんだから
2*4でsub 0x8,%espで確保してもよさそうなもんなんだが
なんで0x10で確保してるの?
0277デフォルトの名無しさん
2008/01/03(木) 01:31:590278デフォルトの名無しさん
2008/01/03(木) 01:33:52環境が不明でなんとも言いようがないが、とりあえず。
>int型は、2バイトだんだから
コンパイラ依存
0279デフォルトの名無しさん
2008/01/03(木) 01:40:05att記法で%espとか書いてるからi386でgccだろう。あと、espと書いてるからにはintは4バイトな気もするな。
0280266
2008/01/03(木) 04:42:410281デフォルトの名無しさん
2008/01/03(木) 13:12:39「Cは自らハックする者を助く」
0282デフォルトの名無しさん
2008/01/03(木) 19:41:50なるほどw
0283デフォルトの名無しさん
2008/01/05(土) 16:54:28libcをリンクしてprintfを呼び出すといいよ
0284デフォルトの名無しさん
2008/01/07(月) 02:57:350285デフォルトの名無しさん
2008/01/07(月) 03:43:420286デフォルトの名無しさん
2008/01/14(月) 23:31:180287デフォルトの名無しさん
2008/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
0288デフォルトの名無しさん
2008/01/23(水) 03:14:21出力させたいのはmsgの先頭の「H」です
0289デフォルトの名無しさん
2008/01/23(水) 05:26:200290デフォルトの名無しさん
2008/01/23(水) 05:45:380291デフォルトの名無しさん
2008/01/23(水) 09:33:09どうせなら
http://www.nk.rim.or.jp/~jun/lxasm/asm00.html
辺りは、熟読して置いて欲しいと思った。
このサイトならアセンブル方法なんかの手順から細かく書かれているし。
0292デフォルトの名無しさん
2008/01/23(水) 09:46:55情報ありがとうございます。
どうやら_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
とすればよかったみたいです。
わかりずらい質問をしてしまってすいませんでした。
0293デフォルトの名無しさん
2008/01/26(土) 16:03:53http://science6.2ch.net/test/read.cgi/denki/1108630837/682
8bitマイコンにおけるシンプルなBCD演算の最適化に関する話題なんですが、
よかったら見てやって下さい。
0294デフォルトの名無しさん
2008/01/26(土) 16:43:56仮定条件が多過ぎてわけわかめ。CPUを限定していいから実在するニモニックで実際に動くコード貼ってみたら?
0295デフォルトの名無しさん
2008/01/26(土) 18:22:14>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を足す
という仕様になっているなら大丈夫だろう
0296293
2008/01/26(土) 21:29:57>・ ハーフキャリーが立ってるなら下位4ビットに6を足す
>・ 9以上なら8bit分6を足す
はい、そういう仕様になってます。
やっぱこれで間違ってないですよね?
理屈上はこれでいいはずだと思ったんですが、何かこう
直感に反するような感覚が消えなくて……
0297デフォルトの名無しさん
2008/02/05(火) 20:56:43BCD演算について、値の表現が
0-9= 0x0-0x09というのは縛り?
昔からある手法で、0-9=0x03-0x0cというのもある。(offset-3)
BCD部分に限れば、n+m => (n+3)+(m+3)で、キャリーの有無で次の桁へのcarry-upが計算できる。
減算もほぼ同様。
HW回路に直すと、効率が結構良いのが分かるはず。
0298デフォルトの名無しさん
2008/02/06(水) 08:51:36ソフトで計算しなければならないならソレも方法だね。
でもソフトで計算するなら100進数の方が楽だけどね
0299デフォルトの名無しさん
2008/02/06(水) 14:18:5009 + 01 = 10 の代わりに
3C + 34 = 70 -> 43 ってなる訳じゃん?
70 -> 43 ってどこから持ってくるのん?
0300デフォルトの名無しさん
2008/02/06(水) 14:24:590301デフォルトの名無しさん
2008/02/06(水) 14:32:36C + 4 = 10 であって 40 ではない罠
0302デフォルトの名無しさん
2008/02/06(水) 14:33:130303デフォルトの名無しさん
2008/02/06(水) 19:10:38十分な速さを与えてもらえてるのか?
0304デフォルトの名無しさん
2008/02/06(水) 20:00:05ただ、最近はC言語で書くのが当然のようになってるから、ハブられ易いね
0305デフォルトの名無しさん
2008/02/06(水) 20:15:200306デフォルトの名無しさん
2008/02/06(水) 21:08:12module 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ぐらい摂取して、書いているので、バグについては容赦願います。
0307デフォルトの名無しさん
2008/02/06(水) 22:06:56単なる憶測だけど IBM の Power6 の BCD 演算回路なんか速いんじゃない?
0308デフォルトの名無しさん
2008/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
です。
0309デフォルトの名無しさん
2008/02/14(木) 19:07:54下から4行目のretの次の命令がないからじゃないかな
システムコールでプログラムの終了すればいいと思う
FreeBSDならこんな感じ
pushl $0 /* return value */
movl $1, %eax /* SYS_exit */
pushl %eax
int $0x80
16ビットだとどうなるかはわからん
0310デフォルトの名無しさん
2008/02/14(木) 19:31:07>>308の環境で16bitコードでmainを書こうなんて考えたのがそもそもの原因。
それ専用のcrt0を用意したわけでもなかろうに。
どこの何見てそんなことやろうと思ったのか知らんが。
0311デフォルトの名無しさん
2008/02/14(木) 19:52:52どうもです。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か、何か適切な本があれば教えてくれませんか?
0312デフォルトの名無しさん
2008/02/14(木) 19:59:410313デフォルトの名無しさん
2008/02/14(木) 20:08:36http://sourceware.org/binutils/docs-2.18/as/i386_002d16bit.html#i386_002d16bit
0314デフォルトの名無しさん
2008/02/14(木) 20:17:0716-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.
0316デフォルトの名無しさん
2008/02/14(木) 21:09:05そこ読んでも何を勘違いしてるのかわかりません…
すいません教えてください。
0317デフォルトの名無しさん
2008/02/14(木) 21:17:580318デフォルトの名無しさん
2008/02/14(木) 21:22:22アセンブラに指示を出すのが.code16ディレクティブ。
*BSD系は普通32ビットプロテクトモードを使う。
32ビットモードで16ビットモードのコード食わせれば当然暴走することになる。
0319デフォルトの名無しさん
2008/02/14(木) 22:06:38いえいえ
>>317>>318
了解です。ありがとうございました。
0320デフォルトの名無しさん
2008/02/14(木) 22:26:32mov m,i;
ってのは不可能なんでしょうか?つまり
mov [esi], 0FFFFFFFFH;
なんてのは無理なんでしょうか?
0321デフォルトの名無しさん
2008/02/14(木) 23:23:00アセンブルできるよ。
念のため「うさみみハリケーン」付属の簡易アセンブラで試してみた。
mov dword ptr [esi], 0FFFFFFFFH
これをアセンブルすると、
C706FFFFFFFF
になった。
0322デフォルトの名無しさん
2008/02/15(金) 01:03:38当然暴走するって言い方は乱暴だなぁ。
意味はないけど暴走しないように書く事だっでできる。
>>319
gdb使っているなら逆アセしてみれば、なぜ落ちるかわかるはず。
0323デフォルトの名無しさん
2008/02/15(金) 03:18:50call ch_dxの手前まで進んでSIGSEGVを出して落ちたので
本来$eipが32bitで指し示しているアドレスを、.code16モードでは
その下位16bitしか読まないため、不正なアドレスにアクセスしようとして
エラーが出たんじゃないかと思います。たぶんですが
0325デフォルトの名無しさん
2008/02/15(金) 07:10:220326デフォルトの名無しさん
2008/02/15(金) 17:09:11はずれ。
ヒント
.code16のmovwと.code32のmovlは同じコード
0327デフォルトの名無しさん
2008/02/19(火) 23:33:19どうもです、ちょっと考えてきます。
0328デフォルトの名無しさん
2008/02/25(月) 15:25:470329デフォルトの名無しさん
2008/06/01(日) 12:34:51mov ah,4ch
int 21h
0330デフォルトの名無しさん
2008/06/01(日) 13:49:170331デフォルトの名無しさん
2008/06/02(月) 16:32:39nop
nop
0332デフォルトの名無しさん
2008/06/02(月) 16:34:140333デフォルトの名無しさん
2008/06/03(火) 21:13:510334デフォルトの名無しさん
2008/06/04(水) 00:25:36(もう忘れたよ)
0335デフォルトの名無しさん
2008/06/05(木) 13:36:380336デフォルトの名無しさん
2008/06/05(木) 13:47:28push [M]
pop [N]
pop [M]
0337デフォルトの名無しさん
2008/06/05(木) 20:21:30それってレジスタNとレジスタMでの交換じぇねえか?
自信ないけど。
>335の問題はN番地とM番地の交換だろ?
0338デフォルトの名無しさん
2008/06/06(金) 01:16:090339デフォルトの名無しさん
2008/06/07(土) 13:10:15push [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
レジスタ使用数と速度を比較してみると面白いか。
0340デフォルトの名無しさん
2008/06/07(土) 13:27:28xchg [M], eax
xchg [N], eax
0341デフォルトの名無しさん
2008/06/07(土) 13:35:280342デフォルトの名無しさん
2008/06/07(土) 13:58:330343デフォルトの名無しさん
2008/06/07(土) 14:02:330344デフォルトの名無しさん
2008/06/07(土) 15:04:110345デフォルトの名無しさん
2008/06/09(月) 15:24:58ってどうやってアドレス計算しとんじゃボケ!
0346デフォルトの名無しさん
2008/06/09(月) 15:37:310347デフォルトの名無しさん
2008/06/09(月) 15:50:030348デフォルトの名無しさん
2008/06/09(月) 15:55:16氏ねと?
0349デフォルトの名無しさん
2008/06/10(火) 01:24:36何時でもマの必須項目
0350デフォルトの名無しさん
2008/06/10(火) 23:26:31単純JUMP8バイト。
0351デフォルトの名無しさん
2008/06/29(日) 14:09:28はじめて読むアセンブラ
と
いまどきのアセンブラの教科書
は持っているのですが、どうもわからないので、
とっつきやすい書籍を紹介してほしいです。
0352デフォルトの名無しさん
2008/06/29(日) 14:16:300353デフォルトの名無しさん
2008/06/29(日) 15:44:58PIC か何か、PCではないもので学ぶか、PC で学ぶかという選択肢はあるが、
後者なら「はじめて読むPentiumマシン語入門編」をすすめておく。
0354デフォルトの名無しさん
2008/06/29(日) 16:15:05そのレベルなら自力でなんとかすると思うので続きは (省略されました)
0355デフォルトの名無しさん
2008/06/30(月) 09:42:15お願いします。
僕に課題を下さい
0356デフォルトの名無しさん
2008/06/30(月) 11:53:30Windows上なら Delphiのインラインアセンブラとか手軽に利用出来て便利
多倍長の四則演算あたりを書いてみたらいいと思うな。
0357デフォルトの名無しさん
2008/06/30(月) 19:25:06(某大手企業の中堅クラス以上の社員)
シフト加算で何とかなるとか言っていた。w
0358デフォルトの名無しさん
2008/08/18(月) 16:54:10OUT命令でFM音源動かしたり
VRAMに直接書き込んだりしていたけど
ウィンドウだと出来るのでしょうか
複雑すぎて自分ではやれないとは思うのですけどね
0359デフォルトの名無しさん
2008/08/18(月) 17:20:25そうですよねえ。
直接やりたいですよね。
んで、しつこいですけどもう一度。
WindowsはOSです。
わかりますよね??言ってる事。
0360デフォルトの名無しさん
2008/08/18(月) 17:44:39saveES 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と解釈されアセンブルされるのでしょうか?
0361デフォルトの名無しさん
2008/08/19(火) 00:17:36movzx 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
0362デフォルトの名無しさん
2008/08/19(火) 00:25:03ウィンドウってX?ms?
どっちでもやろうと思えばできる。
ただ、やらない方がいい。
0363デフォルトの名無しさん
2008/08/19(火) 01:37:14extern 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
0364デフォルトの名無しさん
2008/08/19(火) 11:30:39そんなお節介なアセンブラいらね。
ちう事で自分でオーバーライド。
0365デフォルトの名無しさん
2008/08/19(火) 17:13:58>>359 リアルモードとプロテクトモードだと
メモリのアクセス方法とか全然違うんだよねっと
思っただけです
0366デフォルトの名無しさん
2008/08/19(火) 18:10:50flush_q2:
db 0eah
dw offset set_cs_desc3
dw seg set_cs_desc3
set_cs_desc3:
って書いてあります。DOSから割り当てられるセグメントは
決まってないと思うのですが、dw seg set_cs_desc3
はどうしてアセンブルできるのでしょうか?
0367デフォルトの名無しさん
2008/08/19(火) 18:20:360368デフォルトの名無しさん
2008/08/20(水) 13:40:07何がどう複雑かって言うと、マルチタスクなので複数のプログラムが同時にIOしようとする
可能性を考慮しないといけないところ。だから、普通だとIOはデバイスドライバの仕事。
ドライバは複数のプログラムの要求を調停しながらIOを行う。
これが一般のアプリケーションには抽象化されたOSのAPIという形になる。
変わったところでは、16bitのと9xのWindowsがAPIだけでなくDOSシステムコールなども
そのままデバイスドライバへの要求に使えるというのがあった。DOS窓でDOSアプリケーションを
動かすための仕組みだが、副作用としてWindowsアプリケーションでもINとOUTなどができてしまう。
もちろん、そのIN/OUTはドライバが捕まえて、ドライバが代わりにやり直すんだけどな。
もう1つ、近頃はWindows用のドライバさえ用意すればよいという風潮で、
直接叩く方法が分からないハードウェアが多いというのも問題。
0369デフォルトの名無しさん
2008/08/20(水) 15:26:40何か複雑ですね
out文をいろいろやったりするのが好きだったものです
0370デフォルトの名無しさん
2008/08/22(金) 02:22:51それがこれです。
以下の2つのプログラムについて、各行の命令文を言葉化し、 (例えば、movw num, %cx なら"numの内容をCXレジスタに代入"とか)
それぞれの行における、メモリ、aレジスタ、bレジスタ、cレジスタ、dレジスタの内容を示しなさい。
なお、ファイルはエクセルで作成すること。
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7638.txt
http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/7639.txt
どなたか助けてくれませんか?お願いします…
エクセルで作成せよとのことですが、内容がわかればメモ帳でもなんでも構いませんので。
0371デフォルトの名無しさん
2008/08/22(金) 04:22:00難読化もされてなけりゃ意地悪い箇所もない親切で読みやすいプログラムじゃないか。
面倒でも1命令づつ読んでいけ。この程度を読むのが嫌なら何もするな。
0372デフォルトの名無しさん
2008/08/22(金) 10:12:58折角の課題なのに「勉強しよう」スレで勉強する気ゼロな依頼をするとはこれ如何。
0373デフォルトの名無しさん
2008/08/22(金) 21:54:19せんせいはきっと、
「分かり易く図や表を使ってね」
と暗に言ってるんだろう。そこを押さえればバッチグーだな m9(^Д^)
0374デフォルトの名無しさん
2008/08/23(土) 01:32:59図が要るとは思えないが
0375デフォルトの名無しさん
2008/08/23(土) 23:21:34x86のeaxなど汎用レジスタの上位16ビットと下位16ビットを
入れ替える命令ってありませんでしたっけ?
0376デフォルトの名無しさん
2008/08/23(土) 23:26:510377デフォルトの名無しさん
2008/08/23(土) 23:33:41やっぱローテートでやるんですね。どうもありがとうございます
0378デフォルトの名無しさん
2008/08/27(水) 15:57:580379デフォルトの名無しさん
2008/08/27(水) 16:12:110380デフォルトの名無しさん
2008/08/27(水) 16:20:160381デフォルトの名無しさん
2008/08/27(水) 16:21:400382デフォルトの名無しさん
2008/08/30(土) 09:36:05xchg ah,al
bswap eax
xchg ah,al
普通に回した方が早いよなあ。
0383デフォルトの名無しさん
2008/08/30(土) 11:15:19ネットバーストでの記述だからレイテンシ4サイクルだけどPenM以降なら1に戻ってるだろうな。
0384デフォルトの名無しさん
2008/09/03(水) 08:23:12004B4ADA . 81B8 98020000 >CMP DWORD PTR DS:[EAX+298],4349726F
004B4AE4 . 74 12 JE SHORT kuma.004B4AF8
EAXに入っている値+298のアドレスに入っている値とアドレス4349726Fの比較ですか?
0385デフォルトの名無しさん
2008/09/03(水) 11:40:580386デフォルトの名無しさん
2008/09/04(木) 07:33:28MOV 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 ならジャンプ
これであってますでしょうか?
0387デフォルトの名無しさん
2008/09/04(木) 08:34:50書いてないものは68K/Coldfireとみなすからな。
0388デフォルトの名無しさん
2008/09/04(木) 10:15:550389デフォルトの名無しさん
2008/09/05(金) 09:07:270390デフォルトの名無しさん
2008/09/05(金) 10:15:40そのmovでフラグは変化しないからあってる。
と思う。
0391デフォルトの名無しさん
2008/09/16(火) 23:53:320392デフォルトの名無しさん
2008/09/17(水) 12:08:160393デフォルトの名無しさん
2008/09/17(水) 12:56:50つーか、マルチすんな。
0394デフォルトの名無しさん
2008/09/17(水) 15:31:220395デフォルトの名無しさん
2008/09/17(水) 16:18:270396デフォルトの名無しさん
2008/09/22(月) 09:48:21この場合10進数で-20、-52、-32のどれでしょうか?
あと、-20という定数はここだけでしか使われていなかったのですが
こういう定数は主にどのようなケースで使われるのでしょうか?
0397デフォルトの名無しさん
2008/09/22(月) 12:49:54何の石の何のアセンブラかを書かないとわからない。
0398デフォルトの名無しさん
2008/09/22(月) 22:15:51224だか-32だか。少なくとも、-52なんてことは有り得ない。
0399デフォルトの名無しさん
2008/09/23(火) 12:34:44一般的には16進の定数は 20h 0x20 $20 などの表記をすることが多い。
0401デフォルトの名無しさん
2008/09/24(水) 09:05:39チート、割れ物は鼬害。
0402デフォルトの名無しさん
2008/11/03(月) 19:30:27LEDすべて点滅するプログラムを作るにはどうしたら良いか?
解き方がわかりません!どなたか解き方を教えて下さい!
また、上と同様に、スイッチのデータが10Hより大きい時
LEDのビット7が点滅し、スイッチのデータがOFHより
小さい時はLEDのビット0が点滅するプログラムを作る
には、どうしたら良いか? こちらもお願いします!
0403デフォルトの名無しさん
2008/11/03(月) 19:38:190404デフォルトの名無しさん
2008/11/04(火) 02:48:39下は教える気にもならんほど初級
0405デフォルトの名無しさん
2008/11/04(火) 03:22:390406デフォルトの名無しさん
2008/11/04(火) 18:51:09ぜひ、助けて下さい。 ↓ のような感じで、プログラムお願いします。
10 ORG 0100H
20PA EQU 20H ちなみに、アセンブラ言語・8255です。
30CR EQU 23H
40 LD A,98H
0407デフォルトの名無しさん
2008/11/04(火) 18:57:37だいたい、どうやってスイッチを読むのか、どうやってLEDの制御をするのかを
指定してくれなければ何もガイドできないぞ。
0408デフォルトの名無しさん
2008/11/04(火) 19:03:100409デフォルトの名無しさん
2008/11/04(火) 19:22:090410デフォルトの名無しさん
2008/11/04(火) 19:37:30あったけど、そういうのかなぁ?
0411デフォルトの名無しさん
2008/11/04(火) 19:39:26その通りです。行番号です。
0412デフォルトの名無しさん
2008/11/04(火) 22:30:20誰かが手助けできる程度の情報を提供できるようになってからまた来なさい
0413デフォルトの名無しさん
2008/11/05(水) 04:35:57LXI SP,0A000H ; RAMの末尾番地
JMP MAIN
SW EQU 0E000H ; SWのMAPされる番地
LED EQU 0F000H ; LEDのMAPされる番地
ORG 0100h ; 飛ばした場所には割り込みベクタが置かれる
朝飯だから続きは後で
0414デフォルトの名無しさん
2008/11/06(木) 16:04:33CMA ; 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
0415デフォルトの名無しさん
2008/11/06(木) 16:08:59LOOP1: ; ここが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
0416デフォルトの名無しさん
2008/11/06(木) 16:28:52MVI 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
0417デフォルトの名無しさん
2008/11/06(木) 16:37:10bit7 ONのパターンは LDA 07FH (他のbitはoff) の間違いでした。
本当は8253とかの外付けタイマをRST7.5に割り込み入れてソフトタイマを減算したほうが
スマートなのだけど、402はそういう余計な情報を消化できないと思って、loopでディレイを
作りました。割り込みを使う方法も知りたければその旨書いてね。
0418デフォルトの名無しさん
2008/11/06(木) 17:16:490419デフォルトの名無しさん
2008/11/08(土) 04:05:19もうすぐ朝飯だから、気が向いたら午後にでも書きにくるかも。
0420デフォルトの名無しさん
2008/11/08(土) 08:12:450421デフォルトの名無しさん
2008/11/08(土) 17:53:40ORG 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)とかを使うんだよね。
この先書いてる間に誰かフォローお願い。
0422デフォルトの名無しさん
2008/11/08(土) 18:02:45IN 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
コンプリメントのニーモニックが判らなくてゴメン。読む人はザイログ慣れてるでしょうから補って。
0423デフォルトの名無しさん
2008/11/08(土) 18:07:18LOOP1: ; ここが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
0424デフォルトの名無しさん
2008/11/09(日) 03:56:53LD 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
0425デフォルトの名無しさん
2008/11/09(日) 04:01:45Z80も今では作られてないだろうから、実際に動かすならZ80180か川崎の180かな。
バンクとか、幾つかの内蔵I/Oレジスタの初期化が要るはずだが、デフォが16bitリニアな
アドレス空間になっていると思うので、デフォのままで動くのでしょう。
0426デフォルトの名無しさん
2008/11/09(日) 04:32:44CSEG
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以上と未満と解釈する。
0427デフォルトの名無しさん
2008/11/09(日) 04:33:440112 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
0428デフォルトの名無しさん
2008/11/09(日) 04:35:130140 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してスペースの所をタブに変えれば読めるリストに戻ります。
0429デフォルトの名無しさん
2008/11/09(日) 17:35:51*** missing quote syntax error ってエラーが出るんですよ。これどう書けばいいんだろ・・・
0430デフォルトの名無しさん
2008/11/09(日) 18:11:320431デフォルトの名無しさん
2008/11/09(日) 18:29:54>126 名前: デフォルトの名無しさん [sage] 投稿日: 2008/09/22(月) 15:54:58
>今日のわたしはモード2なのよ
>ttp://www.youtube.com/watch?v=gpzCBUwU_Ys
0432429
2008/11/10(月) 04:56:57IN r,(C) とか、OUT (C),r って、A以外の諸レジスタもrに(文法上は)書けるのですが、
BやCを使うことはないし、D〜Lだってまず使わないですよね。なんでこんなこと許してるのかな。
0433デフォルトの名無しさん
2008/11/10(月) 05:45:58I/Oポートアドレス空間を64KiBフルにデコードすることも可能といえば可能。
それを利用したのがSonyのHitBitじゃなかったかな。
0434デフォルトの名無しさん
2008/11/11(火) 02:05:41’〜で後ろの"'"が無いことになってるんだから別に間違ってなかろう。
EX AF,AF'だけ特別扱いするのはめんどいし。
rでA以外も受け付けるのは、その方が簡単だから。
0435429
2008/11/11(火) 05:01:14実機でそういう構成の奴はやったことないんですよね。どなたかありますか?
>>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 無い
0436デフォルトの名無しさん
2008/11/11(火) 08:49:520437デフォルトの名無しさん
2008/11/11(火) 09:13:56普通は「'hoge'」と書かなきゃいかんのに「AF'」て書いたんで、
「'」が閉じてないがなといわれてるんですな。
IN[ID]R/OT[ID]RはCの値変わんないので、同じ所をどかどか読み書きするんですな。
で、OTIRはZ80DMAとかZ80SIOの初期化に使ってた記憶が。
あのへんは無駄に初期設定大変だったからなあ…
なんて事を書いていたらZ80ファミリハンドブック読みたくなってきた。
どこにしまったかのう。
0438デフォルトの名無しさん
2008/11/11(火) 10:55:230439429
2008/11/11(火) 11:03:31RST 1〜7はoperand errorになりました。return on condition とか call on condition とかも
書式が判りません。 今はコード照合しながら書いてない命令が無いかチェックしてます。
0440デフォルトの名無しさん
2008/11/11(火) 11:29:55例えばこことか
ttp://tomocyan.net/~kagurazaka/html/op_code_01.html
0441429
2008/11/11(火) 12:54:43RSTは番号じゃなくてマスクを書くんですね。
0443デフォルトの名無しさん
2008/11/12(水) 03:31:56rim, sim。それらのコードはz80では全く違うインストラクションに割り当てられている。
8085では8080にこのインストラクションを追加した仕様になっている。
面白いところでは、8085にもz80にもドキュメントされていない隠しニモニックが多数ある。
その辺りは、ますます8085とz80の互換性がなくなる結果になっている。
0444429
2008/11/12(水) 04:38:39割り込みマスクのread/writeなんてごく一部のコードしか使わないから、
アプリ層だったら85のコードをZ80で実行するのはありですね。
でも実際には周辺ICも違うから、なかなかそういう場面はなさそう。
0445デフォルトの名無しさん
2008/11/12(水) 21:10:45他の課題に負われ8085の方の内容がまったくつかめないままここまで来てしまいました
八方塞の状態でまったく出来ません(独自でやっていたのですがとてもでは無いですができそうではないです)
とりあえず形になっていればいいのですが、提出が明日の午前11時が期限になっています
もしよければ協力してくれる方いらっしゃいませんか(当方、かなり必死です…)
課題の内容
8085でデジタル目覚まし時計の作成をせよ
・タイマ割り込みは必須
・設定した時間で音がなる
・複数のスイッチを入力する事で音が止まるようにする
以上の条件を満たす、フローチャートを作成し、プログラムを作成せよ
0446デフォルトの名無しさん
2008/11/12(水) 22:02:56> 8085でデジタル目覚まし時計の作成をせよ
> ・タイマ割り込みは必須
> ・設定した時間で音がなる
> ・複数のスイッチを入力する事で音が止まるようにする
回路図とかあるんかい?
0447デフォルトの名無しさん
2008/11/12(水) 22:04:36無いです
フローチャートを作成して
それに乗っ取ったプログラミングをすることが課題となっています
0448デフォルトの名無しさん
2008/11/12(水) 22:12:02うんじゃ、以下の質問に答えれ
o タイマり込みって何をどう叩いて割り込ませるの?
o 音って何をどう叩いて出てくるの?
o スイッチってどこを読めば ON/OFF 判定できるの?
0450445
2008/11/12(水) 22:43:22パスはsageです
ttp://www.uploda.org/uporg1780635.zip.html
中に説明も書いておきましたのでよろしくお願いします
中にも書いていますが今夜は徹夜でいる予定ですので何時でも質問してくださって大丈夫です
0451デフォルトの名無しさん
2008/11/13(木) 02:42:33ファイルabs.asm=cのmainに飛ばすための初期化コードから:
CSEG
ORG 0000h
LXI SP,0A000h ; RAMの末尾番地
JMP MAIN ; cのmainに飛ばすにはc_main_
ORG 003Ch ; RST7.5の割り込みベクタの番地
JMP TIMER ; 8253という石をつなぎ、ここに割り込みを入れるよう設定する
0452デフォルトの名無しさん
2008/11/13(木) 02:51:00P53_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は書ける?
0454デフォルトの名無しさん
2008/11/13(木) 02:54:42>>452のように8253を初期化
時刻メモリを00:00:00に設定
loop:
SWを読む
SWの時刻とメモリが一致したら音を鳴らす/または止める
loopへJMP
0457デフォルトの名無しさん
2008/11/13(木) 03:04:23CSEGは、リンカで再配置するための命令で、ASEGはASMが吐いたオブジェクトをそのまま
実行アドレスにするためなのは理解してる?
今回は音は単なる断続音でいいと思うから、MUSICのテーブルMUSIC:の所を、
音・休符のくり返しにしておけばいい。
0458デフォルトの名無しさん
2008/11/13(木) 03:10:21P53_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
0459デフォルトの名無しさん
2008/11/13(木) 03:17:02>ORGのアドレスとかは>>453の環境のように直せるよね?
試行錯誤してみますが即時にはちょっと辛いかもしれません
>>458
あまりの優しさに。・゚・(ノД`)・゚・。
0460デフォルトの名無しさん
2008/11/13(木) 03:18:35TIMER: ; 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 ; 割り込んだ次の番地(メインのどこか)に復帰
こういうのが割り込み処理プログラミングの基本的なお作法です。
0462デフォルトの名無しさん
2008/11/13(木) 03:23:48数�`バイト、という物なのでORG 0000hになってるわけ。>>455の環境はASMの吐いたコードを
RAMにロードして実行させる環境なのではないかと思う。ORG 8000hとか書かれてるから。
0464デフォルトの名無しさん
2008/11/13(木) 03:32:33TIMER1: DS 1 ; soft couter 1 100回をカウントし、1秒を作る
SEC: DS 1 ; 秒カウンタ
MIN: DS 1 ; 分カウンタ
HOUR: DS ; 時カウンタ
変数としては最低限、この位は必要だね。
CSEGは上でも書いたけどROMにロードさせるためのアセンブラ命令なので、
>>455はASEGで書き始めればいい。
0466デフォルトの名無しさん
2008/11/13(木) 03:51:44TIMER1を減算、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の番地を書いてね。
プログラムの基本構成はこれで伝わったとおもう。全部書いてあげるのじゃカンニングみたいだし、
そろそろ朝飯食って出勤なので、ここまでにしたい。
0467デフォルトの名無しさん
2008/11/13(木) 03:55:490470デフォルトの名無しさん
2008/11/13(木) 12:19:350471デフォルトの名無しさん
2008/11/15(土) 02:56:220472467
2008/11/15(土) 04:20:180473467
2008/11/15(土) 04:34:120474デフォルトの名無しさん
2008/11/15(土) 09:45:040475デフォルトの名無しさん
2008/11/15(土) 11:30:340476デフォルトの名無しさん
2008/11/18(火) 18:55:09解らない問題で行き詰りました。
こちらで教えて頂ますでしょうか?
スレ違いでしたら申し訳ございません。(CASL�U 福嶋宏訓 著)
0477467
2008/11/19(水) 17:54:400478デフォルトの名無しさん
2008/11/23(日) 06:50:58MASMを使用したいのですが、現在PCにインストールされている
Visual C++ 2008 Expressには、付属していないようですので
http://www.microsoft.com/downloads/details.aspx?FamilyID=7a1c9da0-0510-44a2-b042-7ef370530c64&DisplayLang=ja
このMASMをDLしてインストールしようとしました。
しかし、インストールしようとすると「Visual C++ 2005 Express Edition required」
というメッセージが出てインストールできません。
どうすればMASMを使えるようになるのでしょうか。
0479デフォルトの名無しさん
2008/11/23(日) 07:18:25これがml.exe本体だから適宜リネーム。
0480478
2008/11/23(日) 07:23:50しかし、なぜこんな面倒なことせにゃならんのでしょうかね。
MSはアホなのでしょうか。
0481デフォルトの名無しさん
2008/11/23(日) 08:18:260482478
2008/11/23(日) 08:51:080483デフォルトの名無しさん
2008/11/23(日) 18:04:37どういうプログラムを書いたらいいか分かりません
どなたかヒントください
0484デフォルトの名無しさん
2008/11/23(日) 18:49:420485デフォルトの名無しさん
2008/11/23(日) 18:50:15地道に解析するしかない。
0486デフォルトの名無しさん
2008/11/23(日) 23:04:55ですよね?C言語とかよりも。
0487デフォルトの名無しさん
2008/11/23(日) 23:07:180488デフォルトの名無しさん
2008/11/23(日) 23:07:510489デフォルトの名無しさん
2008/11/24(月) 04:54:02引数リストの場所を覚えておくポインタを設ければいい。cではそのような書き方をしてるはず。
0490デフォルトの名無しさん
2008/11/24(月) 10:17:20_asm{}と__asm{}と2種類を見かけたのですが、どう違うのでしょうか。
0491デフォルトの名無しさん
2008/11/24(月) 13:47:53IA64よりは簡単。VLIWのアセンブラは人間が書くものじゃねえ。
まあ32bitでRing3だけなら簡単な方じゃないかと思う。
>>490
書き方。
0492デフォルトの名無しさん
2008/11/24(月) 20:41:410493デフォルトの名無しさん
2008/11/24(月) 21:51:34消えゆく運命か?
0494デフォルトの名無しさん
2008/11/25(火) 00:09:38まあ、そもそもアセンブラでガリガリ書くようなプロセッサじゃないし
0495デフォルトの名無しさん
2008/11/25(火) 08:32:10初心者にはいいの?
32ビットでも変わらない?
0496デフォルトの名無しさん
2008/11/25(火) 09:30:170497デフォルトの名無しさん
2008/11/25(火) 22:24:25割り込みとか簡単にできたし。
0498デフォルトの名無しさん
2008/11/26(水) 17:36:490499デフォルトの名無しさん
2008/11/26(水) 18:26:22でもいつまで残るんだろね。
Intelがそれを望む限り続くんだろうけどさ。
0500デフォルトの名無しさん
2008/11/26(水) 19:17:204GBフラットアドレスに設定しているだけだと思うのだが。
0501デフォルトの名無しさん
2008/11/26(水) 19:19:41>4GBフラットアドレスに設定しているだけだと思うのだが。
え?そこで使ってるじゃんセグメントレジスタ。
0502デフォルトの名無しさん
2008/11/26(水) 19:20:300503デフォルトの名無しさん
2008/11/26(水) 19:22:090504デフォルトの名無しさん
2008/11/26(水) 19:25:0532ビットCPUでメモリ空間を拡張するカーネルオプションとか
あったような気もするけど...
0505デフォルトの名無しさん
2008/11/26(水) 19:35:37それいったら、どうやってセグメントレジスタ抜きでx86を使うの。
64ビットモードならセグメントレジスタ無視が基本だから、使っていないと言えるだろうけど。
そういえば、x86-64はAMD発だから、
Intelはセグメントレジスタ潰したいのだろうと言う根拠に使うのは苦しいな。
0506デフォルトの名無しさん
2008/11/26(水) 19:56:470507デフォルトの名無しさん
2008/11/26(水) 20:00:520508デフォルトの名無しさん
2008/11/26(水) 20:32:340509デフォルトの名無しさん
2008/11/26(水) 22:02:34386以降だっけか
0510デフォルトの名無しさん
2008/11/26(水) 22:18:210511デフォルトの名無しさん
2008/11/26(水) 23:02:290512デフォルトの名無しさん
2008/11/26(水) 23:15:130513デフォルトの名無しさん
2008/11/27(木) 01:51:030514デフォルトの名無しさん
2008/11/27(木) 02:11:51リアルモードとプロテクトモードの違いのことじゃないよね?
0515デフォルトの名無しさん
2008/11/27(木) 02:34:490516デフォルトの名無しさん
2008/11/27(木) 05:48:170517デフォルトの名無しさん
2008/11/27(木) 11:02:24リアルモードとプロテクトモードと言い換えてもいいか。
0518デフォルトの名無しさん
2008/11/27(木) 11:15:390519デフォルトの名無しさん
2008/11/27(木) 11:24:28386以降ならリアルモードでも仮想86でも可能。
もちろんこのモードでのセグメントレジスタは伝統的な4ビットシフト型となる。
0520デフォルトの名無しさん
2008/11/27(木) 12:01:43プロテクトモード時に設定されたアドレスにアクセス可能
0521デフォルトの名無しさん
2008/11/27(木) 12:51:310522デフォルトの名無しさん
2008/11/27(木) 14:18:520523デフォルトの名無しさん
2008/11/27(木) 15:54:15詳細は知らんが。
0524デフォルトの名無しさん
2008/11/27(木) 21:10:15そんなことするくらいならセレクタ復活させたらいいのにと思っていた。
0525デフォルトの名無しさん
2008/11/27(木) 21:52:51Windowsのカーネルモード時のセグメントセレクタの基本値
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000
CS!=SSですね。
>>524
それじゃAWEのかわりにならんだろ。
0526デフォルトの名無しさん
2008/11/27(木) 22:03:31セレクタが違ってもディスクプリタが同じ領域をポイントしてる可能性もあるのでは。
0527デフォルトの名無しさん
2008/11/27(木) 22:41:20Linuxとかそこらへん向けにそういう実装があったな、名前忘れたが。
4G全域でなく、必要な部分だけにきっちりセグメント範囲を限定することで
想定外のアクセスでフォルト起こすようにするんだったか。
0528デフォルトの名無しさん
2008/11/28(金) 01:36:24だって互換性が・・・。
0529デフォルトの名無しさん
2008/11/28(金) 03:06:03>>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
どうでも良い事だけどね。
0531デフォルトの名無しさん
2008/11/28(金) 09:50:53ついては、簡略・割愛しているのですが、実数定数は初心者には
複雑なのでしょうか?
実数の計算できないとお話にならない気もしますが…
0532デフォルトの名無しさん
2008/11/28(金) 10:01:44浮動小数点が必要な場面でアセンブラを使うような人なら
そのあたりの情報はだいたい見つけられます
0533デフォルトの名無しさん
2008/11/28(金) 10:50:32何のアセンブラかにも拠るからねぇ。定数ロードのインストラクションを持つチップもあることだし、大した話じゃないけどね。
>>532
それは、フォーマットが複雑だといっているのか?
0534デフォルトの名無しさん
2008/11/28(金) 11:15:53入門書を読んでる人にとっちゃ、いろんな意味で複雑でしょ
一通り分かった人ならともかく
0535デフォルトの名無しさん
2008/11/28(金) 12:36:20何を頓珍漢な事言ってるんだ??
実数演算が必要な所では計算式も煩雑だろうに
素直に高級言語使ってろって話だと思うがな。
0536デフォルトの名無しさん
2008/11/28(金) 12:40:33# 実在するかは兎も角
invPi: ld rf0, #1.0
ldpi rf1
div rf0, rf1
ret
>>535
そうは言うがな大佐、読める能力はあるに越したことはないと思うぞ。
0538デフォルトの名無しさん
2008/11/28(金) 14:52:440539デフォルトの名無しさん
2008/11/28(金) 14:54:241.実数計算機能が無いCPU
2.実数計算機能があり、直値のロードができないCPU
3.実数計算機能があり、直値のロードが可能なCPU
と分けるとx86系は2になるので、x86で定数は静的なデータとして定義する必要がある。
.DATA
hoge REAL8 10.12345
.CODE
FLD hoge
FLDPI ; 円周率の定数ロードは専用命令があったりする。
0540デフォルトの名無しさん
2008/11/28(金) 19:44:11SSEx 使った方が楽なんじゃないか。
0541デフォルトの名無しさん
2008/11/28(金) 23:39:33ボクの486SXマシンじゃ実行出来ません ><
0542デフォルトの名無しさん
2008/11/29(土) 00:34:00Win9xやNTのWin32アプリならx87のエミュレーションやってくれる。
>>540
XMMをスカラで使うと何か損した気分になる。
0543デフォルトの名無しさん
2008/11/29(土) 11:03:270544デフォルトの名無しさん
2008/11/29(土) 11:17:51アセンブラはVS2008についてくるWin32用のでいけるけどね。
0545デフォルトの名無しさん
2008/11/29(土) 11:50:46lnk563.exeなるものを調達してきて、その中からlink.exeを取り出しました。
試しに実行ファイルを作ってみようと、ml ver9とそのlink.exeをasmファイルの
あるディレクトリにぶちこんで
ml /omf ???.asm
と打ち込んだら、アセンブルは完了したのにリンカが自動呼び出しさせません。
なぜでしょうか。
0546デフォルトの名無しさん
2008/11/29(土) 12:24:51>リンカが自動呼び出しさせません
って、実行のことか?
0547デフォルトの名無しさん
2008/11/29(土) 12:40:350548デフォルトの名無しさん
2008/11/29(土) 13:03:560549545
2008/11/29(土) 13:10:02ただし、OMF形式でなくて、COFF形式でオブジェクトファイルを作成する
必要がありますが…。
16ビットの場合はOMF形式じゃないとだめらしいのですが、それで作っても
リンカは呼び出されません。自前で全部引数入れなきゃだめですかね。
0550デフォルトの名無しさん
2008/11/29(土) 18:37:460551545
2008/11/30(日) 00:52:020552デフォルトの名無しさん
2008/12/02(火) 12:10:42CPUのキャッシュとDMAによる物理メモリへの書き込みとを同期させる
には、far jmp 命令を実行すれば良かったんでしょうか?
0553デフォルトの名無しさん
2008/12/02(火) 14:56:45と同期する、という噂がありますが、正式な資料がどこかにありませんかね。
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.
0554a
2008/12/02(火) 15:06:540555デフォルトの名無しさん
2008/12/03(水) 00:04:07ハードの実装次第
0556デフォルトの名無しさん
2008/12/03(水) 00:59:39far jmpはパイプラインが捨てられるだけだ。
キャッシュきれいにしたけりゃwbinvdあたり使わねば。
0557デフォルトの名無しさん
2008/12/03(水) 01:47:07自己書き換えコードの直後に jmp するというのはキャッシュ・クリア
ではなくパイプライン・クリアでしたっけ?
言われてみれば、データ用のキャッシュは、CPU自身の書き換えでは
整合するに決まってますね。
0558デフォルトの名無しさん
2008/12/03(水) 01:53:55PCIは、あるデバイスがマスターになって、メモリに転送する機能が
定められている。Legacy DMAは、ISAバスに繋がっているが、ISAバスは
ISA-PCIブリッジによってPCIバスに繋がっている。
Legacy DMA転送は、PCIのこの転送機能を利用しているのだろうか?
0559デフォルトの名無しさん
2008/12/04(木) 02:16:42そりゃブリッジがバスマスタになってごにょごにょしなけりゃ、
DMAにならんだろう。
0560デフォルトの名無しさん
2008/12/04(木) 07:53:34PCIバスマスタ転送は、自動的にチップセットによってsnoopされ、
CPU内部のキャッシュと同期が取られるはずなので、
Legacy DMA 転送も、CPUの内部キャッシュと勝手に同期される
ということで正しいのだろうか。
0561デフォルトの名無しさん
2008/12/04(木) 09:34:17動かなくなってしまうのではないかと。
ISAのバスマスタなんてとんでもないモノは無理だと思うが。
0562デフォルトの名無しさん
2008/12/04(木) 10:03:45てっきり、仮想8086モードでjmp far ptrを行うと、キャッシュや
パイプラインなどが実メモリと同期される性質(未確認)を使っているの
かと思ってますた。
チップセット内蔵の8237同等パーツは、今でも実メモリに直に繋がっている
ようにエミュレートされているのかと思ってましたが、そうではないの
かも知れませんね。
今は、絶対に、PCIのバスマスタ転送を利用していて、勝手にsnoopされて
いるんだという明確な証拠が欲しいですが。
0563デフォルトの名無しさん
2008/12/04(木) 22:02:23ちなみにキャッシュは気にする必要がない。そうでなければ既存のOSが動かなくなる。
0564デフォルトの名無しさん
2008/12/09(火) 06:21:42便乗質問ですが、この場合CPUからの書き込みも何も気にする必要がないんでしょうか?
それともドライバーで何かの処理(DMAの領域はキャッシュ不可(ライトスルー)にする
等)が必要でしょうか?
ちなみにむかーし自分がm68kの乗ったマシンのドライバを書いた時はその手の処理を
したように記憶しています。今どき(?)のx86 & PCIのドライバに関してこの辺の知識を
得たいと思ったら何かお勧めの書籍等ありますかね?
0565デフォルトの名無しさん
2008/12/10(水) 14:18:11使うアセンブラはyasm
汎用32ビットレジスタは eax,ebx,ecx,edx とかあるけど
汎用64ビットレジスタって rax,rbx,rcx.. .とか先頭にrを付けるのでいいのかな
0566デフォルトの名無しさん
2008/12/10(水) 14:43:380567デフォルトの名無しさん
2008/12/10(水) 20:59:37読まないんじゃなくて読めない
ゆとりです
0569デフォルトの名無しさん
2008/12/11(木) 03:34:33アセンブラの段階まで書き下してくれるようなソフトってすでにあったりしませんか?
FF DE FF E7 FF DE ・・・・・・
↓
bx lr
なんていうかこんな感じで
0570デフォルトの名無しさん
2008/12/11(木) 03:50:02あったな、あった。
昔はそんなの沢山あったな。
まあ、難しいもんでもないから自分で作ってみたら?
データとプログラムの区別とか、ジャンプテーブルの解釈がミソだぜ。
0571デフォルトの名無しさん
2008/12/11(木) 03:50:360572デフォルトの名無しさん
2008/12/19(金) 16:44:550573デフォルトの名無しさん
2008/12/19(金) 17:02:330574デフォルトの名無しさん
2008/12/19(金) 19:32:32違法行為やめろ
0576デフォルトの名無しさん
2008/12/19(金) 20:28:38なにがどう違法行為なんだかw
もうすぐ合法になって、契約による縛りも無意味になるご時世だというのに。
0578デフォルトの名無しさん
2008/12/20(土) 01:18:10適当にもらってから頑張って再配置とか。
0579デフォルトの名無しさん
2008/12/20(土) 10:52:50それじゃ命令内のアドレスが無茶苦茶だろ。
0581デフォルトの名無しさん
2008/12/20(土) 11:00:480583デフォルトの名無しさん
2008/12/20(土) 11:05:500585デフォルトの名無しさん
2008/12/20(土) 11:22:07どうして何の情報も出してない572の想定が分かるのだろうか。
0587デフォルトの名無しさん
2008/12/20(土) 13:22:160588デフォルトの名無しさん
2008/12/21(日) 11:56:490589デフォルトの名無しさん
2008/12/21(日) 20:09:21危険だけど好きな事が出来るのがアセンブラの醍醐味なんだからな。
0590デフォルトの名無しさん
2008/12/22(月) 08:24:120591デフォルトの名無しさん
2008/12/22(月) 14:03:180592デフォルトの名無しさん
2008/12/22(月) 15:45:230593デフォルトの名無しさん
2008/12/23(火) 10:31:13ハード叩きまくりだったからなあ。
再起不能になって修理するハメになったり…
0594デフォルトの名無しさん
2008/12/28(日) 00:52:290595デフォルトの名無しさん
2008/12/28(日) 01:00:400596デフォルトの名無しさん
2008/12/28(日) 08:44:520597デフォルトの名無しさん
2008/12/29(月) 01:21:280598デフォルトの名無しさん
2008/12/29(月) 07:11:300599デフォルトの名無しさん
2008/12/29(月) 09:01:180600,,・´∀`・,,)っ-●◎○
2008/12/29(月) 09:11:440601デフォルトの名無しさん
2008/12/31(水) 20:11:030602デフォルトの名無しさん
2009/01/03(土) 14:02:06下記のような単純なコードを書いて文字列を出力させようとしているのですが、
どうしてもcore dumpが起こってしまいます。
単純な忘れ物をしているだけのような気がするのですが。。。。
なにか手がかりを教えていただけると助かります。
int main(void)
{
__asm__(
"movl $0x4,%eax \n\t"
"movl $0x1,%ebx \n\t"
"movl $msg,%ecx \n\t"
"movl $0x4,%edx \n\t"
"int $0x80 \n\t"
"msg: .string \"aaa\\n\" \n\t"
);
return 0;
}
ちなみに環境はvine linux 4.2でgccでコンパイルをかけています。
0603デフォルトの名無しさん
2009/01/03(土) 14:38:24int 0x80ってどのハードのどのOSのソフトウェア割り込みだよおい。
0604デフォルトの名無しさん
2009/01/03(土) 14:55:27int $80はどこに戻ってくるでしょうか。
>>603
vineならlinux-x86と仮定してもいいんでないかい。
0605デフォルトの名無しさん
2009/01/03(土) 14:57:000606デフォルトの名無しさん
2009/01/03(土) 15:43:48ttp://www.ctyme.com/intr/rb-8144.htm
0607デフォルトの名無しさん
2009/01/03(土) 15:48:00じゃあ一瞬全処理止めてからディレクトリ作ってんの?
まあ、自然に排他処理になるからいいっちゃいいけど、
止めなくてもいい処理も止まるよね。
でもまあ普通は激しく繰り返し実行するもんでもないから、
割り込みでも特に問題ないのかね。
0608602
2009/01/03(土) 16:28:15すばやいレス、ありがとうございます。
一応解決しました。
>>603
おっしゃる通り、linux-x86です。
>>606
ありがとうございます。
システムコールのwriteは実行していたのですが、
exitはしていなかったので追加したらcore dump
しなくなりました。
0609602
2009/01/03(土) 16:28:50int main(void)
{
__asm__(
//システムコール(write)の設定
"movl $0x4,%eax \n\t"
//出力先を標準出力に設定
"movl $0x1,%ebx \n\t"
//出力文字の設定msg:aaa
"movl $msg,%ecx \n\t"
//文字列長の設定 3文字+改行
"movl $0x4,%edx \n\t"
//実行
"int $0x80 \n\t"
//出力文字はaaa\n
"msg: .string \"aaa\\n\" \n\t"
//システムコール(exit)の設定
"movl $0x1,%eax \n\t"
//実行
"int $0x80 \n\t"
);
return 0;
}
0610デフォルトの名無しさん
2009/01/03(土) 16:30:21最初の "int $0x80 \n\t" の割り込みが終了した後に
"msg: .string \"aaa\\n\" \n\t" が「実行」されてしまうのが
問題なんじゃないの?
0611デフォルトの名無しさん
2009/01/03(土) 16:51:00どうやるか参考になるサイトとかありませんか?
(要するに自作 OS とか作ってみたいのです)
0612デフォルトの名無しさん
2009/01/03(土) 16:58:0032-bit OS を作ろうとしています。
0613デフォルトの名無しさん
2009/01/03(土) 17:06:53リファレンス的な感じだけど。
http://community.osdev.info/index.php?%28AT%29BIOS
ようはINT 13Hを叩くんだ。
0614デフォルトの名無しさん
2009/01/03(土) 17:11:59これって32ビットモードでも動きます?
0615デフォルトの名無しさん
2009/01/03(土) 17:54:56>>607
> mkdir とか割り込みで実現してんのか。
mkdirに限らずシステムコールは全部割り込みでトリガするわけだが...
>>611
知らんけどOS30日本程度の内容はマスターしたの?
0616デフォルトの名無しさん
2009/01/03(土) 18:00:25OS30日本は読んでます。
でも、この本だとディスク読み込みを
16-bit モードの間に全部やっちゃって、
あとは全くディスクアクセスしないんですよね・・・。
0617デフォルトの名無しさん
2009/01/03(土) 18:27:15ちと読んでみます。
0618602
2009/01/03(土) 18:53:00>>615
そうなんですか。
"msg: .string \"aaa\\n\" \n\t"
をインラインアセンブラの最終行に持ってくるのでしょうか。。。
とにかく、まだ理解不足なので勉強を続けたいと思います。。
0619デフォルトの名無しさん
2009/01/03(土) 18:57:28msg の後にジャンプすればいいべ
0620602
2009/01/03(土) 19:19:54アドバイス、ありがとうございます。
このような具合でしょうか?
ただ、終了処理を入れないとやはりcore dumpしました。
int main(void)
{
__asm__(
//出力文字はaaa\n
"msg: .string \"aaa\\n\" \n\t"
"jmp shori \n\t"
//文字列出力処理
"shori: \n\t"
"movl $0x4,%eax \n\t"
"movl $0x1,%ebx \n\t"
"movl $msg,%ecx \n\t"
"movl $0x4,%edx \n\t"
"int $0x80 \n\t"
//終了処理
"exit: \n\t"
"movl $0x1,%eax \n\t"
"int $0x80 \n\t"
);
return 0;
}
0621デフォルトの名無しさん
2009/01/03(土) 19:21:44ああもう。msg を飛び越えるように jmp しろと。
0622デフォルトの名無しさん
2009/01/03(土) 19:22:340623デフォルトの名無しさん
2009/01/03(土) 19:23:48いじり方がまだよく分からないのですが、
糸口は見つかったので頑張ってみます。
0625デフォルトの名無しさん
2009/01/03(土) 21:47:01HDD 扱いたいのでやっぱ FDC のサポートは後回しーってことで、
HDD は IRQ 14, 15 (IDE コントローラ)を通じて扱えるっぽい、と、
>>623 を見て混乱する人がいないように、念のためメモ。
BIOS が使えるなら、拡張 INT 13h でおk、と。
0626デフォルトの名無しさん
2009/01/03(土) 22:26:16どう使えばいいのか分かんないや・・・。
まあ、あとはそのうち仮想環境でいじってみるか。
01f0-01f7 : ide0
fc00-fc07 : ide0
0170-0177 : ide1
fc08-fc0f : ide1
http://www.cqpub.co.jp/column/books/2001a/34331PC_Legacy/default.htm
http://www.philipstorr.id.au/pcbook/book2/ioassign.htm
0627デフォルトの名無しさん
2009/01/04(日) 02:17:31http://community.osdev.info/index.php?ATA
http://www.t13.org/Documents/UploadedDocuments/project/d1410r3b-ATA-ATAPI-6.pdf
0629デフォルトの名無しさん
2009/01/04(日) 07:25:320630デフォルトの名無しさん
2009/01/04(日) 12:57:59おお、サンクス。
>>629
すまん。これで終わりにする。
0631デフォルトの名無しさん
2009/01/07(水) 18:49:34仕方のないこと。
0632デフォルトの名無しさん
2009/01/07(水) 20:45:35もう見てないかもしれないけど
この場合、プログラムの終了ステータスは何になるか、わかってるのかな。
やたらタブとか入ってるのは、単にコンパイルするだけじゃなくて gcc の中間出力を
見るためなんだろうなあ。だったら最初からインラインじゃなくて普通にアセンブラで
書けばよくね? gcc が補ってくれる「余計な」部分が入らなくてスッキリすると思うw
Vine Linux 4.2 だとカーネルは 2.6 系列みたいなので、システムコールには
int 0x80 以外にも sysenter が使える。後者の方が今は主流だと思う。
0633デフォルトの名無しさん
2009/01/08(木) 01:57:00"\t"入れないとgasが文句言ってきたような気がする。
sysenterはPentiumで試したらSIGILLしました。
とか突っ込まれることになるので、お遊びレベルならintでいいんでないかと。
0634デフォルトの名無しさん
2009/01/08(木) 07:03:12>"¥t"入れないとgasが文句言ってきたような気がする。
ああそういう積極的意味があったのですか。
>sysenterはPentiumで試したらSIGILLしました。
>とか突っ込まれることになるので、お遊びレベルならintでいいんでないかと。
確かに。不確定な要素はなるべく減らした方がいいですね。
特に最初のうちは、その位のことでも何が悪いかわかるまでに猛烈に時間がかかったり
するし。人によってはそこで game over。
まあそういうのが訓練になるとも言えるのだが。
0635デフォルトの名無しさん
2009/01/16(金) 15:54:30質問スレから誘導されてきますた
さっぱりわからないので一部でもいいので解き方をお願いします
一問目
0100 MOV AX,5
AX=
二問目
0100 MOV AX,A
0103 ADD AX,5
AX=
三問目
0100 MOV AX,C
0103 SUB AX,5
AX=
四問目
0100 MOV AX,4
0103 SHL AX,1
AX=
五問目
0103 MOV AX,F
0103 CMP AX,5
AX=
0636デフォルトの名無しさん
2009/01/16(金) 18:25:46一問目は解いてもらってるだろ
ADDは加算、SUBは減算、SHLは指定されたビット数だけ左シフト、CMPは二つの数を比較
x86のアセンブラの本を一冊買って勉強汁
0637デフォルトの名無しさん
2009/01/16(金) 19:35:50ありがとうございます
愚妹が大学の授業で(一応)やったらしいのだが、試験前になって全くわからないから兄さん助けてとorz
話を全く聞いてなかったんだろうな
それで兄が頑張って理解しようとしているわけです
やっぱり本買ってくるわノシ
0638デフォルトの名無しさん
2009/01/16(金) 21:03:32本を読んで何となくの概念と一問目と四問目はわかりました
が、それ以降は相変わらずorz
二問目
0100 MOV AX,A
0103 ADD AX,5
AX=15([F])←ここの表記は曖昧
の場合はAをAXに移動してAと5を足してAXの欄に書くっていうことだよな?
どこからこの答えが出たのか教えて
三問目
0100 MOV AX,C
0103 SUB AX,5
AX=7
CをAXに移動してCから5を引いてAXの欄に?
五問目
0103 MOV AX,F
0103 CMP AX,5
AX=(15[F])
FをAXに移動してFと5を比較して値が同じならZF=1?
俺の頭じゃどうしても答えにたどり着かないわorz
0639デフォルトの名無しさん
2009/01/16(金) 21:09:39A+5=15
C=12
C-5=7
F=15
0640デフォルトの名無しさん
2009/01/16(金) 21:15:1916進数を10進数に直したってこと?
それならわかったわ
ただ五問目もうすこしkwsk
比較したのに15のままなのが?
0641デフォルトの名無しさん
2009/01/16(金) 21:36:460642デフォルトの名無しさん
2009/01/16(金) 22:01:41これで半分終了…あと五問あるぜorz
問A 4×8(4を8回足す)計算
一問目
0100 MOV AX,0
0103 MOV BX,8
0106 ADD AX,4
0108 DEC BX
0109 JNZ 0106←本来の問題ではここを選択して書く
俺の考え
0をAXに、8をBXに移動
4の16進数4をAX=0に加える
BX=8から1を引く
それが0じゃなければ0106へジャンプ?←どうしてこれが選ばれるかさっぱり
二問目
0100 MOV AX,0
0103 MOV BX,0
0106 ADD AX,4
0109 INC BX
010A CMP BX,8
010D JNE 0106←本来の問題では(ry
俺の考え
0をAXに、0をBXに移動
4の16進数4をAX=0に加える
BX=0に1を加算
BX=1と8を比較
等しくないならジャンプ?←どうしてこれが(ry
0643デフォルトの名無しさん
2009/01/16(金) 22:12:35一問目
0100 MOV AX,0
0103 MOV BX,F
0106 ADD AX,BX
0108 SUB BX,1
010B JNZ 0106
0をAXに、FをBXに移動
BX=FをAX=0に足す(Fは10進数で15だから15?)
BX=Fから1を引く(14?つまりは16進数だとE?)
0じゃなかったらジャンプ←まず何が0じゃなかったら?
二問目
0100 MOV AX,0
0103 MOV BX,F
0106 ADD AX,BX
0109 DEC BX←本来ここを書く。なんでこうなる?
010A JNZ 0106
基本的に一問目と同じ程度の考えしかないorz
0644デフォルトの名無しさん
2009/01/16(金) 22:47:50一問目
BXは後何回4を足すかっていうカウンタ
AXに4を足す
BXから1引く
を繰り返し
BXが0になったら終わり
二問目
BXは何回4を足したかっていうカウンタ
AXに4を足す
BXに1足す
を繰り返し
BXが8になったら終わり
問B 1から15の正数の足し算
一問目
BXをAXに足す
BXから1引く
の繰り返し
BXが0になったら終わり
最初15を足して 1引いた14を足して 1引いた13を足してって
AX=15+14+13+....+1
二問目
0109 DEC BX と 一問目の 0108 SUB BX,1 は同じ
BXから1引く
0645デフォルトの名無しさん
2009/01/16(金) 23:57:13int bx = 8;
while (bx != 0)
{
ax += 8;
bx--;
}
0646デフォルトの名無しさん
2009/01/17(土) 00:03:51最初に ax を初期化(=0)して、そこに、8回分4を出していくわけだ。
最初は bx == 8 だけど、dec すると、bx は 8→7,6,5,4... と減っていく。
※ bx は『あと、bx 回処理をする』という意味。
だから、あと1回以上処理をするなら、ax を加算しているアドレス0106h に戻るわけだ。
下のほうは、『これまでに、bx 回処理をした』って感じで数え上げている。
最初は bx == 0 だけど、0 → 1, 2, 3,... 。
だから、まだ8回処理していないなら、アドレス 0106h に戻れっと。
0647デフォルトの名無しさん
2009/01/17(土) 00:14:11一問目の 8 から数え下げる方法と、0 から数え上げる方法では、"cmp bx,8" を省略できるので、上のほうが上級者っぽい。
>>643
"sub bx,1" よりも "dec bx" のほうが、命令長が1バイト短い。(8086 あたりならdecのほうが速い)。
だから、特別な意図が無い限りワード命令の場合、sub より dec を使う。
0648デフォルトの名無しさん
2009/01/17(土) 07:19:12これから俺の足りない頭で愚妹のために解説プリント作ってくるわ
またわからないことがあったら質問させてください
本当にありがとうございます
0649デフォルトの名無しさん
2009/01/17(土) 08:55:3211の2乗のプログラム
0100 MOV AX,0
0103 MOV BX,B
0106 ADD AX,BX
0108 ADD AX,BX
010A DEC AX
010B DEC BX
010C JNZ 0106
これを参考に8の2乗のプログラムを作成しなさい
これは全くもってさっぱり
どのあたりが11の2乗なのかもわからないorz
0650結論は最後にw
2009/01/17(土) 09:26:4816進数に慣れておく必要があるな。
11はb(16)となる。
つまり、mov bx, bで11を代入しているわけだ。
他を見てないのだけど、一応C風に書き直すとこうなる。
ax = 0;
bx = 11;
do {
ax += bx;
ax += bx;
--ax;
--bx;
} while (bx != 0);
これを更に書き直すとこう。
ax = 0;
bx = 11;
do {
ax += 2 * bx - 1;
--bx;
} while (bx != 0);
これを展開すると、
ax = (2 * 11 - 1) + (2 * 10 - 1) + ... + (2 * 1 - 1);
となって、
ax = 21 + 19 + ... + 1;
となり、これは当然121になる。
つまり、奇数列の初項からの部分和が平方数になることを利用しているわけだ。
要は8の2乗にしたいのなら、単純にmov bx, 8でいい。
0651デフォルトの名無しさん
2009/01/17(土) 11:28:03C言語もよくわからないけどなんとなくわかってきたw
ただADDの列が2回ある意味がわかりませぬorz
大切なことだから2度言いました、が思い浮かぶ…w
0652デフォルトの名無しさん
2009/01/17(土) 11:37:36試しに、(逆順になるけど) 1 + 3 + 5 + 7 + 9 + 11 + ... って計算を手でしてご覧。
1, 4, 9, 16, ... って風に平方数が出てくるのが判るべさ。
0653デフォルトの名無しさん
2009/01/17(土) 11:49:22二乗を求めるために、わざわざ級数の総和をループで計算することに何の意味があるんだ。
作った奴の頭の悪さ、自己顕示欲の強さがまる見えだ。
こんな手法が必要になる状況なんて西暦5000年になっても来ないに決まってる。
代わりにもうちょっとマシな問題を。
昔のCPUは掛け算が出来なかったので、加減算を組み合わせて掛け算を行っていたことがある。
たとえばPC8001は(古いな)、画面一行に120バイト必要としていたため、120倍の計算をする
必要があったのだが、入力を120回加算していてはただでさえ遅いCPUがますます遅くなる。
そこで、ループでない方法で、掛け算を使わず、出来るだけ高速に、
入力を120倍する計算を行うサブルーチンを作れ。
0654デフォルトの名無しさん
2009/01/17(土) 11:53:10ごめんな、ものわかり悪くてorz
ようやく理解しますた
>>653
しょせん小娘たちの試験問題だからこういう問題なんだと…
もっと実用的なものやってほしいわ
0655デフォルトの名無しさん
2009/01/17(土) 12:28:58当時はビットシフトも1つずつしかできなかった、という条件も必要では
0656デフォルトの名無しさん
2009/01/17(土) 12:34:360657デフォルトの名無しさん
2009/01/17(土) 14:09:38>必要があったのだが、入力を120回加算していてはただでさえ遅いCPUがますます遅くなる。
いや、それはCPUに対して失礼だ。CPUが遅くなるわけじゃないからな。
0658デフォルトの名無しさん
2009/01/17(土) 15:21:190659デフォルトの名無しさん
2009/01/17(土) 16:00:29LD L,0
SRL H
RR L ;HL = A*128
RLCA
RLCA
RLCA
LD E,A
LD D,0 ;DE = A*8
AND A ;CF=0
SBC HL,DE
RET
0660デフォルトの名無しさん
2009/01/17(土) 17:13:47LD L,A
LD H,0
ADD HL,HL
ADD HL,HL
ADD HL,HL
LD E,L
LD D,H ;DE = A*8
ADD HL,HL
ADD HL,HL
ADD HL,HL
ADD HL,HL ;HL = A*128
AND A ;CF=0
SBC HL,DE
RET
0661デフォルトの名無しさん
2009/01/17(土) 18:42:27add ax,ax ; 2倍
add ax,ax ; 4倍
add ax,ax ; 8倍
mov dx,ax ; dx == 8倍
add ax,ax ; 16倍
add ax,ax ; 32倍
add ax,ax ; 64倍
add ax,ax ; 128倍
sub ax,dx ; 120倍
8086 に直すとこういうことか。
0662デフォルトの名無しさん
2009/01/17(土) 18:51:33128倍でオーバーフローするかもしんないぜ。
0663デフォルトの名無しさん
2009/01/17(土) 19:17:140664デフォルトの名無しさん
2009/01/17(土) 19:32:30mov ah, al
shr ax, 1
で 128 倍できるぜ。
0665デフォルトの名無しさん
2009/01/17(土) 19:35:140666デフォルトの名無しさん
2009/01/17(土) 19:35:520667デフォルトの名無しさん
2009/01/17(土) 19:36:010668デフォルトの名無しさん
2009/01/17(土) 19:57:090669デフォルトの名無しさん
2009/01/17(土) 19:59:21jne hoge
mov ax, 36
hoge:
0670デフォルトの名無しさん
2009/01/17(土) 20:01:100671デフォルトの名無しさん
2009/01/17(土) 20:08:430672デフォルトの名無しさん
2009/01/17(土) 20:19:310673デフォルトの名無しさん
2009/01/17(土) 20:22:200674デフォルトの名無しさん
2009/01/18(日) 00:04:24寝れないじゃないの
0675デフォルトの名無しさん
2009/01/18(日) 00:08:020676デフォルトの名無しさん
2009/01/18(日) 00:25:050677デフォルトの名無しさん
2009/01/18(日) 12:37:05> 二乗を求めるために、わざわざ級数の総和をループで計算することに何の意味があるんだ。
> 作った奴の頭の悪さ、自己顕示欲の強さがまる見えだ。
> こんな手法が必要になる状況なんて西暦5000年になっても来ないに決まってる。
ループのプログラムの例題として、ふつーこんな求め方しねーだろwwww なものを
使うのはよくあると思うぞ。まぁそうでないものを例に使う方がいいとは思うが。
0678デフォルトの名無しさん
2009/01/18(日) 16:26:200679デフォルトの名無しさん
2009/01/20(火) 01:18:01xor dx,dx
@@:
cmp ax,10
jb @f
sub ax,10
inc dx
jmp @b
@@:
xchg ax,dx
これでいいの?識者の方デバッグして
さすがに加減算はいるよ。
0680デフォルトの名無しさん
2009/01/21(水) 01:32:0127.2 除算 参照
0681デフォルトの名無しさん
2009/01/21(水) 11:38:290682デフォルトの名無しさん
2009/01/26(月) 00:59:10この前手取り足取り教えていただいた兄です
愚妹から100パーではないけど意味がわかったおかげでそれなりに解けたと連絡が来ました
本当ありがとうございました
0683デフォルトの名無しさん
2009/02/07(土) 12:37:36時々CASLも書いてある
0684デフォルトの名無しさん
2009/02/08(日) 02:28:330685,,・´∀`・,,)っ-●◎○
2009/02/08(日) 04:57:41更にpminubを使って100との比較をし、上限100に切ればいい。
0686デフォルトの名無しさん
2009/02/08(日) 05:12:370687,,・´∀`・,,)っ-●◎○
2009/02/08(日) 05:26:490689,,・´∀`・,,)っ-●◎○
2009/02/08(日) 05:36:500690デフォルトの名無しさん
2009/02/08(日) 05:58:030691デフォルトの名無しさん
2009/02/08(日) 06:12:420692デフォルトの名無しさん
2009/02/08(日) 12:49:040693デフォルトの名無しさん
2009/02/08(日) 14:47:06やりたいのはADPCMデコードの高速化でした。
0694デフォルトの名無しさん
2009/02/08(日) 15:05:070696デフォルトの名無しさん
2009/02/08(日) 19:14:490697デフォルトの名無しさん
2009/02/10(火) 00:08:01今もっている MS-C 6 は、PC-98 用なので、x87 命令の関係で PC/AT では難があるのです。
MASM で作った関数がかなりたくさんあるので、できれば、MS-C 互換のものが良いです。
0698デフォルトの名無しさん
2009/02/10(火) 00:10:23つdebug
ただしcom専用w
0699デフォルトの名無しさん
2009/02/10(火) 00:12:09http://pc11.2ch.net/test/read.cgi/tech/1033433728/l50
0700デフォルトの名無しさん
2009/02/10(火) 02:53:320701デフォルトの名無しさん
2009/02/10(火) 03:03:50もっと本格的に解析できるのはなんかある?
フリー&&オープンで。
0702デフォルトの名無しさん
2009/02/10(火) 06:35:43gccとNASMの組み合わせじゃダメ?
DOS用にリンカスクリプトとcrt書けばx86向けの奴でいけたはず。
0703デフォルトの名無しさん
2009/02/10(火) 11:58:54このスレ的な解法を提示すると
emoem.asm をいじればIBM-AT互換機用にできる。
0704デフォルトの名無しさん
2009/02/20(金) 06:26:060705デフォルトの名無しさん
2009/02/20(金) 07:03:410706デフォルトの名無しさん
2009/02/20(金) 08:47:31axを25.6倍してから、256で割る(>>8する)。といいたいけど、ちと誤差が多いので、
51倍(≒25.6×2)してから、512で割る(>>9する)。オーバーフローに注意。
掛け算も禁止なら、左シフトと加算で臨機応変に。
って、いまさらだれも見とらんか。。。
0707デフォルトの名無しさん
2009/02/21(土) 00:00:230708デフォルトの名無しさん
2009/02/21(土) 04:46:570709708
2009/02/21(土) 15:51:070710デフォルトの名無しさん
2009/02/21(土) 23:44:54http://www.amazon.co.jp/dp/4434046683
0711デフォルトの名無しさん
2009/02/22(日) 00:44:44最近の話題で覚えた方が良いよってのがあったら教えてください。
(それにしてもアセンブリ言語関係は最近の和書が少ないですね)
0712デフォルトの名無しさん
2009/02/22(日) 03:02:110713デフォルトの名無しさん
2009/02/23(月) 09:45:38ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか
0714
2009/02/25(水) 21:36:57pushに即値をオペランドとして渡すことはできないのですか?
インテルのIA32のマニュアルでpushの項目に
6A PUSH imm8 imm8をプッシュする
と書いてあるのでできそうに思えるのですが
たんにpush 08H
とかしてもエラーになります。
型がわからないからエラーになるのか、それとも即値ではいけないのでしょうか?
0715デフォルトの名無しさん
2009/02/25(水) 21:44:3716bit時代はできなかったと思う。
0716デフォルトの名無しさん
2009/02/25(水) 21:44:54MSDOSの16bit用のを書いてました。
でも
>>716さんの言うとおりするとできました。
.186ってことは8086じゃできなかったけど80186からできるようになったということですね。
ありがとうございました。
まあ目的もなしに勉強してるだけだから困るわけじゃないけど。
ヘッダの情報のところに
Relocation data = Offset:x001E, size:x0004
ってあるんですけど、これは何を意味してるんですか?
Offset:x001EはIMAGE_DOS_HEADER構造体のe_lfarlcの値らしいのですが
最初のリロケーション項目のオフセットっとかいう説明を読んでも、どういう意味を持つのかわかりません。
0720デフォルトの名無しさん
2009/02/26(木) 02:48:46ローディング時に値を設定する必要があるセグメントアドレスへのポインタリストのファイル内オフセット。
セグメントアドレスの個数はe_crlc。
かな?
0721デフォルトの名無しさん
2009/02/26(木) 03:01:45とする。プログラムのなかでセグメントアドレスを使用している部分。このセグメントアドレスは
ローディング時に値が決まるのでローダーが値を書き換えて上げなければならない。
その値を書き換えるべき対象のポインターリストが「リロケーション項目」。
どうもありがとうございます。
1Eとあったということは、ファイルの先頭から1Eバイト目を指しているということで
そこを見ると07とありました。
ファイルの先頭から1Eバイト目には、IMAGE_DOS_HEADER構造体のフィールド e_res[4];// Reserved wordsがくるはずで
予約領域で常に0に設定されてるとか解説してるWebページをみましたが、
自分のプログラムをコンパイルした結果は値が設定されてるのはなぜかと思ってましたが、この値なのですね。
link16でリンクしたからその結果なのでしょうか。他のプログラムは1Eじゃなく40がほとんどでした。
で、そこにある値07の意味なのですが、自分の書いたコードがマシン語になった7バイト目は
mov ax,dsegという命令のdsegにあたる部分で、DSの値がくるはずのバイトでした。
ここをさしていると考えていいみたいですね。たしかにロードされた場合、そこは実際のDSの値に書き換えなくちゃいけませんからね。
0725デフォルトの名無しさん
2009/02/26(木) 18:34:04BIOSのシステムコールの0x18が使い方わからん・・
教えてくれ
0726デフォルトの名無しさん
2009/02/26(木) 19:24:23というかこれ見ると、
ttp://www.ctyme.com/intr/int-18.htm
GUS のドライバとか DISKLESS BOOT HOOK とか
今普通使いそうにない機能ばっか。
もしかして98?
0727デフォルトの名無しさん
2009/02/26(木) 19:29:580x18で確か・・周辺機器リストの取得だったはず
0728デフォルトの名無しさん
2009/02/26(木) 20:07:21これかな?
0729デフォルトの名無しさん
2009/02/26(木) 21:21:110730デフォルトの名無しさん
2009/02/26(木) 23:24:07and
0731デフォルトの名無しさん
2009/02/26(木) 23:56:460732デフォルトの名無しさん
2009/02/27(金) 00:02:170733デフォルトの名無しさん
2009/02/27(金) 00:04:28目隠しして手探りで一つずつ選んでいく
0734デフォルトの名無しさん
2009/02/27(金) 00:10:21LSB 側にフィールド位置だけよせて, フィールドサイズの 1 のビットを
積めたもので and を取れと言われてるんだが, この説明で分かるか?
0735デフォルトの名無しさん
2009/02/27(金) 10:10:53検索してみると、INT18 Device ってのもあるらしいんだが...
ネットワークブート?
どの機器のBIOSかを、明示せよ。
0737デフォルトの名無しさん
2009/02/27(金) 16:32:10>>726氏が教えてくれたのがビンゴ
ここにある↓
http://www.ctyme.com/intr/rb-0575.htm
この中の「Bitfields for BIOS equipment list:」ってやつはわかるんだが
このビットの取得方法が分からん・・・
0738デフォルトの名無しさん
2009/02/27(金) 16:48:56>>728氏だった
0739デフォルトの名無しさん
2009/02/27(金) 18:55:270740大和魂 ◆TLCPn.jaa2
2009/02/27(金) 22:41:48PC-9801/PC-9821上のNASM 2.06rc1で組んでますが、より効率の良いコードを
考えていて、詰まりました。Cだとif〜elseでイケますが、アセンブラの場合、
共通のルーチンがある場合、どうしたらいいでしょうか。
単純にjmpすればいいのでしょうか?ただ、それだと若干メモリとかコードが
大きくなってしまうような気がします。要点は、
1)mov ax,4c00h int 21hのDOSコールが2箇所ある。無駄すぎ。
2)mov ah, 9 int 21hのDOSコールが2箇所ある。やはり無駄っぽい。
3)messageの中身は、実際は数値の違いだけ(2MHzか2.5MHzか)。これを
集約できないか。なんとかできないでしょうか。以下、例示します。
PC-9801/9821用 SysClk.asm ; システムクロックを取得する
(タイマIC 8253Aより) NASM 2.06rc1用コード
; PC-9801 system clock diagnostic program
; tested on PC-9821Xa7e(430FX)/PC-9801DA2
;
; Programmed by Yamato_Damashii 2009-02-27 for NASM 2.06rc1
[Bits 16]
org 100h ; COM program
start:
push es
xor ax, ax
mov es, ax
;-------------------------------------------
; 0000:0501h = BIOS_FLAG
; bit 7 = System Clock
; if bit 7 = 0, then system clock is 2.5MHz
; if bit 7 = 1, then system clock is 2MHz
;-------------------------------------------
test byte [es:0501h], 80h ; hex 80h = byte 10000000
pop es
jz sysclk_is_2_5MHz
0741大和魂 ◆TLCPn.jaa2
2009/02/27(金) 22:42:34sysclk_is_2MHz:
mov ah, 9
mov dx, message_2MHz
int 21h
mov ax, 4c00h
int 21h
sysclk_is_2_5MHz:
mov ah, 9
mov dx, message_2_5MHz
int 21h
mov ax, 4c00h
int 21h
message_2MHz:
db 'System clock is 2MHz', 0dh, 0ah, '$'
message_2_5MHz:
db 'System clock is 2.5MHz', 0dh, 0ah, '$'
0742デフォルトの名無しさん
2009/02/27(金) 23:01:28普通に
call
じゃだめなの?
0743デフォルトの名無しさん
2009/02/27(金) 23:23:090744デフォルトの名無しさん
2009/02/27(金) 23:48:55これでいいんじゃないかと
test byte [es:0501h], 80h
pop es
jz sysclk_is_2_5MHz
mov dx, message_2MHz
jmp print_sysclk
sysclk_is_2_5MHz:
mov dx, message_2_5MHz
print sysclk:
mov ah, 9
int 21h
mov ax, 4c00h
int 21h
0745大和魂 ◆TLCPn.jaa2
2009/02/28(土) 00:20:28ありがとうございます。ご提示の案、検討してみます。
>>742
callでも検討を考えていました。コードが若干複雑になる可能性がありますが、
(僕の頭が単細胞…(^^;)、call〜retでサブルーチン可してしまう案ですよね。
ありがとうございました。
がんばります。次はサウンドBIOSの有無のチェックや内蔵固定ディスクの切り離しの有無の
チェックプログラムのコードに取り掛かります。
0746デフォルトの名無しさん
2009/02/28(土) 02:24:17俺ならマクロで書いてしまう。
NASMって知らないんだけどマクロアセンブラじゃないの?
ならm4なりcppなりのマクロプロセッサをかますとか。
0747大和魂 ◆TLCPn.jaa2
2009/02/28(土) 03:18:01NASMはもちろん、マクロアセンブラですよ。オープンソースです。
ZSNESとかはCとNASMで書かれてます…。
ただ確かに、超小規模なんで、call〜retは無駄すぎますね。
実はNASMでのCOMコードをようよう書けるようになった程度なんで、
まだNASMの実装する膨大なマクロ機能などはMANUAL未読部分で、
org 100h〜mov ax, 4c00h int 21hで小さなチェッカツールを作るのが
関の山で。精進します。
0748デフォルトの名無しさん
2009/02/28(土) 07:38:300749デフォルトの名無しさん
2009/03/01(日) 17:06:10esを保存する必要はないし、最後はretでいいと思う
0750デフォルトの名無しさん
2009/03/23(月) 10:34:10amdのサイトにあるamd64のインストラクションセットマニュアルには載ってませんでした
0751デフォルトの名無しさん
2009/03/23(月) 11:19:43なにで逆アセしてるの?
0753デフォルトの名無しさん
2009/03/23(月) 16:40:160754デフォルトの名無しさん
2009/03/23(月) 16:57:380755デフォルトの名無しさん
2009/03/23(月) 19:50:07nopw:nopのWORD
retq:retのQ?
だな。qってなんだろ?
0756デフォルトの名無しさん
2009/03/23(月) 19:52:560757デフォルトの名無しさん
2009/03/27(金) 18:41:150758デフォルトの名無しさん
2009/03/29(日) 02:30:32以下のコメントアウトされたプロトタイプで
最初の2つはOKだが3つめは何故エラーになるのでしょうか
error A2008: syntax error : title
;func proto STDCALL , :dword , :dword
;func proto STDCALL , message:dword , :dword
;func proto STDCALL , message:dword , title:dword
.code
func proc mes : dword , tit : dword
invoke MessageBoxA , NULL , mes , tit , MB_OK
ret
func endp
他2つではちゃんと実行出来ます
リファレンスには
label PROTO [[distance]] [[langtype]] [[, [[parameter]]:tag]]...
とあるのでどれでも動きそうに思うのですが
0759デフォルトの名無しさん
2009/03/29(日) 03:34:440760デフォルトの名無しさん
2009/03/29(日) 09:05:44解決しました。ありがとうございます!
0761デフォルトの名無しさん
2009/04/02(木) 13:46:590762デフォルトの名無しさん
2009/04/03(金) 05:16:27以下参考にHelloWorldが動くところまで出来ました
ttp://www.masm32.com/teaching/index.htm
しかし、printfのために色々インクルードされてて自作感があまりないです
print関数をもっとシンプルにCPUの機能(dosのint 21hみたいな感じ)で
実現することって出来るんでしょうか?
(それともint 21h自体も何かの機能で実現されている?)
まずは1文字だけでもいいので表示したいのですが
例えばこんな感じのことは出来ますか?
.386
.model flat,stdcall
.data
msg db "hello world",13,10,"$"
.code
start:
mov dx,offset msg
mov ah,9
int 21h
end start
(書き込み規制中で代行お願いしてます)
0763デフォルトの名無しさん
2009/04/03(金) 09:51:19WindowsのDOS互換機能で実行してるなら、DOSのファンクションが実行できる
はずだからやってみたら?
INT 21hがなんなのか知りたければ、CPUとOSの勉強をしてください。
いずれにしても、そういう低水準のことを希望するなら使ってるプラットフォームに
ついて調査することは基本。どういうシステムの上での話か説明できていない点で、
その質問のしかたからしてダメダメです。
0764デフォルトの名無しさん
2009/04/03(金) 10:06:050765デフォルトの名無しさん
2009/04/03(金) 14:46:42878 :Classical名無しさん :09/04/02 23:54 ID:31nUMIMQ
お願いします。
【URL】http://pc12.2ch.net/test/read.cgi/tech/1172916032/
【名前欄】
【メール欄】sage
【本文】↓
質問させてください
以下参考にHelloWorldが動くところまで出来ました
しかし、printfのために色々インクルードされてて自作感があまりないです
print関数をもっとシンプルにCPUの機能(dosのint 21hみたいな感じ)で
実現することって出来るんでしょうか?
(それともint 21h自体も何かの機能で実現されている?)
まずは1文字だけでもいいので表示したいのですが
例えばこんな感じのことは出来ますか?
.386
.model flat,stdcall
.data
msg db "hello world",13,10,"$"
.code
start:
mov dx,offset msg
mov ah,9
int 21h
end start
0766デフォルトの名無しさん
2009/04/03(金) 14:51:570767デフォルトの名無しさん
2009/04/03(金) 15:09:080769デフォルトの名無しさん
2009/04/03(金) 17:46:170770デフォルトの名無しさん
2009/04/03(金) 19:37:00dumpコマンドで文字列表示
http://wisdom.sakura.ne.jp/programming/asm/assembly28.html
本でオススメは
アセンブリ言語の教科書
0771762
2009/04/04(土) 10:47:59WinXP/Pentium Dual-Core E2180/AMIBIOS(2006)
まず、最終目標はOS作成(動作原理が知りたい)です
(なので、DOSにも頼らない方向にしたい)
あれから、int 21HもCPUの機能ではなくて
OS側の機能ということがわかりました。
ttp://7ujm.net/nasm/4.html
そこで、BIOSを使えば文字が表示出来ると思いましたが
以下コード、Win環境では実行すると例外が出ます
〜略
mov ah,0eh
mov al,61h
mov bh,0
mov bl,1
int 10h
このコード、ブート直後ならいざ知らず、
Win起動後はOSの保護で例外がでると
推測したのですがあってますでしょうか?
Winのcmd.exeで試行錯誤しながらOS作って、
それでいつかブートするのが理想なんですが
BIOSが直接たたけないとなると次はエミュですかね・・
0772デフォルトの名無しさん
2009/04/04(土) 10:55:32フリーのdos使えば?
0773代理
2009/04/04(土) 11:10:26荒らし対策になるか、ちょっとテストもかねて
これでお願いできますでしょうか。
ゆあるえる http://pc12.2ch.net/test/read.cgi/tech/1172916032/
なまえ 762
めーる sage
ほんぶん
色々ありがとうございます。すみません、環境も書きます
まず、最終目標はOS作成(動作原理が知りたい)です
(なので、DOSにも頼らない方向にしたい)
あれから、int 21HもCPUの機能ではなくて
OS側の機能ということがわかりました。
そこで、BIOSを使えば文字が表示出来ると思いましたが
以下コード、Win環境では実行すると例外が出ます
〜略
mov ah,0eh
mov al,61h
mov bh,0
mov bl,1
int 10h
このコード、ブート直後ならいざ知らず、
Win起動後はOSの保護で例外がでると
推測したのですがあってますでしょうか?
Winのcmd.exeで試行錯誤しながらOS作って、
それでいつかブートするのが理想なんですが
BIOSが直接たたけないとなると次はエミュですかね・・
0774デフォルトの名無しさん
2009/04/04(土) 12:21:020775デフォルトの名無しさん
2009/04/04(土) 12:51:30まぁそれなりに手もないではないけど、そうでなければとりあえず
エミュを触ってみたら?
あと、テーマ的にかぶると思うんだけど、OS30日本は知ってる?
>最終目標はOS作成(動作原理が知りたい)です
Linuxでも読みなさるがよいでしょう。
0777デフォルトの名無しさん
2009/04/04(土) 14:14:57例えば
struct hoge {
int hoge1;
...
};
void hoge_func( const hoge &hogehoge, const hoge &hogehoge2, int hoge2 ) {
...
}
って言うのだったらそれぞれの引数にはどうやってアクセスしたらいい?
ちなみにアセンブラはnasmで(それ以外の構文は知らないorz
0778デフォルトの名無しさん
2009/04/04(土) 14:29:05んで、
C→アセンブラ 呼び出し
C←アセンブラ 情報にアクセス
方向はこういうことでいい?
つまり hoge_func の中身をアセンブラで書きたいということでいい?
0779777
2009/04/04(土) 14:34:32void hoge_func( const hoge *hogehoge, const hoge *hogehoge2, int hoge2 )
って関数の中身をアセンブリで書きたいって事です。
VC9のアセンブリ出力してもサパーリでorz
mov eax, dword ptr _hoge2$[esp+44] とか...
アセンブリ出力とデバッガでの逆アセの内容って違うんですねぇ→もっとわからなくなってきた
0780デフォルトの名無しさん
2009/04/04(土) 14:45:54あと C++ は名前をいじるから、アセンブラとのやりとりは面倒になる。
>>779
> アセンブリ出力とデバッガでの逆アセの内容って違うんですねぇ→もっとわからなくなってきた
基本的にはそんなに違わんのだが、細かい所はいろいろある。
VC++ なら、拘らないんなら MASM 使ったほうがいいんでないかなぁ。
実際に比較したことはないんでちょっとわからないけど。
それと、インラインアセンブリは検討した?
0781デフォルトの名無しさん
2009/04/04(土) 14:49:34MASMがどこまで対応してるかわからんのですが、VC++のプロパティ見る限りSSE2までなんで
まーある程度わかるNASMでいけたらなーって感じだったんですよ
0782デフォルトの名無しさん
2009/04/04(土) 15:15:34呼び出し規約とかでググれ。
あと、SSEを使うことが目的なら、アセンブリ言語に限らず、
組み込み関数を使うという手もある。
とりあえず、extern "C", __cdeclでOK。
構造体の使用は、面倒だから、オススメしない。
0784777
2009/04/04(土) 16:42:45とりあえず呼び出し規約あたりで調べてみます
0785デフォルトの名無しさん
2009/04/04(土) 17:28:06お前が抜粋した部分だけをCOMとして作って実行すれば、例外にはならない。
いや、「OSの保護で例外がでる」というのは大正解だが、
その例外はWindowsのDOS実行環境が捕まえて、
DOS窓へ文字が出力されるという所定の動作になる。
0786デフォルトの名無しさん
2009/04/04(土) 19:46:08>a.com
---------------------------
16 ビット MS-DOS サブシステム
---------------------------
C:\WINDOWS\system32\cmd.exe - a.com
NTVDM CPU は不正命令を検出しました。
CS:2725 IP:0125 OP:63 75 6d 65 6e アプリケーションを終了するには、[閉じる] を選んでください。
---------------------------
閉じる(C) 無視(I)
---------------------------
コード(a.asm)
.MODEL small
.code
start:
mov ah,0eh
mov al,61h
mov bh,0
mov bl,1
int 10h
end start
command.comで実行しても同じ
しかし、これだけ作るのにめちゃ調べた
アセンブラは敷居が高過ぎる
0788デフォルトの名無しさん
2009/04/04(土) 20:09:51おそらく、WinでいうExitProcessみたいなものが
抜けてたわけですね
cmd.exeでは動きませんが
command.comのほうで無事動きました。
次は、フロッピーのブートイメージとして使えるcom作りを頑張ります
(サンプルプログラムがないので
このためだけにMASM→NASM乗り換えを検討してます)
0790デフォルトの名無しさん
2009/04/05(日) 13:28:14次の命令はMASMではどう書けばよいのでしょうか
RESB 0x7dfe-$ ; 0x7dfeまでを0x00で埋める命令
DB 7dfeh - $ dup (?)
とすると
error A2094:operand must be relocatable
となります。7dfeh - $の部分が置かれる場所によって異なる結果になるから
無理、ということなんでしょうか?
0791デフォルトの名無しさん
2009/04/05(日) 13:37:21引数に絶対アドレッシングは使えません、てことなのだが。
てか30日本てMASMじゃなくてnasmだっけ?
とくに理由がなければ同じツールを使えばいいと思うんだけど。
0792デフォルトの名無しさん
2009/04/05(日) 13:41:44本のは、naskっていうnasm系の独自アセンブラみたいです
0793デフォルトの名無しさん
2009/04/05(日) 14:19:030794デフォルトの名無しさん
2009/04/06(月) 03:28:19org 7dfeh
でいいんでないかい。
そこなら0で埋める必要もなかろう。
0795デフォルトの名無しさん
2009/04/06(月) 07:15:19出来ました!ありがとうございます。
0796デフォルトの名無しさん
2009/04/06(月) 08:31:21どうしてもわからないところがあるので質問させてください
以下のプログラムは1バイトのレジスタを受け取って
そのアスキーコード値を表示するサブルーチンで
一応動作はしてます。
しかし、16ビットの場合スタックはワード単位だと思うので
※1の所はbx+4ではなくbx+2だと思うのですが
そう変更すると動作しなくなります
また、※2の箇所はret 4にしても何故か動作するため
何が正しい挙動なのかさっぱりわかりません
直感的には※1も※2も2だと思うのですが
どこが間違ってるのでしょうか?
pchar PROC NEAR STDCALL
push bx
mov bx,sp
mov al,byte ptr [bx+4] ;※1
mov ah,0eh
mov bh,0
mov bl,1
int 10h
pop bx
ret 2 ;※2
pchar ENDP
呼び出し
mov ax,0061h ;'a'のアスキーコード
push ax
call pchar
0797デフォルトの名無しさん
2009/04/06(月) 08:56:34bx+0が元のbxの値、bx+2がリターンアドレス、bx+4が第一引数。
2.
異常が起きてても気づいてないだけ。
0798デフォルトの名無しさん
2009/04/06(月) 22:06:20自分は富豪的プログラマなので
こうするのが性にあってるようです。
pchar PROC NEAR STDCALL
push bx
push ax
mov bx,sp
mov al,byte ptr [bx+6]
mov ah,0eh
mov bh,0
mov bl,1
int 10h
pop ax
pop bx
ret 2
pchar ENDP
アセンブラに慣れてる人はどの程度レジスタやらを
保存させますか?
そういえばEFLAGSなんてのもあるんでした
今後自分が書くサブルーチンは
全部こんな関数になりそうですわ
そういう意味で、fastcallにはあまり魅力を感じない
stdcall(・∀・)イイ!
0799デフォルトの名無しさん
2009/04/06(月) 22:32:17axは戻り値にも使うから(戻り値のない時でも)保存しないのが普通。
あと、その用途で使うのはbxよりもbpでしょ。
0800デフォルトの名無しさん
2009/04/06(月) 23:00:22どうも、レジスタやらが勝手に破壊されるのが嫌なんで。
保存しとけば全部ローカル変数のノリで使えるので
疑似コードですが、例えばax保存したら
printnibl proc
push ah ;上位ニブル。実際はちゃんと計算する
call pchar ;上位ニブルを表示
push al ;下位ニブル
call pchar ;下位ニブルを表示
hoge endp
こんなんも気兼ねなく書けるかなと。
しかし戻り値のことを忘れてました
即値では戻ってこないですもんね
axだけは破壊的な変更を許して
他は全部保存、ぐらいが富豪的妥協ポイントでしょうかね
>bxよりもbpでしょ
ご指摘ありがとうございます。精進します
0801デフォルトの名無しさん
2009/04/06(月) 23:32:400802デフォルトの名無しさん
2009/04/07(火) 04:42:111000文字表示させたらどんだけ無駄な処理になるか考えてみれ。
無駄が多いってことは遅いってこと。アセンブラはCより速くて効率が良く、小さく作れるところが売りなんだから
わざわざ遅くなるように書くのは避けたほうがいい。
0803デフォルトの名無しさん
2009/04/07(火) 06:03:570805デフォルトの名無しさん
2009/04/11(土) 19:07:36ポインタ一回渡せば済むだろうに。
0806デフォルトの名無しさん
2009/04/11(土) 19:18:160807デフォルトの名無しさん
2009/04/11(土) 21:11:47でも渡されたアドレスを順番に1文字表示関数でぶんまわすなら無駄なのは同じこと。
1文字表示関数でなく、一度に連続して文字を表示する関数を作れば高速になるし
無駄なpush/popをしたとしても1回だけだから速度の低下は気にならなくなる。
0808デフォルトの名無しさん
2009/04/11(土) 23:21:34先頭アドレスを渡してhello worldは一応出来てるので
1文字ずつ表示するhello worldに挑戦してます。
文字列の指し示す先を参照する方法でつまづいてるのですが
byte ptr [bx]みたいなやり方、間違ってるのでしょうか?
以下のプログラムだと何故か、■みたいな文字が表示されます
情報が少なくて、調べてる時間がほとんどなのですが
どなたかアドバイス願います
;MASM hello worldのhを表示したい
start:
mov bx,offset msg
mov al,byte ptr [bx] ※ココ
push ax
call pchar
mov ah,4ch
int 21h
pchar proc near stdcall ;>>798と基本一緒なので省略
msg DB "hello world"
end start
0809デフォルトの名無しさん
2009/04/12(日) 00:15:38起動時のDSはPSPかなんかに設定してあるんじゃなかったかな。
0810デフォルトの名無しさん
2009/04/12(日) 00:37:35シンプルなので、COMで勉強してます。
microsoft masm programmers guideっていう良サイトみつけたので
試行錯誤の結果解決しました。
変更箇所
start: -> .STARTUP
end start -> END
なんでうまくいったかについてはまたこれから調査ですが
ところでPSPとは何でしょうか?
DSとPSPとくれば、携帯ゲーム機ばかりヒットしてしまってorz
0811デフォルトの名無しさん
2009/04/12(日) 00:45:130812デフォルトの名無しさん
2009/04/12(日) 04:31:51セグメントのベースアドレスを入れておかないとうまくアクセスできないんじゃ?
byte ptr [BX} というアドレッシングは暗黙に 「DSの指すセグメントの[+BX]だけオフセットしたとこ」
ってなるんじゃないの?
0813デフォルトの名無しさん
2009/04/12(日) 11:45:090814デフォルトの名無しさん
2009/04/12(日) 12:15:19結論から言えば、まさに811氏の指摘箇所でした。
COMバイナリを比べてみると
start:とした場合は開始アドレスが00hからなのに対して
.STARTUPの場合は開始アドレスが100hからとなっていました。
そのため、start:の直前にorg 100hを付けても動作が確認出来ました。
また、セグメントレジスタについて確認してみたところ
CS=DS=SS=ESとなっていました。
セグメントレジスタ以外にも意識しておくべきアドレスがあるのは
落とし穴ですね
0815デフォルトの名無しさん
2009/04/12(日) 12:18:13mapサブルーチンを書いてみました
foldはレジスタが足りないのでもっと慣れたら挑戦
;呼び出し
mov ax,lengthof msg
push ax
mov ax,offset msg
push ax
mov ax,offset pchar ;pcharは>>798と一緒
push ax
call map
続く
0816デフォルトの名無しさん
2009/04/12(日) 12:19:27map proc near stdcall
push bp
push si
mov bp,sp
mov ax,word ptr [bp+6] ;function
mov bx,word ptr [bp+8] ;array offset
mov si,word ptr [bp+10] ;array number
mov dl,byte ptr [bx] ;array data
mov cx,0
cmp cx,si
jg fin
@@:
push dx
call ax
inc cx
mov bx,word ptr [bp+8]
add bx,cx
mov dl,byte ptr [bx]
cmp cx,si
jne @b
fin:
pop si
pop bp
ret 6
map endp
msg DB "Hello world"
0818デフォルトの名無しさん
2009/04/13(月) 12:13:53ところで、
MASMで、「FOR」ではなく「%FOR」と書かれている資料がありますが、
%FOR とはなんなんでしょう?
0819デフォルトの名無しさん
2009/04/13(月) 12:29:418086のアセンブラか
セグメントが嫌で途中で放り出してしまったな
予約語を強引にマクロで使っているとか、その辺かもね。
0821デフォルトの名無しさん
2009/04/13(月) 17:45:00ttp://msdn.microsoft.com/ja-jp/library/t4ax90d2.aspx
Microsoft Macro Assembler リファレンス
% 演算子
マクロ引数の expression の値をテキストとして扱います。
ttp://doc.ddart.net/asm/Microsoft_MASM_Programmers_Guide_v6.1/Chap_09.htm
☛Expansion Operator
The expansion operator (%) expands text macros or...
☛Expansion Operator as First Character on a Line
The expansion operator has a different meaning when ...
☛FOR Loops and Variable-Length Parameters ☜
With the FOR directive you can iterate through a list of arguments,...
0822818
2009/04/13(月) 18:24:38これは、微妙にそれではなくて、
http://webster.cs.ucr.edu/Page_TechDocs/MASMDoc/
の下段「MASM Programmer's Guide」の
Chapter 9「Using Macros」の
「Expansion Operator as First Character on a Line」
で説明されている機能を使っているようです。
行頭に%を書くと、ECHO、TITLE、SUBTITLEのようなディレクティブと共に
用いられている「テキスト・マクロ」を展開する、と書かれています。
%FOR もこの目的で使っているようです。
0823デフォルトの名無しさん
2009/04/13(月) 18:45:14☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟
☛Expansion Operator as First Character on a Line
The expansion operator has a different meaning when ...
☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝
0824818
2009/04/13(月) 18:52:10「FOR Loops and Variable-Length Parameters」
の例に出てきます。
CTRL+F で%FORを検索してもすぐに見つかると思いますが。
0825デフォルトの名無しさん
2009/04/13(月) 19:01:17すみませんでした。
勉強不足だったようです。
☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟☟
☛FOR Loops and Variable-Length Parameters ☜
With the FOR directive you can iterate through a list of arguments,...
☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝☝
0826デフォルトの名無しさん
2009/04/14(火) 22:32:530827デフォルトの名無しさん
2009/04/14(火) 22:48:430828デフォルトの名無しさん
2009/04/14(火) 23:08:310829デフォルトの名無しさん
2009/04/18(土) 23:13:30どうしてもわからないので教えて下さい。
よろしくお願いします。
0830デフォルトの名無しさん
2009/04/18(土) 23:26:210831デフォルトの名無しさん
2009/04/29(水) 13:31:51push %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
subl %eax, %esp
subl $4, %esp
pushl $4
pushl $.LC0
pushl $1
int $0x80
addl $16, %esp
leave
ret
0832デフォルトの名無しさん
2009/04/29(水) 13:33:16call writeを使わずに書きたいんだけど下から4行目の割り込みの前後に何を書いたらいいの?
あとage
0833デフォルトの名無しさん
2009/04/29(水) 14:47:050834831
2009/04/29(水) 16:23:54.section .rodata
.LC0:
.string "tes\n"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
andl $-16, %esp
movl $0, %eax
subl %eax, %esp
subl $4, %esp
pushl $4
pushl $.LC0
pushl $1
[ ]←call writeを使わずにシステムコールを使って書き換え
[ int$0x80 ]
addl $16, %esp
leave
ret
.size main, .-main
.ident "GCC: (GNU) 4.2.3 (Ubuntu 4.2.3-2ubuntu7)"
.section .note.GNU-stack,"",@progbits
まったく分からん。誰かボスケテ
0836デフォルトの名無しさん
2009/04/29(水) 17:45:38src1 < src2 のとき label にジャンプという意味でしょうか?
jpoの意味がよくわからないんですが。
fld src1
fld src2
fcom
fnstsw ax
test ah, 05
jpo label
0837デフォルトの名無しさん
2009/04/29(水) 19:01:33push $4
write()のシステムコール番号をpushすりゃいいんだよ。
つーか、普通は%eax, %ebx, %ecx, %edx使って引数渡すが、わざわざ
スタック渡しにしてるんだな。どこの学校の宿題だ?
0838837
2009/04/29(水) 19:06:05write()が4なのは32bitであって、64bit(x86_64)では1だからな。
/usr/include/asm/unistd_{32,64}.hを参照すること。
0839デフォルトの名無しさん
2009/04/30(木) 10:42:01マニュアルさがせ
0840デフォルトの名無しさん
2009/04/30(木) 13:56:51最後の2行で何をやろうとしているのか説明してみろ
0841デフォルトの名無しさん
2009/04/30(木) 18:25:45ah のビット0とビット2つまり条件コードのC0とC2の内容を見て
1になってるものが奇数のときジャンプするという意味ですかね?
0842デフォルトの名無しさん
2009/04/30(木) 18:31:29どうすればいいのでしょうか?
オペランドに直接書いても、"m" に指定しても、構文エラーなようで・・・。
0843デフォルトの名無しさん
2009/04/30(木) 18:39:32分かってるじゃないか
つまり>>836に書いてあることで合ってるということだ
これも宿題か?
0844842
2009/04/30(木) 20:03:20配列だったのですが、
配列の場合は [0] をつけて1要素で指定しないといけなかったようです。
:"m"(A::a[0]) みたいな感じで。
0845デフォルトの名無しさん
2009/04/30(木) 21:15:40当たり前だろ。配列として使いたきゃアドレス渡せって話だ
0846デフォルトの名無しさん
2009/04/30(木) 21:41:06有難うございましたm(_ _)m
0847デフォルトの名無しさん
2009/05/01(金) 07:17:12masm32で mov byte ptr [hoge], 70h は意図した動作(hogeが指す文字列の一文字目に'p'(70h)を代入する)をしないのですが mov esi, hoge / mov byte ptr [esi], 70h とすると意図した動作をします。
何故なのでしょうか?
よろしくお願いいたします。
0848デフォルトの名無しさん
2009/05/01(金) 08:48:43どう動作したか書けよアホ
0849デフォルトの名無しさん
2009/05/01(金) 12:09:22何のためのレジスタだよ
メモリオペランドが何を意味するか混同してないか?
もう一度マニュアルを読み直せ
0850デフォルトの名無しさん
2009/05/01(金) 13:30:570851デフォルトの名無しさん
2009/05/01(金) 14:50:23まずはアセンブル可能な完全なコードを提示しろよ。
それじゃhogeがどう定義されてるのかすらわからん。
そんな命令なんてなかった。
0853デフォルトの名無しさん
2009/05/01(金) 18:15:26少なくともLinux上のGNU assemblerでは、hoge: .ascii "abcd\0"
とデータセクションで定義して movb $'p', hoge(,1) で1文字目の変更が出来た。
AT&T記法のhoge(,1) == Intel記法の[hoge]だから、その書き方で動くはずなんだが。
データをどう定義したか見せてみろよ。
単に別のsegment/selectorで読んでいるとか、その辺だろうね。
0855847
2009/05/02(土) 07:46:36該当部のソースコードは以下のようになっております。
invoke GetDlgItemTextA, hWin, IDC_SPAM, offset spam, 100h
invoke foobar, offset spam, offset ham
foobar proc piyo :DWORD,
hoge :DWORD
push esi
invoke lstrcpy, hoge, piyo
; これだと駄目
;mov byte ptr [hoge], 70h
; これならOK
mov esi, hoge
mov byte ptr [esi], 70h
pop esi
ret
foobar endp
0856デフォルトの名無しさん
2009/05/02(土) 08:12:52だからspamとhamはどこでどう定義してんだよ。
データをどう定義したか見せろって言ったのを聞いてないのか?
0857デフォルトの名無しさん
2009/05/02(土) 09:10:190858847
2009/05/02(土) 09:11:18ごめんなさい。
spamとhamは次のように定義しております。
.data
span db 100h dup(?)
ham db 100h dup(?)
0860デフォルトの名無しさん
2009/05/02(土) 09:55:130862デフォルトの名無しさん
2009/05/02(土) 10:49:31hoge dd offset spam
mov byte ptr [hoge], 70h
これだとspamの1バイト目ではなくhogeの1バイト目を書き換えている
0863デフォルトの名無しさん
2009/05/02(土) 11:05:20もっとコードを単純化してみろよ。Win32 APIもlstrcpy()も呼ばずに、
spamとhamを直接mov byte ptr [ham], 70hとかでいじったら動作するの?
>>862
何が言いたいのかわからん。
lstrcpy()でspamの内容をhamにコピってるんだし、コード的には問題ないだろ。
0864デフォルトの名無しさん
2009/05/02(土) 11:19:33hogeがどこを指しているのか、を確認すれば?
0865デフォルトの名無しさん
2009/05/02(土) 11:21:59脊髄反射するなよ。
>foobar proc piyo :DWORD, hoge :DWORD
で piyo と hoge のアドレスはスタックに積まれるわけだ。
>mov byte ptr [hoge], 70h
で byte ptr [hoge] はスタック上のメモリを指していて、それを書き換えている。
けしてスタック上に積まれたアドレスの先を書き換えているわけではない。
>mov esi, hoge
この場合はスタックに積まれた値を読み出しているので正常に稼動する。
0866デフォルトの名無しさん
2009/05/02(土) 11:30:13void foobar(const char *piyo, char *hoge) {
strcpy(hoge, piyo);
*((char *) &hoge) = 'p';
//*hoge = 'p';
}
>>865ので解決、と。
0868847
2009/05/02(土) 13:50:35皆さんどうもありがとうございました。
0869デフォルトの名無しさん
2009/05/05(火) 20:02:47SSE2とSSSE3の環境を想定しています。
short ary[] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024};
// 0, 0, 2, 2, 3, 4, 6, 7, 9 番目を抜き出す
xmm1 = {1, 1, 4, 4, 8, 16, 64, 128, 512};
0870デフォルトの名無しさん
2009/05/09(土) 01:10:20どこかでクロック数は公開されてはいませんか?
0871デフォルトの名無しさん
2009/05/09(土) 01:17:560872デフォルトの名無しさん
2009/05/09(土) 01:21:46ありがとうございます
0873デフォルトの名無しさん
2009/05/12(火) 00:18:15if(((unsigned char)((c^0x20)-0xA1)<=0x3B))
入力値0x80-0x9F及び0xA0-0xE0-0xFFを一回の分岐で済むようにする
c xor 0x20の0x20の導き方をご教示ください
0874デフォルトの名無しさん
2009/05/12(火) 00:29:500875デフォルトの名無しさん
2009/05/12(火) 00:32:53どこに説明足らずな部分がありますか?
0876デフォルトの名無しさん
2009/05/12(火) 00:37:250877デフォルトの名無しさん
2009/05/12(火) 00:46:08http://homepage1.nifty.com/herumi/adv/adv40.html
ここのNo. 003からNo. 004までに書いてある。
0879デフォルトの名無しさん
2009/05/12(火) 01:05:490880デフォルトの名無しさん
2009/05/12(火) 01:10:22見て解らなかったので、質問しに来ています
0881デフォルトの名無しさん
2009/05/12(火) 01:25:44中身は(たぶん)テーブル参照。
アセンブラコードの中で使うにしても
どうせ他の用途にも似たような文字判別処理あるんだろうから
自分でテーブルと該当bitを用意しろ。
プログラムの先頭でセットアップするなら「記号のカタマリ」にはならんよ。
0882デフォルトの名無しさん
2009/05/12(火) 01:30:39ここから、t = c ^ 0x20として
t >= 0xA1 && t <= 0xDC
を見つけるのは勘と言って差し支えないかも。自分もこんなの無理。
ちなみに、負の値をunsigned charに変換すると256 + (基の値)となる。
例えば、(unsigned char)-1 == 256 + (-1)、つまり255。
これを使って、元の判定式では0以上というチェックを省くということをやっている。
0883デフォルトの名無しさん
2009/05/12(火) 01:54:55連続した部分にくっつけるための0x20は勘ということですか?
0884デフォルトの名無しさん
2009/05/12(火) 01:59:38> どこに説明足らずな部分がありますか?
> 入力値0x80-0x9F及び0xA0-0xE0-0xFFを一回の分岐で済むようにする
何回読み直しても「入力値が2つの異なる範囲0x81-0x9F, 0xE0-0xFCに収まるかどうかを
判定する際、1回の分岐で済むようにする」という意味には読めない。
0x9Fと0xA0は連続している。つまり、その記述に対して忠実に考えるなら0x80-0xFFで
ありunsigned charの上限まで連続しているのだから、単純に入力値が0x80以上であるか
どうかを調べるだけで良く、元から分岐が2つ以上発生しない。
故に、日本語でおk。
0885デフォルトの名無しさん
2009/05/12(火) 02:05:33なるほど、ご指摘ありがとうございます。
0886デフォルトの名無しさん
2009/05/12(火) 02:17:29これ何かの宿題か?今時SJIS判定のコードの説明を聞くなんて。
0887デフォルトの名無しさん
2009/05/12(火) 02:27:330x80 : 0b1000_0000
0xA0 : 0b1010_0000
0xC0 : 0b1100_0000
0xE0 : 0b1110_0000
0x20 : 0b0010_0000
0x20でxorするというのは0b0010_0000の1の部分のビットを反転するというのと同じ意味。
・1回の分岐で済ませる為には2つの範囲を連続した1つの範囲にすれば良い。
・0x80を+0x20、0xE0を-0x20すれば2つの範囲は連続する。
・都合の良いことにどちらも0x20でxorする事でそれを実現できる数である。
見つけ出せるのはきっと勘だろうね。
0888デフォルトの名無しさん
2009/05/12(火) 02:33:34このレスでようやくわかりました。
感激しました。本当にありがとうございます。
0889デフォルトの名無しさん
2009/05/12(火) 03:04:51それが理解できない奴は勘ということにしたがるだけ。
0890デフォルトの名無しさん
2009/05/12(火) 04:17:56ビットパターンが頭に馴染んでる奴はオッサンだろ。
こういうテクニックも昔は重宝されたが、今となっては化石だな。
0891デフォルトの名無しさん
2009/05/12(火) 04:31:400892デフォルトの名無しさん
2009/05/12(火) 04:52:220893デフォルトの名無しさん
2009/05/12(火) 05:26:300894デフォルトの名無しさん
2009/05/12(火) 05:32:20\377 \377 \377 ...
0895デフォルトの名無しさん
2009/05/12(火) 15:25:280896デフォルトの名無しさん
2009/05/12(火) 15:31:31人差し指から小指に向かって8421と数字を振って大きい数から順に指折りして数えればいい。
5は中指と小指を折り曲げるだけ。0b0101とすぐにわかる。
0897デフォルトの名無しさん
2009/05/12(火) 15:37:280898デフォルトの名無しさん
2009/05/12(火) 15:47:050899デフォルトの名無しさん
2009/05/14(木) 02:11:44頭のいい連中だわ。理学部出身で天才肌がミエミエだな。
0900デフォルトの名無しさん
2009/05/14(木) 02:28:59ただの変態だよ
0901デフォルトの名無しさん
2009/05/14(木) 06:35:190902デフォルトの名無しさん
2009/05/14(木) 08:40:210903デフォルトの名無しさん
2009/05/14(木) 09:10:410904デフォルトの名無しさん
2009/05/14(木) 11:51:240905デフォルトの名無しさん
2009/05/14(木) 11:56:500906デフォルトの名無しさん
2009/05/14(木) 19:14:440907デフォルトの名無しさん
2009/05/19(火) 18:04:15以下のC のコードに対応するMIPS のアセンブリ・コードを書け。
C コード:
#define TAB_SIZE 8
int tab[TAB_SIZE];
void main()
{
int i;
for (i = 1; i < TAB_SIZE; i++) {
tab[i - 1] = tab[i];
}
}
• SPIM でのシミュレーションのため、
tab[8] = {8, 9, 10, 11, 12, 13, 14, 15};
としてコードを書け。つまり、データ・セグメントを次のようにせよ。
.data
tab: .word 8, 9, 10, 11, 12, 13, 14, 15
• SPIM のDATA セクションが以下のようになることを確認せよ。
[0x10010000] 9
[0x10010004] a
[0x10010008] b
[0x1001000c] c
[0x10010010] d
[0x10010014] e
[0x10010018] f
[0x1001001c] f
1
0908デフォルトの名無しさん
2009/05/19(火) 18:19:42これ資料なしで答えられる奴なんて、世界に数人しかいねえんじゃね?
0909デフォルトの名無しさん
2009/05/19(火) 19:02:450910デフォルトの名無しさん
2009/05/19(火) 21:19:19教科書に使ってる所か。
0911907
2009/05/19(火) 21:31:180912デフォルトの名無しさん
2009/05/19(火) 22:57:000913デフォルトの名無しさん
2009/05/19(火) 23:11:29.data
tab: .word 9, 10, 11, 12, 13, 14, 15, 15
0914デフォルトの名無しさん
2009/05/19(火) 23:28:12これだからゆとりは。
0915デフォルトの名無しさん
2009/05/19(火) 23:43:52マシン語じゃないでしょ。
0916デフォルトの名無しさん
2009/05/19(火) 23:45:29まずお前が理解している範囲で書いたコードを見せてみろ
0917デフォルトの名無しさん
2009/05/20(水) 04:37:35RISCプロセッサのアセンブリコードを書いたのは初めてだが、命令セットを
ググるところから始めて30分で書けたぞ。
0918デフォルトの名無しさん
2009/05/20(水) 05:03:070919デフォルトの名無しさん
2009/05/20(水) 05:41:050920デフォルトの名無しさん
2009/05/20(水) 17:18:41遊んでばかりいるからこんな簡単な宿題も解けないんだろうが。
0921,,・´∀`・,,)っ-○○○
2009/05/20(水) 22:19:140922デフォルトの名無しさん
2009/05/21(木) 00:27:360923,,・´∀`・,,)っ-○○○
2009/05/21(木) 00:39:520924デフォルトの名無しさん
2009/05/21(木) 00:45:10今時はRISC CPUのシミュレータを使って演習なりするだろ。
0925デフォルトの名無しさん
2009/05/21(木) 01:08:560926デフォルトの名無しさん
2009/05/21(木) 01:15:38汚い。
その点RISCは命令数もアドレッシングモードも少なくて簡単に理解出来る上に
レジスタ数が多いから楽だし、ヘネパタとかもMIPSのアセンブリコードを
使ってるから大学等で勉強するのに合ってる。
0927デフォルトの名無しさん
2009/05/21(木) 01:24:12そりゃ学校でやるなら学校の設備ていいよ。
4[bit]っていうと、
http://japan.renesas.com/fmwk.jsp?cnt=720_family_landing.jsp&fp=/products/mpumcu/720_family
この辺りを思いついてみる。
0929デフォルトの名無しさん
2009/05/21(木) 03:09:52また無学な馬鹿が出てきたか。
まともな情報工学/科学の学科であれば必ずアセンブリ言語を使う講義はある。
計算機アーキテクチャを理解する上で重要だし、理論的な方向でレジスタマシンにも
通じる。
0930,,・´∀`・,,)っ-○○○
2009/05/21(木) 03:12:40いや、FPGAで実装されてたかな?
自分で勉強したのはx86が最初だ
0931,,・´∀`・,,)っ-○○○
2009/05/21(木) 03:15:00RISCなんて自然言語でいうならエスペラントみたいなもんでしょ。
0932デフォルトの名無しさん
2009/05/21(木) 03:22:35一つやっておけば大抵はすぐに馴染めるから、何をやるかは重要じゃない。
ただ、アカデミックな文献ではRISCコードが良く使われるから教えるんだろう。
0933デフォルトの名無しさん
2009/05/21(木) 03:34:00まあ俺はCASLなんか知らないけどさ。
0934デフォルトの名無しさん
2009/05/21(木) 03:38:27CASLは専門学校で教えてるんじゃないの?
まともな大学行ってる学生なら試験中に仕様書見るだけで問題解けるぞ。
0935デフォルトの名無しさん
2009/05/21(木) 03:51:04レジスタだのアドレッシングだのってものの概念自体を知っているからこそ、「仕様書で充分」となる。
逆に、その辺を最初に理解させるための入門ということなら、まさしく「何でもいいから1つ理解しろ」となるわけだが。
0936デフォルトの名無しさん
2009/05/21(木) 03:58:51それはFランを馬鹿にしすぎ。
このくらいのことが出来ないのはFランでもやる気のない最底辺クラスの人間くらいだよ。
0937デフォルトの名無しさん
2009/05/21(木) 04:09:03COMET/CASLの仕様見たことあるか?
まあレジスタにデータを読み込んで計算する、という概念は知っていた方がいいが、
アドレッシングなんて知らなくても何とかなるレベルだぞ。
>>936
Fラン大なんて中学レベルの数学も怪しいんだろ?
そんな奴にアセンブリ言語を理解出来るはずないだろ。
参考書を提示するだけにしておき、教えはしないっていう程度のモノ。
わざわざ、viやらWordの使い方を教えたりしないのと、同じこと。
0939デフォルトの名無しさん
2009/05/21(木) 05:11:21ピンキリ。そういう奴もいるけどね。
リファレンス見ながらなら、小学生だってアセンブリ言語を使える。
使いこなせる、とは言わないけど。
>>907
SPIMで動くかどうかはしらないけど、多分こんな感じ?
.data
tab: .word 8, 9, 10, 11, 12, 13, 14, 15
.text
.global _main
.ent _main
_main:
li $t0, 1
li $t1, 1
li $t2, 8
L1:
beq $t0, $t2, L2
lw $t3, tab(t0)
sub $t4, $t0, $t1
sw $t3, tab(t4)
add $t0, $t0, $t1
b L1
L2:
jr $ra
.end _main
0940デフォルトの名無しさん
2009/05/21(木) 05:34:49お前本当に馬鹿だな。アセンブリ言語を教えるための講義じゃないぞ。
講義の中で「使う」から解説するだけだろうが。
>>939
お前がFラン大擁護者なのは分かった。
Fランに入る奴は中学レベルの知識も身につけられない程努力が足りないからだ。
そんな奴がCPUのマニュアル読んでアセンブリ言語を覚える努力をするとでも思うか?
ちなみにそれじゃ動かないぞ。MIPSアーキテクチャでワードが何バイトか分かって
いないようだな。つーか宿題お答えスレじゃないんだから教えるなよ。
ああいう馬鹿には退学してもらう方が税金の節約になって良い。
0942デフォルトの名無しさん
2009/05/21(木) 05:54:21黙ってりゃそのまま提出して痛い目にあってくれたかもしれないのに・・・。
wordが32bit幅なのは知ってるし、このままじゃ動かないことも承知してるよ。
0943デフォルトの名無しさん
2009/05/21(木) 06:10:58お前は知障か?粘着も大概にしろ
>>942
お前も余計な補足入れすぎだろ・・・
0944デフォルトの名無しさん
2009/05/21(木) 08:13:24スレ違いな話題だから避けようかと思ったけど、これも言っておこうかなぁ。
> Fランに入る奴は中学レベルの知識も身につけられない程努力が足りないからだ。
> そんな奴がCPUのマニュアル読んでアセンブリ言語を覚える努力をするとでも思うか?
実際に見てきた範囲だと2:8くらいかな。努力する子が2、努力しない子が8。
世の中、おたくが思ってるほど単純には出来てないよ。もちろんFランもね。
国立蹴ってFラン入る酔狂な奴、資格取得目的の社会人、そういうので無くても、
比較的マシな奴は割とザラにいる。Fランに入る奴は中学レベルの知識も身につけ
られない、努力できないなんてのは、おたくの勝手な思い込みでしかない。
まあ、そういうのも沢山いるけどね。ただの落ちこぼれから、現役暴走族レベルまで
色々と。
あと、おたくもインテリゲンチャの端くれなら、あまり知らない事を単純化して
決めつけてかかったり、すぐに人を罵倒したりするのは、よした方が良いと思うよ。
粗野で卑しい程度の低い人間に見られるのは嫌でしょ?
0945デフォルトの名無しさん
2009/05/21(木) 08:18:100946デフォルトの名無しさん
2009/05/21(木) 11:28:00わざわざCASLを選ぶ理由がなけれ選ばないな。俺が担当者なら。
0947デフォルトの名無しさん
2009/05/21(木) 13:05:510948デフォルトの名無しさん
2009/05/21(木) 13:22:30東大のISはプロセッサだけじゃなくてそれ用の処理系を作ってレイトレアプリを
やるところまで全員がやる。
0949デフォルトの名無しさん
2009/05/21(木) 14:15:11粘着乙
>>948
理学系の情報科学科でもCPU作るんだよな。工学系だと大抵やるはずだけど。
処理系って、作ったCPU上でコンパイラまで一人で作成するってこと?
それってどれだけ時間が掛かるんだよ。
0950デフォルトの名無しさん
2009/05/21(木) 14:51:59チームで分担してた、はず。
0951デフォルトの名無しさん
2009/05/21(木) 15:59:32チームプロジェクトなら通年じゃなくても行けるか。
ただデバッグ地獄になりそうだな。CPUのデバッグが完了しなかったら
チーム全員単位落とすのかな。
0952デフォルトの名無しさん
2009/05/21(木) 20:53:37いやバーチャルマシン作ってデバッグとか
先輩の残した遺産もあるしね
0953デフォルトの名無しさん
2009/05/22(金) 02:48:11論理回路なら作った。
0954デフォルトの名無しさん
2009/05/22(金) 03:35:47手作業でウェハ磨いたりドライヤーやホットプレート駆使
したり作業の一部はほとんど家庭料理だった。
0955デフォルトの名無しさん
2009/05/23(土) 02:11:46むしろアプリ先にありきでCPUのアーキ考えないとな。
0956デフォルトの名無しさん
2009/05/25(月) 22:07:56VC++ 2008 のデバッグモードにて、空の関数
void Test()
{
}
をビルドして逆アセしてみたら、以下のようになりました。
?Test@@YAXXZ (void __cdecl Test(void)):
00000000: 55 push ebp
00000001: 8B EC mov ebp,esp
00000003: 81 EC C0 00 00 00 sub esp,0C0h
00000009: 53 push ebx
0000000A: 56 push esi
0000000B: 57 push edi
0000000C: 8D BD 40 FF FF FF lea edi,[ebp+FFFFFF40h]
00000012: B9 30 00 00 00 mov ecx,30h
00000017: B8 CC CC CC CC mov eax,0CCCCCCCCh
0000001C: F3 AB rep stos dword ptr es:[edi]
0000001E: 5F pop edi
0000001F: 5E pop esi
00000020: 5B pop ebx
00000021: 8B E5 mov esp,ebp
00000023: 5D pop ebp
00000024: C3 ret
↓続く
0957デフォルトの名無しさん
2009/05/25(月) 22:10:00このアセンブリコードにて、3行目の
sub esp,0C0h
で、スタックポインタを192byteデクリメントした後に 0xCC で埋めてますが、
なぜ192byteを確保しているのか、理屈がよく分かりません。
また、上記の空関数に int の変数宣言を1つ追加するたびに、
スタックの確保サイズが、intのサイズ(4byte) ではなく、12byte ずつ増えるのですが、
なぜ 12byte なのか、これの理屈もよく分からず気になりました。
分かる方いらっしゃいましたら、よろしくお願いします。
0958デフォルトの名無しさん
2009/05/26(火) 00:23:550959デフォルトの名無しさん
2009/05/26(火) 00:40:020960デフォルトの名無しさん
2009/05/26(火) 01:31:330961デフォルトの名無しさん
2009/05/26(火) 02:45:44ローカル変数のバッファオーバーラン検出用じゃないの?
0962デフォルトの名無しさん
2009/05/26(火) 02:59:46CodeGear(旧Borland)のCodeGuaedでも似たような手法を使っている
ダミーデータを埋め込み、不正な書きこみ、例えば配列の添え字外の
書きこみなどを検出している
時々お節介な事もしてくれるが、ポインタ関係で悩ましいバグが取れない
時は重宝してるよ
0963デフォルトの名無しさん
2009/05/26(火) 19:58:50>>962
ありがとうございます。
何か用途があるのかと思って調べてたので、スッキリしました。
0964デフォルトの名無しさん
2009/05/26(火) 21:28:27int main(void)
{
puts("は?ははは");
return0;
}
を逆アセンブったところ
Ollydbgでは
s=は?ははは
IDAProでは
db '0h'
db '0h'
みたいに続くのですが、これをs=は?ははは
のように見れませんか?
0965デフォルトの名無しさん
2009/05/29(金) 09:40:50datarescueに問い合わせたら?
0966デフォルトの名無しさん
2009/05/30(土) 00:09:54親切な方いましたらよろしくお願いします
0967デフォルトの名無しさん
2009/05/30(土) 09:08:09資料だってあるんだから、見ながらやれば猿でもできる。
0968デフォルトの名無しさん
2009/06/04(木) 05:08:140969デフォルトの名無しさん
2009/06/04(木) 08:21:520970デフォルトの名無しさん
2009/06/04(木) 08:22:11明日の夜までに公開してくれるなら喜ぶ
0971デフォルトの名無しさん
2009/06/12(金) 00:30:29xor ax, ax
xor dx, dx
xor cx, cx
とするいっぽう、別のルーチンでは
mov dh, 0
mov si, 0
となっている実例がありました。他方、別の作者ですと、統一されていて、
レジスタクリアは、16bit一括で
xor di, di
xor cx, cx
としている方もいました。
どちらの方も90年〜93年くらい、ちょうどDOS円熟時代のウイルス作者なのですが、
ご本人がコメントを詳細に付けておられるんで、可読性を考えてmov ch, 0としたとは
あまり考えられないのですが…(個人的な見解ですが、アセンブラの勉強に、太古のウイルスの
ソースコードを追うのは大変有意義であると考えます)。
この件は、もしかしたらマシンサイクル?と関係しているのかなと思っているのですが、
こういった実行サイクル・クロックの有利不利に関する情報のあるWebサイト・書籍がありましたら
ご教示ください。個人的には、上記1番目の作者のものを改変するのであれば、
xor dh, dh
xor si, si
などとしたいところですが。昔、xor レジスタ、レジスタのほうがmov レジスタ、0よりも
実行サイクルが短い、みたいな記述をよくアセンブラ解説系のサイトで見かけたものですから…。
実機実行環境は、80386SX-16MHz/387/6MB RAM、MMX Pentium 200MHz/64MB RAMくらいです。
0972デフォルトの名無しさん
2009/06/12(金) 02:18:51あとRISCマシンならどっちも同じ命令とかよくある。
ふつーに考えて、可読性を考慮しているだけ。
movの方は引数、xorは単なる0clearだろうね。
0974デフォルトの名無しさん
2009/06/12(金) 09:33:10してるかもしれないけど。
0975971
2009/06/12(金) 09:47:21回答ありがとうございます。
なるほどー、いろんな見方があるんですね。
>>972
たしかに現代の計算機ではたかが1クロック稼いだところでなんなの?って感じですけど、
コトは20年前の環境ですんで、悪しからず。開発マシンが386SXで、実行マシンが
286とか初代Pentium 133MHzとかなので。Pentiumだと、パイプライン?だかの影響で、
従前の8086的なアセンブラの記述・手法が逆に祟ってしまうことがある、とどこかで
読んだ記憶があります(はじめての〜80486だったか?)。
>>973
この場合の可読性ってのは、自分で後でパっとみて判るように、ってことでしょうかね。
コメントがびっしり拙い英文で書いてありますが(ネイティヴではない)、ゼロクリアに関しての
言及はなかったですから。
>>974
そうですか!確かに、mov命令ならフラグ変化をさせずに、という「利点」がありますね。
ウイルス作者もなかなかやりますねw あの当事の作者たちは、ある種の強者だったんでしょうか。
0976デフォルトの名無しさん
2009/06/12(金) 10:53:000977デフォルトの名無しさん
2009/06/12(金) 11:01:14先にどうしてもレジスタをクリアしないといけないときぐらいしか利点が無い。
0978971
2009/06/12(金) 11:15:35直リンは避けますが、Googleで"Virus Source Code Database"でぐぐれば、
ちょうど89年〜93年ころの、16Bitアセンブリソースコードが山ほどでてきますよ。
ほとんどは、オリジナル作者の解説がついてますんで、ルーチンを追うのも
さほど苦労はない感じです。COM/EXE Infector型とか、そういうのが主流でした。
あと、ディレクトリエントリぶっ壊したり、COMMAND.COMを書き換えたり、
ブートディスクのすべてのサブディレクトリを逐次探索して、そこのCOM/EXEに
ことごとく自分のウイルスヘッダ?をぶち込んで機能不全にし、撒き散らしたりとか、ですか。
でも、昨今のウイルスに比べれば、頑張って作っている様子はわかりますよ(苦笑
>>977
なるほど。
0979デフォルトの名無しさん
2009/06/12(金) 11:16:590980デフォルトの名無しさん
2009/06/12(金) 11:20:34好みの問題だけどな。
あ、キャリーフラグが面倒かw
8086系以外のCPU使ってるとその辺は色々あっておもしろいぞw
ゼロクリア専用の命令があるのとかな。
0981デフォルトの名無しさん
2009/06/12(金) 11:24:370982デフォルトの名無しさん
2009/06/12(金) 12:09:27どこか適当なところを次スレに...と思ったら、本スレのPart13が即死で落ちて
止まってたんだな。
次スレはこれをリサイクルしますか?
http://pc12.2ch.net/test/read.cgi/tech/1199952217/l50
0983デフォルトの名無しさん
2009/06/12(金) 16:03:300984デフォルトの名無しさん
2009/06/12(金) 16:31:00ゼロクリアしたりするな。
0985デフォルトの名無しさん
2009/06/13(土) 02:00:510986デフォルトの名無しさん
2009/06/13(土) 04:14:160987デフォルトの名無しさん
2009/06/14(日) 01:25:560988デフォルトの名無しさん
2009/06/14(日) 04:22:360989デフォルトの名無しさん
2009/06/14(日) 08:38:280990デフォルトの名無しさん
2009/06/14(日) 14:19:20アセンブラを学ぶのに参考になりやすかい?
0991デフォルトの名無しさん
2009/06/14(日) 14:36:400992デフォルトの名無しさん
2009/06/14(日) 15:40:500993デフォルトの名無しさん
2009/06/14(日) 23:23:120994デフォルトの名無しさん
2009/06/14(日) 23:51:030995デフォルトの名無しさん
2009/06/15(月) 18:08:45.batによって自動化させるにはどのように記述すればいいですか?
0996デフォルトの名無しさん
2009/06/15(月) 18:43:47q
[EOF]
debug < q.txt
0997デフォルトの名無しさん
2009/06/15(月) 18:44:18というファイル(q.txtとする)を作って、
バッチファイルでは、
debug < q.txt
とする。
0998デフォルトの名無しさん
2009/06/15(月) 20:09:120999デフォルトの名無しさん
2009/06/15(月) 23:00:151000デフォルトの名無しさん
2009/06/15(月) 23:07:0210011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。