スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

NASMでアセンブリ

アセンブリの基礎がとりあえず終わったので、応用へ。

NASM(Netwide Assembler)をNASM sourceforgeからDLして適当に展開してコンパイルしてみます。
アセンブラのバージョンは0.98.39だそうな。(ファイル名がnasm-2.06rc10だからバージョン2かと思ったらそうではない)

初めてのNASMプログラムは、コレ。
<putchar.asm>

   org 100H
section .text
start:
   mov ah, 02H
   mov dl, 41H
   int 21H
   mov ah, 4CH
   int 21H


画面に'A'と出力するだけのプログラムです。

コンパイル~

>nasm putchar.asm -fbin -o putchar.com
>putchar


>アクセスが拒否されました


実行できない・・・!

これは実行権限がなかったからでした。(rw-rw-rw-になっていました)

>chmod u+x putchar.com


で権限を与えてやれば実行できました。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コマンドプロンプトでアセンブリ

何度かアセンブリでプログラムを書いて実行させていると、強制終了という事態に会うことがあります。

その理由のひとつが、プログラムの修正にある気がしたので
以下のようなプログラムを組んでみました

例えば

-a 0100
2D16:0100 mov ax, 5
2D16:0103 mov bx, 3
2D16:0106 add ax, bx
2D16:0108<ENTER>


というプログラムを記述した後、一行目を

mov al, 5


と修正したくなったとします。

-a 0100
2D16:0100 mov al, 5
2D16:0102 <ENTER>


とすることでプログラムを修正することができます。


-g=0100 0106


と実行すると・・・

AXが5、BXが0となって終了しました。
強制終了されなかったです。
あれ?
ass_edit.png
なんだか不思議な動きをしているなぁ。。。



もうひとつ分かったこと。

-a 0100
2D16:0100 mov ax, 5
2D16:0103 mov bx, 3
2D16:0106 add ax, bx
2D16:0108<ENTER>


-a 0106
2D16:0106 inc bx
2D16:0107<ENTER>


として、

-g=0100 0108


を実行すると、終了アドレスが異なるためか、何も言わずにdebugを抜けてしまう。

テーマ : プログラミング
ジャンル : コンピュータ

今日もDIV命令

相変わらずDIV命令の不可解さに苦しめられております。

2D25:0100 mov ax, 0108
2D25:0103 mov bx, 5
2D25:0106 div bx
2D25:0108 div bl
-t=0110 4


を実行した直後、もう一度

-t=0110 4


をやってみました。

なんかエラーが出て終了されました。
debug_error.png

まだ、このエラーの意味は分かりません。
もうDIVは嫌なので、次に進もうと思います。

テーマ : プログラミング
ジャンル : コンピュータ

divがねー

mov al, 7
mov bl, 2
div bl


とすると、
AX=0103になります。

コレは正しいのでいいのです。
もう一度実行すると、
AX=0183になります。

DIV命令は、与えられたオペランドのサイズによってAXを見るのか、ALを見るのか変わる。
と、そうこないだ覚えたばかりなんですけどね。

DIVにBXを与えようがBLを与えようが、AXを割っていますね、これは。

何が正しいのか・・・

テーマ : プログラミング
ジャンル : コンピュータ

乗除算

今日は、乗算と除算
乗算の命令はMULです
mul bl
のように記述します。

加減算とは違ってオペランドは1つ(ソースオペランド)しか取りません。

AX(AL)レジスタと指定された値の演算結果が、AX(AL)レジスタに格納されます。
処理的イメージは、(addのように書くならば)
mul al, bl
でしょうか。

なぜデスティネーションオペランドを記述しないのでしょうか?
それは、MULに与えられたオペランドの桁数によって、演算結果の格納先がAXになったりALになったりするからです。
具体例を以下に示します。

2D25:0100 mov ax, 100
2D25:0103 mov bx, 2
2D25:0106 mul bl

とすると、AX=0000 となります。

2D25:0100 mov ax, 100
2D25:0103 mov bx, 2
2D25:0106 mul bx

とすると、AX=0200となります。


MULのオペランドに8bitレジスタが与えられた場合、
ALレジスタ×BLレジスタ という演算が行われ、
AX(16bit)に結果が格納されます。
演算対象がALレジスタだったため、100の下2桁だけで演算されてしまい結果が0になりました。


MULのオペランドに16bitレジスタが与えられた場合、
AXレジスタ×BXレジスタ という演算が行われ、
DX(上位16bit)とAX(下位16bit)に格納されます。
こちらはAXレジスタを演算対象としたため、200となったわけです。



除算の命令はDIVです。
div bl
のように書きます。
演算結果の格納は乗算と似ています。
除算は商と余りを格納するという点が異なります。

8bitを指定した場合、
AXの上位8bitに余りを
AXの下位8bitに商を格納します。

16bitを指定した場合、
DXに余りを
AXに商を格納します。


今日はこんなところで。

テーマ : プログラミング
ジャンル : コンピュータ

プロフィール

森嶋晃介

Author:森嶋晃介
社会人2年目。
独学する勉強のために、いろいろ手を出して、それについて書いていく予定です。
今年こそ、たくさん書くぞ

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。