8086汇编复习2 - 使用emu8086

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。

发布了475 篇原创文章 · 获赞 545 · 访问量 304万+

猜你喜欢

转载自blog.csdn.net/bcbobo21cn/article/details/104580945
今日推荐