您的位置:首页 > 其它

汇编基础-实例分析

2017-12-15 18:00 204 查看
一、[BX]和loop指令
   直接来解释下这两个指令吧!我们知道[0]可以表示偏移量为0的内存单元(段地址存在CS里),[BX}则提供了更为灵活的方式,即mov ax, [bx]的功能是寄存器bx中存放的数据作为一个便宜地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中,即(ax)=((ds)*16+(bx)),()表示寄存器中的值。实际上,[]就表示一个内存单元,其中的数值或寄存器则表示了偏移量的来源。
   loop指令是循环指令,格式是loop 标号。当CPU执行loop命令时需要执行两步操作:1)(cx) = (cx)-1; 2) 判断cx中的值,不为零时则转至标号处执行循环体语句。比如程序:

    assume cs:code

    code segment

           mov ax, 2

           mov cx, 11

    s: add ax, ax

          loop s

          mov ax, 4c00h

          int 21h

    code ends

    end

二、and与or指令

   and指令即逻辑按位与操作,利用此操作可以将操作对象的相应位设为0,其他位不变:

    mov al, 01100011B

    and al, 00111011B

    al = 00100011B  //执行后

or指令即逻辑按位或操作,利用此操作可以将操作对象的相应位设为1,其他位不变:

    mov al, 01100011B

    or al, 00111011B

    al = 01111011B

除了[A-D]X的四个通用寄存器之外,还有与bx功能相近的两个寄存器:si与di,si与di不能够分成两个8位寄存器来使用,其余功能类似,比如:

    mov bx, 0

    mov ax, [bx]

    mov si, 0

    mov ax, [si]

下面的语句功能也是一样的:

    mov bx, 0

    mov ax, [bx+123]

    mov si, 0

    mov ax, [si+123]

    mov di, 0

    mov ax, [di+123]

    mov di, 0

    mov ax, [di]

三、转移指令

   可以修改IP,或同时修改CS和IP的指令统称为转移指令。8086CPU的转移行为有两类:

-1. 只修改IP,称为段内转移,如:jmp ax;

-2. 同时修改CS和IP,称为段外转移,如:jmp 1000:0;

   至于call和ret指令,其实也是转移指令,从执行效果上看:

-1. CPU执行ret指令时,相当于进行:pop IP;

-2. CPU执行retf指令时,相当于进行:pop IP; pop CS;

   当CPU执行call指令时,进行两步操作:

-1* 将当前的IP或CS和IP一起压入栈中;

-2* 转移
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  汇编