« 2007年11月 | トップページ | 2008年1月 »

2007年12月の2件の記事

2007-12-04

独習アセンブラ リスト5-2

独習アセンブラ 翔泳社の第5章のリスト 5-2です。

まず、初めに'A'をスタックに積み、
このスタックのアドレスをecxに移動します。
このecxを介して、
スタック上の値をインクリメントして、
出力してみます。


01: section .text
02: global  _start
03: 
04: _start:
05:         push    'A'
06:         mov     ebx, 1
07:         mov     ecx, esp
08:         mov     edx, 1
09: dispchr:
10:         mov     eax, 4
11:         int     0x80
12:         inc     byte [ecx]
13:         cmp     byte [ecx], 'Z' + 1
14:         jnz     dispchr
15: 
16:         pop     eax
17: 
18:         mov     eax, 1
19:         mov     ebx, 0
20:         int     0x80


5行目でスタックに'A'を積みます。
7行目ecxに'A'のスタック上のアドレスを移動します。
11行目で出力し、
12行目でecxの指すアドレスに格納されている値を
インクリメントします。
ecxはスタックのトップを指していて、
スタックのトップには'A'が格納されていたので、
これをインクリメントする事で、
スタックのトップの値が'B'となります。
14行目でdispchrにジャンプしなかった場合に
スタックからポップしてプログラムを終了します。




| | コメント (0) | トラックバック (0)

独習アセンブラ リスト5-1

独習アセンブラ 翔泳社の第5章のリスト 5-1です。

本文では、org 100hとなっているので、
ジャンプ先が100hですが、
これをLinuxで実験する勇気がないので、
似た事をやってみました。
P.174の定数の定義の項に、
$は式の含まれる行の先頭のアセンブリ位置を表します。
とありますので、$を利用して
アドレスを取得する事ができそうです。


01: section .data
02: 
03: dat     db '@'
04: 
05: section .text
06: global  _start
07: 
08: _start:
09:         push    $
10:         mov     eax, 4
11:         mov     ebx, 1
12:         mov     ecx, dat
13:         mov     edx, 1
14:         int     0x80
15:         pop     eax
16:         jmp     eax


これで、似たような事ができていると思います。
@マークを出力する無限ループとなります。
[Ctrl] + [C]キーでプログラムを中断して終了します。

まず、9行目で9行目のアドレスをスタックに積みます。
datを出力後に15行目で
スタック上の9行目のアドレスをeaxに取得します。
16行目で取得したアドレスにジャンプします。




| | コメント (0) | トラックバック (0)

« 2007年11月 | トップページ | 2008年1月 »