1 除法指令
div指令
除法指令。
除数有8位和16位两种,在一个reg或内存单元中;
被除数默认放在AX或DX和AX中,如果除数为8位,被除数则为16位,默认在AX中存放;
如果除数为16位,被除数则为32位,在DX和AX中存放;DX存放高16位,AX存放低16位;
结果:如果除数为8位,则AL存储除法操作的商,AH存储除法操作的余数;
如果除数为16位,则AX存储除法操作的商,DX存储除法操作的余数;
指令 div byte ptr ds:[0],含义是:
ax寄存器的内容 / (ds寄存器的内容 * 16 + 0)处存放的数据;
商放入al;余数放入ah;
利用除法指令计算 1001/100;
1001可用ax存放,100可用8位寄存器存放,进行的是8位的除法;程序;
mov ax, 1001
mov bl, 100
div bl
程序执行以后,al寄存器内容为0AH(即10),ah内容为1(余数);
2 汇编伪指令
伪指令
在汇编语言源程序中,包含两种指令;一种是汇编指令,一种是伪指令。
汇编指令有对应的机器码,最终为CPU所执行。
伪指令没有对应的机器指令,最终不被CPU执行。
伪指令由编译器执行,编译器根据伪指令进行相关的编译工作。
segment和ends是一对成对使用的伪指令;功能是定义一个段。
一个汇编程序由多个段组成,这些段被用来存放代码、数据或当作栈空间来使用。
一个有意义的汇编程序至少要有一个段,这个段用来存放代码。
end是一个汇编程序的结束标记。
而ends,是和segment成对使用的,标记一个段的结束,ends可理解为“end segment”。
assume伪指令的含义为“假设”。它假设某一段寄存器和程序中的某一个用segment...ends定义的段相关联。
使用emu8086仿真执行一段简单程序;
mov ax, 0123H
mov bx, 0456H
add ax, bx
add ax, ax
mov ax, 4c00H
int 21H
最后两句是程序返回;
执行完之后emu8086提示:返回控制权给操作系统;
3 [BX]和内存单元
[BX]和内存单元
[0]表示内存单元,它的偏移地址是0;
mov ax, [0]
将一个内存单元的内容送入ax,内存单元的长度为2字节,偏移地址为0,段地址在ds中;
mov al, [0]
将一个内存单元的内容送入al,内存单元的长度为1字节,偏移地址为0,段地址在ds中;
要完整描述一个内存单元,需要两种信息:内存单元的地址,内存单元的长度(类型);
[bx]表示一个内存单元,偏移地址在bx中;
mov ax, [bx]
将一个内存单元的内容送入ax,内存单元的长度为2字节,偏移地址在bx中,段地址在ds中;
mov al, [bx]
将一个内存单元的内容送入al,内存单元的长度为1字节,偏移地址在bx中,段地址在ds中;
在emu8086输入程序段:
mov ax, 2000H
mov ds, ax
mov bx, 1000H
mov ax, [bx]
启动执行;先不运行;先手动在仿真内存2000:1000手动输入数据十进制99(16进制63);
然后单步运行程序;
4 转移指令
8086CPU的转移行为有:
只修改IP,称为段内转移,比如 jmp ax;
同时修改CS和IP,称为段间转移,比如 jmp 1000:0;
由于转移指令对IP的修改范围不同,段内转移又分为:短转移和近转移;
短转移IP的修改范围为 -128 - 127;
近转移IP的修改范围为 -32768 - 32767;
8086CPU的转移指令分为以下几类:
无条件转移指令,如jmp;
条件转移指令;
循环指令,如loop;
过程;
中断;
操作符 offset 在汇编语言中是由编译器处理的符号,它的功能是取得标号的偏移地址;
jmp short 标号
转到标号处执行指令;
这种格式是段内短转移,short说明指令进行的是短转移;
转移指令结束后,CS:IP应该指向标号处的指令;
start: mov ax, 0
jmp short s
add ax, 1
s: inc ax
上面程序执行之后,ax中的值为1;
因为jmp short s 后,越过了add ax, 1,程序只进行了一次ax加1操作;
在emu8086中可以单步执行,或run整个程序;
5 栈
栈是一种具有特殊的访问方式的存储空间。特点是:最后进入这个空间的数据,最先出去。
后进先出,LIFO。(Last In First Out)
栈有2个基本操作:入栈,出栈。
入栈就是将一个新的元素放到栈顶;出栈就是从栈顶取出一个元素。
在基于8086编程时,可以将一段内存当作栈来使用。
8086CPU提供入栈和出栈指令,最基本的两个是PUSH,POP。
push ax,将ax中的数据送入栈;pop ax,从栈顶取出数据送入ax。
8086CPU的入栈和出栈是以字为单位进行。
mov ax, 0123H
push ax
mov bx, 2266H
push bx
mov cx, 1122H
push cx
pop ax
pop bx
pop cx
字型数据用两个单元存放,高地址单元存放高8位,低地址单元存放低8位。
在emu8086中执行程序;运行以后;点击 stack 按钮,弹出仿真栈窗口;
stack窗口里面的箭头(小于号)是栈顶指针;
6 谁将可执行文件中的程序装载进入内存并使它运行
DOS中,可执行程序P1若要运行,必须有一个正在运行的程序P2,将P1从可执行文件加载入内存,将CPU的控制权交给它,P1才能得以运行;P1运行完毕,应该将CPU的控制权交还给P2。
P2是什么?程序运行结束,返回到哪里?
任何通用的操作系统,都要提供一个称为shell(外壳)的程序,操作人员使用这个程序来操作计算机。
command.com,在DOS中称为命令解释器,也就是DOS的shell。
在DOS中,command处理各种输入:命令或要执行的程序的文件名。
在DOS中,是正在运行的command,将可执行程序加载入内存;
command设置CPU的CS:IP指向程序的第一条指令,从而使程序得以运行;
程序运行结束,返回到command中,CPU继续运行command。