アセンブリ言語(王シュアン)リアクション章III

第III章

学習・アクセス・メモリ・レジスタの観点から

メモリストレージ内の単語の3.1

店舗にCPU、メモリセルがのでメモリ16の格納ワード、上位高バイトと低次の低バイトの8ビットの8ビットレジスタ、1つのバイトので、2つの連続したアドレス記憶手段図に示すように、低アドレス部に格納された下位バイトは、上位バイトは、高いアドレス部に格納され

ここに画像を挿入説明

0,1つのメモリ・ストレージ・ユニット4E20Hのアドレス0から始まる単語のような細胞、開始アドレス2つのメモリユニット1ワード格納部124EHみなす1,2、我々は、N個のアドレスワードを開始しますN個のアドレスワードは0012H、2バイトのデータはアドレス位置12H、判別に格納されているような第2のアドレスワード単位で格納されたフォントデータとしてユニットセルと呼ばれるフォントデータデータタイプBYTE

3.2 DSと[アドレス]

メモリセルの第1のアドレスは8086CPU、セグメントアドレスとオフセットアドレス成分によるメモリアドレスで指定された場合、DSレジスタは、典型的には、リードとして、アクセスするデータ・セグメント・アドレスを格納するために使用されるメモリセルへのCPU書き込みフェッチユニット10000H含有量は、次のプログラムセグメントを用いて行うことができます

mov bx,1000H
mov ds,bx
mov al,[0]

[]の動作対象がメモリユニットである[...] ...オフセットアドレスは、CPUの命令実行のセグメントアドレスを自動的8086CPUはながら得DSから除去示すサポートされていないデータを直接セグメント・レジスタ操作、それが必要です転送に追加のレジスタ、メモリユニットに供給されるデータら10000H

mov bx,1000H
mov ds,bx
mov [0],al

3.3ワード伝送

8086CPU構造16は、即ち、ワードを16ビットのデータを送信することができる使い捨てであるため

mov bx,1000H
mov ds,bx
mov cx,2266H
mov ax,[0] ;1000:0处的字型数据送入ax
mov [0],cx

ここに画像を挿入説明

0~8ビット66Hの低いフォントデータ、上位8ビット用22H:ランAX = 1123H、1000後

3.4 MOV、ADD、SUBコマンド

今の形に知られているMOV命令

MOVレジスタ、データのmov斧、8

MOVレジスタ、レジスタのmov斧、BX

MOVレジスタ、メモリ位置のMOV AX、[0]

MOVのメモリユニット、レジスタMOV [0]、斧

MOVセグメント・レジスタ、レジスタのMOV DS、AX

MOVレジスタ、セグメントレジスタのMOV AX、DS

MOVメモリユニット、セグメントレジスタMOV [0]、DS

MOVセグメントレジスタ、メモリセルMOV DSは、[0]
ないMOVメモリユニット、メモリユニットであります

命令を追加

レジスタ、データを追加

レジスタを追加し、登録

レジスタ、メモリの場所を追加

メモリユニット、レジスタを追加

サブ命令

サブレジスタ、データ

サブレジスタ、レジスタ

サブレジスタ、メモリ・ロケーション

サブメモリユニット、レジスタ

サブセグメント・レジスタは、「DSを追加し、斧」などの操作を行うことができない追加

3.5データセグメント

以下のように定義123B0H〜123B9Hデータセグメントのメモリセルは、データは今、最初の3つのユニットでこのデータセグメントに蓄積されます

mov ax,123BH
mov ds,ax ;输入数据段的段地址
mov al,0
add al,[0]
add al,[1]
add al,[2]

フォントデータの場合

mov ax,123BH
mov ds,ax ;输入数据段的段地址
mov ax,0
add ax,[0]
add ax,[2]
add ax,[4]

3.6スタック

特殊性:LIFO

CPUによって提供3.7スタック機構

8086CPUベースのプログラミングでは、メモリのセクションは、スタックとして使用することができる、基本命令PUSHおよびPOPのために、プッシュ斧斧データがスタックに登録表し、POP AXは8086CPU、AXにスタックから抽出されたデータを表します。プッシュとポップ操作はワード単位運ば

mov ax,0123H
push ax
mov bx,2266H
push bx
mov cx,1122H
push cx
pop ax
pop bx
pop cx

