……………………第三章……………………
3.4 mov、add、sub指令
mov指令形式:mov 寄存器,数据
mov 寄存器,寄存器
mov 寄存器,内存单元
mov 内存单元,寄存器
mov 寄存器,内存单元
mov 段寄存器,寄存器
mov 寄存器,段寄存器
add指令形式:add 寄存器,数据
add 寄存器,寄存器
add 寄存器,内存单元
add 内存单元,寄存器
sub指令形式:sub 寄存器,数据
sub 寄存器,寄存器
sub 寄存器,内存单元
sub 内存单元,寄存器
add指令和sub指令不可以对段地址进行操作。
3.1~3.5小结
1.字在内存中存储时,要用两个地址连续的内存单元来存放,字的低位字节存放在低地址单元中,
高位字节存放在高地址单元中。
2.用mov指令访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中。
3.[address]表示一个偏移地址为address的内存单元。
4.在内存和寄存器之间传送字型数据时,高地址单元和高8位寄存器、低地址单元和低8位寄存器相对应。
5.mov、add、sub是具有两个操作对象的指令。jmp是具有一个操作对象的指令。
6.可以根据自己的推测,在Debug中实验指令的新格式。
检测点3.1
1.在Debug中,用“d 0:0 1f”查看内存,结果如下。
0000:0000 68 10 A7 00 8B 01 70 00-16 00 A9 03 8B 01 70 00 h.....p.......p.
0000:0010 8B 01 70 00 B9 06 12 02-40 07 12 02 FF 03 12 02 ..p.....@.......
下面的程序执行前,ax=0,bx=0,写出每条汇编指令执行完后相关寄存器中的值。
mov ax,1
mov ds,ax
mov ax,[0000] ax=018b
mov bx,[0001] bx=7001
mov ax,bx ax=7001
mov ax,[0000] ax=018b
mov bx,[0002] bx=0070
add ax,bx ax=01fb
add ax,[0004] ax=08b4
mov ax,0 ax=0000
mov al,[0002] ax=0070
mov bx,0 bx=0000
mov bl,[000c] bx=00ff
add al,bl ax=006f
提示,注意ds的设置。
2.写出CPU执行每条指令后,CS,IP和相关寄存器中的数值。
mov ax,6622H
cs=2000 ip=3 ds=1000 ax=6622 bx=0
jmp 0ff0:0100
cs=0ff0 ip=0100 ds=1000 ax=6622 bx=0
mov ax,2000H
cs=0ff0 ip=0103 ds=1000 ax=2000 bx=0
mov ds,ax
cs=0ff0 ip=0105 ds=2000 ax=2000 bx=0
mov ax,[0008]
cs=0ff0 ip=0108 ds=2000 ax=c389 bx=0
mov ax,[0002]
cs=0ff0 ip=010b ds=2000 ax=ea66 bx=0
再次体会:数据和程序我认为没有区别都是二进制存放,可它又有区别,看CPU是把她当数据还是当程
序,由cs:ip执行的指令是程序,由ds执行的是数据。
第三章……栈的综述
1.8086CPU提供了栈操作机制,方案如下。
在SS、SP中存放栈顶的段地址和偏移地址;
提供入栈和出栈指令,它们根据SS:SP指示的地址,按照栈的方式访问内存单元。
2.push指令的执行步骤:①SP=SP-2;②向SS:SP指向的字单元中送入数据。
3.pop指令执行步骤:①从SS:SP指向的字单元中读取数据;②SP=SP-2。
4.任意时刻,SS:SP指向栈顶元素。
5.8086CPU只记录栈顶,栈空间的大小我们要自己管理。
6.用栈来暂存以后需要恢复的寄存器的内容时,寄存器出栈的顺序要和入栈的顺序相反。
7.push、pop实质上是一种内存传送指令,注意他们的灵活应用。
第三章……段的综述
我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元。这完全是我们
自己的安排。
我们可以用一个段存放数据,将它定义为“数据段”;
我们可以用一个段存放代码,将它定义为“代码段”;
我们可以用一个段当做栈,将它定义为“栈段”。
我们可以这样安排,但若要让CPU按照我们的安排来访为这些段,就要:
对于数据段,将它的段地址放在DS中,用mov、add、sub等访问内存单元的指令时,CPU就将我们定义的
数据段中的内容当做数据来访问;
对于代码段,将它的段地址放在CS中,将段中第一条指令的偏移地址放在IP中,这样CPU就将执行我们
定义的代码段中的指令;
对于栈段,将它的段地址放在SS中,将栈顶单元的偏移地址放在SP中,这样CPU在需要进行栈操作的时
候,比如执行push、pop指令等,就将我们定义的栈段当做栈空间来用。
可见,不管我们如何安排,CPU将内存中的某段内容当做代码,是因为CS:IP指向了那里;CPU将某段内
存当做了栈,是因为SS:SP指向了那里。我们一定要清楚,什么是我们的安排,以及如何让CPU按我们的安
排行事。要非常清楚CPU的工作原理,才能在控制CPU按我们的安排运行的时候做到游刃有余。
一段内存,可以既是代码的存储空间,又是数据的存储空间,还可以是栈空间,也可以什么也不是。关
键在于CPU中寄存器的设置,即CS、IP、SS、DS的指向。
检测点3.2
(1)mov ax,2000H
mov ss,ax
mov sp,0010H
(2)mov ax,1000h
mov ss,ax
mov sp,0000h
实验任务二
1.使用Debug,将上面的程序段写入内存,啄条执行,根据指令执行后的实验
运行情况填空。
mov ax,ffff
mov ds,ax
mov ax,2200
mov ss,ax
mov sp,0100
mov ax,[0] ;ax=5BEAH
add ax,[2] ;ax=5CCAH
mov bx,[4] ;bx=30F0H
add bx,[6] ;bx=6027H
push ax ;sp=00FEH ;修改的内存单元的地址是2200:00FE 内容为 5CCAH
push bx ;sp=00FCH ;修改的内存单元的地址是2200:00FC 内容为 6027H
pop ax ;sp=00FEH ;ax=6027H
pop bx ;sp=0100H ;bx=5CCAH
push [4] ;sp=00FE ;修改的内存单元的地址是00FE 内容为30F0H
push [6] ;sp=00FC ;修改的内存单元的地址是00FC 内容为2F38H
2. -d 2000:0 f
2000:0000 00 00 00 00 00 00 00 20-00 00 08 01 39 0B 9D 05
其中059D是标志寄存器的值;0B39是CS的值;0108是IP的值;2000是AX的值。 |