汇编基础-实例分析

一、[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

扫描二维码关注公众号,回复: 1885091 查看本文章

二、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* 转移

猜你喜欢

转载自blog.csdn.net/pragma_g/article/details/78815608