ローカル変数とスタックオーバーフロー

 アセンブリ言語においてローカル変数を実現する方法を勉強した。

スタック領域を一時的にローカル変数用の領域として確保する方法だ。

ローカル変数用の領域はスタック領域に作られるので大きすぎる配列などを用意すると

領域をオーバーしてしまう。

また、再帰が長く続きすぎるとその度にローカル変数用の領域が大きくなっていくので

結局領域をオーバーする。

これをスタックオーバーフローという。

自作プログラムで時々みたエラーが具体的にどう発生しているのかわかって有意義だった。
ジャジャガッチ | アセンブリ言語 | 15:59 | comments(0) | trackbacks(0) |

とりあえず目標達成

 ついにアセンブリ言語でオイラー法を実装することが出来た。

結果はC言語で作ったものと完全に一致するので載せない。

あとやりたいのはC言語で作ったものとの速度比較とか、C言語の方は

アセンブリでどういう風に書かれているかみたりしたいな。

bits 16
org 0x100

mov dx,file
mov cx,0
mov ah,0x3c
int 0x21;ファイルを開く
mov [fh],ax;ファイルハンドラをとっとく
mov bx,[fh]
mov dx,y

doit:
cmp byte [i],0
jne aaa
fld qword [D];i=0のときスタック
aaa:
fld qword [y];

fmul st0,st1;掛け算

fstp qword [y];結果をメモリに

mov cx,8
mov ah,0x40
int 0x21

mov cx,10
inc byte [i]
cmp byte [i],0x7f
loopne doit

;ファイル終了処理
mov ah,0x3e
int 0x21
mov ah,0x4c
mov al,0
int 0x21

file db "hello.txt",0
fh dw 0
y dq 1.0
D dq 1.001
i db 0


ジャジャガッチ | アセンブリ言語 | 13:21 | comments(0) | trackbacks(0) |

目標とする微分方程式について

 dy(x)/dx = y(x)

を対象とする。微分した結果が自分自身となる関数は何か?という問題。

言い換えると、各点で傾きを算出してグラフにするとその関数自身のグラフと一致する関数は何か?

例えば二次関数の傾きをプロットすると一次関数となるからこれを満たさない。

正解は指数関数Ae^x。

つまり厳密解が分かっているので数値的に解いてもしょうがないのだが、勉強ということで。

解法はもっとも簡単なオイラー法を採用する。

dy = ydx

と変形してdy = y(x+Δx) - y(x)

と書くと、

y(x+Δx) = y(x)(1+Δx)

と書ける。つまり初期値y(0)を決めればy(Δx)での値が決まり、それを用いてy(2Δx)の値が決まり・・・

として次々と値が決まっていく。まずC言語でやってみる。



厳密解とよく一致している。ソースは続きから。
続きを読む >>
ジャジャガッチ | アセンブリ言語 | 13:03 | comments(0) | trackbacks(0) |

アセンブリ言語でもっと数値計算っぽいことを

 今回はもっと数値計算っぽいことを。

初期値を浮動小数点で用意してループでくるくる回しながら数字を足していく。

これが出来ればちょっとした数値計算は出来る。

微分方程式を解くとか。



bits 16
org 0x100

mov dx,file
mov cx,0
mov ah,0x3c
int 0x21;ファイルを開く
mov [fh],ax;ファイルハンドラをとっとく
mov bx,[fh]
mov dx,r1

doit:
fld dword [r1]
fld dword [r2]
fadd st0,st1
fstp dword [r1]
fstp

mov cx,4
mov ah,0x40
int 0x21
mov cx,10
inc byte [i]
cmp byte [i],0xff
loopne doit

;ファイル終了処理
mov ah,0x3e
int 0x21
mov ah,0x4c
mov al,0
int 0x21

file db "hello.txt",0
fh dw 0
r1 dd 0.0
r2 dd 0.1
i db 0



バイナリをテキスト形式に直すのには前回作ったプログラムを改良したものを使った。

ソースは続きから。

printfでdoubleを表示するときの書式指定は%fが正しいらしい。そうなのか。
続きを読む >>
ジャジャガッチ | アセンブリ言語 | 14:32 | comments(0) | trackbacks(0) |

バイナリファイルをテキストファイル化

 浮動小数点をファイルに書き出してバイナリエディタで確認することができた。

バイナリファイルはプログラムで扱う際には便利だが、やっぱりテキストで見たいということで、

C言語でテキストファイル化することにする。これは簡単。

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
 FILE *fp = fopen("HELLO.TXT","rb");
 float *f = (float*)malloc(sizeof(float));

 fread(f,4,1,fp);

 printf("%f",*f);

 free(f);
 fclose(fp);
 
 return 0;
}


ジャジャガッチ | アセンブリ言語 | 07:37 | comments(0) | trackbacks(0) |

アセンブリ言語-浮動小数点-

 さて、整数は扱えるようになったが、数値計算のためには浮動小数点が使えないといけない。

浮動小数点ってのは例えば123.45なら1.2345×10^2みたいに書くこと。

必ず1.xxxxかける10^xxという形に書くと決めておくと、xの部分の数字の羅列をみると

もとの数値が復元できる。

よく使われる形式は4バイトの場合、

(-1)^(符号ビット)×2^(指数ビット-127)×仮数部

という形。仮数部が1.xxxxのxxxxの部分。4バイトだと仮数部が23ビット。

123.45=+1.92890625×2^6

指数部は127足して表現するから、133=10000101
符号部は0。

よって最初の9ビットは
010000101

仮数部は0.92890625は2の-1乗、-2乗、-3乗、-5乗・・・の和というふうに考える。

全部合わせて16進数で書くと

0x42f6e666

となる。普通はメモリ上へのデータ配置はリトルエンディアンというルールが採用されている。

これは桁の小さいほうのバイトを若いアドレスに入れるというルール。

なのでメモリ上には

66 e6 f6 42

と配置される。では確認しよう。


確かに合っている。

bits 16
org 0x100

mov dx,file
mov cx,0
mov ah,0x3c
int 0x21;ファイルを開く
mov [fh],ax;ファイルハンドラをとっとく

mov bx,[fh]
mov dx,r1
mov cx,4
mov ah,0x40
int 0x21

;ファイル終了処理
mov ah,0x3e
int 0x21
mov ah,0x4c
mov al,0
int 0x21

file db "hello.txt",0
fh dw 0
r1 dd 123.45
ジャジャガッチ | アセンブリ言語 | 07:19 | comments(0) | trackbacks(0) |
1/1PAGES | |

10
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
--
>>
<<
--
PR
RECOMMEND
RECENT COMMENT
MOBILE
qrcode
OTHERS
Since 2013/09/17
LATEST ENTRY
CATEGORY
ARCHIVE
LINKS
PROFILE
SEARCH