zoukankan      html  css  js  c++  java
  • 汇编指令

    数据传送类指令

    数据交换指令

      完成两个操作数间的数据交换,操作数可以是寄存器和存储单元,但是不能两个都是存储单元(与MOV指令一样,可以用寄存器作为中间媒介)。并且,段寄存器不能作为操作数。下面代码需注意VAR1的默认段是CS,而VAR1[BP]默认是SS段,如果这两个段偏移不同,则变量VAR1最终不能还原到0012H。

    MOV BP,0000H;          
    XCHG BX,[BP+SI];
    XCHG BX,VAR1; //交换VAR1和BX的值       
    XCHG BX,VAR1[BP];//交换SS:BP+VAR1地址内容和BX的值
    ret   
    VAR1 DW 0012H;

    地址传送指令

      把源操作数的偏移地址传到目的操作数,相当于MOV OFFSET。对于[寄存器值]类似的形式,就是去括号的过程;对于变量,尤其注意传送的不是变量的值。

    LEA BX, [BP];//把BP赋给BX
    LEA AX,VAR1;//把VAR1的偏移地址赋给AX
    MOV AX,OFFSET VAR1;

    地址指针传送指令

      该类指令获取双字的存储内容,将内容的高16位送入段寄存器,低16位送给目的寄存器。其中,LDS将高16位送入DS段寄存器,LES则送入ES段寄存器。源操作数为变量或者寄存器间接寻址方式(这里狭义地将出现方括号和寄存器的所有寻址方式统称为寄存器间接寻址)。

      下例中首先将变量VAR1的低16位0012H送到BX,高16位0100H送到DS;之后用LES指令对AX赋值0012H,并且将ES改为了0100H;

    LDS BX,VAR1;
    MOV [BX],0012H;
    MOV [BX+2],0100H; 
    LES AX,[BX];
    ret   
    VAR1 DD 01000012H;

    堆栈操作指令

      堆栈是存储器的一部分,其地址由SS段和SP段管理。栈底地址较大,栈顶地址较小。初始化一个空堆栈后,SP指向栈底,当压入数据后,SP指向栈顶,堆栈结构如下图所示(栈底永远都是空的)。

      PUSH操作时,先修正SP的值(减2),再将字型数据填入SP所指位置;POP操作相反,先将栈顶的字型数据送出,然后修正SP的值(加2)。下例三次压入后,SP值为00F9H,三次弹出以后,SP又回到00FFH。

    MOV AX,0100H;
    MOV SS,AX;
    MOV SP,00FFH;//初始化堆栈
    
    PUSH AX;//压入0100H
    PUSH 0202H;//压入0202H
    PUSH VAR1;//压入0303H    
    
    POP BX;//弹出0303H
    POP BX;//弹出0202H
    POP BX;//弹出0101H
    
    ret
    VAR1 DW 0303H;

    算数运算类指令

    乘法指令

      8位乘法操作中,AL作为隐含的目的操作数,源操作数必须是通用寄存器或者存储单元(不能是立即数),乘法结果是16位,高8位存放在AH中,低8位存放在AL中;16位乘法操作中,目的操作数必须为AX,运算结果为32位,高16位存放在DX中,低16位存放在AX中。

      MUL指令为无符号数的乘法,即8位操作数范围是0~255;而IMUL指令是有符号数乘法,即8位操作数范围是-128~127。

      乘法指令只影响CF和OF标志。8位无符号乘法中,如果AH为0,则CF=0,OF=0(即两数相乘,AL足够表示结果),否则CF=1,OF=1;8位有符号乘法中,如果AH只是符号扩展,则则CF=0,OF=0(AL足够表示结果),否则CF=1,OF=1。16位乘法亦如此。

      下例中,MUL乘法执行后,AX为FE01H,CF=OF=1,表示相乘结果为65025。IMUL执行后,AX为0001H,CF=0F=0,表示结果为1。

    MOV AL,0FFH;//无符号数255,有符号数-1 
    MOV BL,0FFH;//无符号数255,有符号数-1
    MUL BL;//255*255   
    MOV AL,0FFH;
    IMUL BL;//-1*-1

    BCD加法调整指令

      BCD码表示方式分为分离BCD码和组合BCD码。前者的8位寄存器只有低四位有效,可以表示一位BCD码;后者的8位寄存器高四位作为一位BCD码,低四位也作为一位BCD码。例如12H,分离BCD码表示十进制数2,组合BCD码表示十进制数12。

      BCD码相加中,由于进制原因,就需要加6调整(加6调整指BCD码相加后大于9时,进行加6,否则无操作)。加法调整指令有AAA和DAA,都是只对AL寄存器有效。

      AAA指令针对分离BCD码,对相加结果AL的低4位进行加6调整,如果相加结果和调整结果的AF=1,那么AH++,CF=1,AF=1。DAA指令针对组合BCD码,对相加结果AL的高四位和低四位分别进行加6调整,DAA指令对标志寄存器的影响同ADD,并且DAA对AH无影响。

      下例进行了4次BCD加法。第一次ADD后,AL为99H,调整后AL=09H;第二次ADD后,AL为80H,调整后AL=06H,AH=01H;第三次ADD后,AL为7D,调整后AL=03H,AH=02H;第四次ADD后,AL=7AH,组合码调整后AL=80H,AH=02H。

    MOV AL,22H
    MOV BL,77H     
    ADD AL,BL;//2+7=9
    AAA 
    ADD AL,BL;//9+7=16 
    AAA 
    ADD AL,BL;//16+7=23
    AAA
    ADD AL,BL;//03+77=80
    DAA       

        

    未完待续···

  • 相关阅读:
    ubuntu18 升级cmake
    开源镜像站汇总
    ubuntu18安装go
    tendermint框架及Tx执行流程
    常用python内置函数
    根据列号返回列名
    Valid Number
    Remove Duplicates from Sorted List II
    vector排序问题<unresolved overloaded function type>
    Spiral Matrix
  • 原文地址:https://www.cnblogs.com/kensporger/p/12509366.html
Copyright © 2011-2022 走看看