ショー上記下実行コード

ここに画像を挿入説明

上部要素にSP点、プッシュとは、命令をポップ命令実行、から:8086CPU、いつでもスタック・セグメントアドレスがSSに格納され、セグメントはSSとSPレジスタレジスタSS、オフセットアドレスは、SPに格納されているがありますSSとSPスタックアドレスを取得します

次の2つのステップを実行することによって行われるプッシュ斧

1、SP = SP-2、スタックの新しいトップとして

2、斧の内容はSSを供給:新しいメモリ位置にSPを指さ

スタックは、スタック内のどの要素空でない場合、上部要素は、すべてのSSは存在しない:SPスタックは、最下部の単位セルの下だけ指すことができ、オフセットアドレスワード単位として単位のオフセットアドレス最下+2は、10000H〜1000FHは、このスペースを取ると仮定したときにスタック・セグメント1000アドレスとして一番下のワード単位:スタック空SP = 0010Hそう000E、

斧をポップ、以下のように実行

1、SS:摂食AXの点におけるSPデータ記憶部

2、SP=SP+2,以当前栈顶下面的单元为新的栈顶

要注意原栈顶元素仍然存在,但已经不在栈中,当再次执行push等入栈指令后,将被新的数据覆盖

3.8 栈顶超界的问题

当栈满时再使用push,栈空时再用pop,都将发生栈顶超界问题,栈空间之外的空间里可能存放了具有其他用途的数据代码,超界时很可能将其改写,引发不少错误,且8086CPU不保证对栈的操作不会超界,也不知道我们安排的栈空间有多大,它只考虑当前栈顶在何处、当前要执行的指令是哪一条

我们要根据可能用到的最大栈空间来安排栈的大小

3.9 push、pop指令

push、pop还有如下指令

push 段寄存器

pop 段寄存器

push 内存单元 ;注意操作以字为单位,将一个内存字单元处的字入栈

pop 内存单元

将10000H~1000FH这段空间当作栈,初始状态栈是空的,将ax、bx、ds中的数据入栈

mov ax,1000H
mov ss,ax	;注意不能直接向段寄存器送入数据

mov sp,0010H	;注意栈空时栈顶偏移地址的设置
		    ;编程中要自己注意栈的大小

push ax
push bx
push ds

将寄存器清零可用

sub ax,ax

将10000H~1000FH这段空间当作栈,初始状态栈是空的,设置ax=001AH,bx=001BH,利用栈交换ax和bx中的数据

mov ax,1000H
mov ss,ax
mov sp,0010H

mov ax,001AH
mov bx,001BH

push ax
push bx

pop ax
pop bx

注意push、pop等栈操作命令,修改的只是SP,即栈顶的变化范围最大为0~FFFFH

用栈来暂存以后需要恢复的寄存器的内容时,出栈的顺序要和入栈的顺序相反

3.10 栈段

如果将10000H~1FFFFH这段空间当作栈段,初始状态栈是空的,此时SS=1000H,SP=?

当栈中只有一个元素时,SP=FFFEH,栈为空就相当于唯一的元素出栈,SP=SP+2,SP=0,当有元素入栈时,SP=SP-2,SP=FFFEH

一个栈段最大的容量为64KB

我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元,这是我们自己的安排,一段内存既可以是代码的存储空间,又是数据的存储空间,还可以是栈空间,这关键在于是CS:IP还是SS:SP还是DS的指向

编程,使10000H~1000FH中的8个字逆序复制到20000H-2000FH

ここに画像を挿入説明

方法一、右边的看作一个栈段

mov ax 1000H
mov ds,ax

mov ax,2000H
mov ss,ax
mov sp,10H

push [0]
push [2]
push [4]
push [6]
push [8]
push [A]
push [C]
push [E]

方法二、左边的看作一个栈段

mov ax,2000H
mov ds,ax

mov ax,1000H
mov ss,ax
mov sp,0

pop [E]
pop [C]
pop [A]
pop [8]
pop [6]
pop [4]
pop [2]
pop [0]
公開された84元の記事 ウォン称賛7 ビュー10000 +

おすすめ

転載: blog.csdn.net/weixin_43569916/article/details/104304299