63.一般来说,需要暂存的数据,我们都应该使用栈.
64.offset是由编译器处理的符号,它的功能是取得标号的偏移地址.
65.ret和retf指令
ret指令用栈中的数据,修改IP的内容,从而实现近迁移
retf指令用栈中的数据,修改CS和IP的内容,从而实现远迁移.实际上一个是段内迁移,一个则可用于段之间的迁移.
66.CPU执行ret指令时,会进行下面的操作:
a) (IP)=((ss)*16+sp)
(sp)=(sp)+2
67.CPU执行retf指令时,进行下面的操作:
a) (IP)=((ss)*16+sp)
b) (sp)=(sp)+2
c) (cs)=((ss)*16+(sp))
d) (sp)=(sp)+2
68.call指令:CPU执行call指令时进行两步操作:
a) 将当前的IP或CS和IP压入栈中.
b) 转移
69.div除法和mul乘法
adc:带进位的加法指令
sbb:带进位的减法指令
cmp:比较指令,相当于减法,不保存结果,但是影响标志位.
70.最后一个知识点.包含多个段的程序.
end:除了通知编译器结束外,还可以通知编译程序的入口在什么地方.
数据,栈和代码放到不同的段中.
assume cs:code,ds:data,ss:stack
data segment
dw 0123H,0456H,0789H,0abcH,0defH,0fedH
data ends
stack segment
dw 0,0,0,0,0,0
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16 //设置栈顶
mov ax,data
mov ds,ax //ds指向data段
mov bx,0 //ds:bx指向第一个单元
mov cx,8
s: push [bx]
add bx,2
loop s //所有数据入栈
mov bx,0
mov cx,8
s0: pop [bx]
add bx,2
loop s0
mov ax,4c00H
int 21H
code ends
end start
注释:
a)定义多个段的方法:和普通的定义段没有区别,只是不同的段需要取不同的名字.
b)对段地址的引用,在程序中,段名就相当于一个标号,它代表了段地址.
mov ax,data
一个段中的段地址可由段名代表,偏移地址就要看在段中的位置.
c)代码段,数据段和栈段完全是自己设定的,即设定相应的寄存器.
想更深入的学习就需要继续研究...OVER...!