汇编知识点之80x86指令系统

指令系统主要考虑以下几个方面:
①对PSW影响  影响/不影响/不定义
②B/W  字节还是字操作
③寻址方式
④功能
⑤格式

一、数据传送指令

1.通用数据传送指令

(1) MOV DST,SRC    <–>  (DST)<–(SRC)
注:1.二者不能同时为段寄存器,不能同时为存储器寻址
  2.立即数不能直接送段寄存器
  3.目的操作数不允许用立即数方式,也不允许用CS寄存器。
  4.MOV指令不影响标志位

(2)     PUSH SRC       POP DST
16位指令:(SP) <-- (SP)–2      (DST) <-- ((SP)+1,(SP))
    ((SP)+1,(SP)) <-- (SRC)    (SP) <-- (SP)+2
注意:1.PUSH和POP只能作字或双字操作。
   2.不允许PUSH、POP指令使用立即数寻址方式。
   3.POP指令的目的为段寄存器时,不允许使用CS寄存器。
   4.PUSH和POP不影响标志位。

(3) XCHG OPR1,OPR2  -->   (OPR1) <–> (OPR2)
注意:1.两个操作数必须有一个在寄存器中。
   2.不允许使用段寄存器。
   3.可用除立即数外的任何寻址方式,不影响标志位。

2.累加器专用传送指令(限用EAX,AX,AL)

(1)IN AL,DX(字节) -->  (AL)<-- ((DX))
  IN AX,DX(字)  -->  (AX)<-- ((DX+1,(DX))
  IN EAX,DX(双字) -->  (EAX)<-- ((DX+3,(DX)+2,(DX)+1,(DX))

(2)OUT DX,AL   -->    ((DX)) <-- (AL)
 OUT DX,AX    -->    ((DX+1,(DX)) <--  (AX)

这里的端口号或DX的内容均为地址,而传送的是端口中的信息。
例:MOV DX,3FCH
  IN EAX,DX
  从端口03FCH送一个双字到EAX寄存器。
例:OUT 5,AL
  从AL寄存器输出一个字节到端口5。

(3)XLAT 换码指令
建立一个字节表格,表格的首地址提前存入BX寄存器,相对于表格首地址的位移量也提前存入AL寄存器中,表格的内容则是要换取的代码,该指令执行后就可在AL中得到转换后的代码。
   XLAT / XLAT OPR   -->   (AL) <-- ((BX)+(AL))
例: MOV AL,X
   LEA BX,TABLE
   XLAT TABLE

3.地址传送指令

LEA REG,SRC     -->     (REG) <-- SRC
将源操作数的有效地址送到指定寄存器中。
例: (假设存储单元地址为0100H,存储单元内容为3412H)
MOV AX,BUF      -->AX=3413H
MOV BX,OFFSET BUF -->BX=0100H
LEA  BX,BUF      -->BX=0100H
注意:1.不能使用段寄存器。
   2.可使用除立即数和寄存器外的任一种存储器寻址方式。
   3.不影响标志位。

4.类型转换指令

CBW                CWD
字节转换为字指令           字转换为双字指令
例如:MOV AL,80H
   CBW
   则AX=0FF80H

二、算术指令
1.加法指令

(1)ADD DST,SRC    -->   (DST)<–(SRC)+(DST)
(2)ADC DST,SRC --> (DST)<–(SRC)+(DST)+CF
  DX  AX    <-- SRC   ADD BX,AX
 +
  CX  BX    <-- DST    ADC CX,DX
————————————
  CX   BX
(3)INC OPR --> (OPR)<–(OPR)+1
   注意:需准确说明是字还是字节
例:INC AX (√)
  INC [BX] (×)
  INC BYTE  PTR [BX]  (√)
  INC WORT PTR [BX]  (√)

2.减法指令

(1)SUB DST,SRC -->  (DST)  <--  (SRC)+(DST)
(2)SBB DST,SRC -->   (DST)  <--  (SRC)-(DST)-CF
(3)DEC OPR   -->   (OPR) <--  (OPR)-1
(4)NEG OPR   -->   (OPR) <--    -(OPR) 求补指令
(5)CMP OPR1,OPR2  -->   (OPR1)-(OPR2)

3.乘法指令

(1)MUL 无符号数乘法
(字节)(AX)<–(AL)×(SRC)
(字) (DX,AX)<–(AX)×(SRC)
(2)IMUL 带符号数乘法
  8位SRC     16位SRC
  ×  AL     ×   AX
——————   ——————
 AH  AL     DX  AX
注意:(1) MUL  1234H(×)
     IMUL  DS  (×)
     IMUL  [BX] (×)
   (2)不能与立即数相乘
   (3)乘数寄存器:AL(AX)    乘积寄存器:AX(DX,AX)
   (4)乘法指令对除CF位和OF位以外的条件码位无定义。

4.除法指令

(1)DIV SRC
(2)IDIV SRC
   字节操作:(AL) <-- (AX)/(SRC)的商
        (AH) <-- (AX)/(SRC)的余数
    字操作:(AX) <-- (DX,AX)/(SRC)的商
        (DX) <-- (DX,AX)/(SRC)的余数
注意: AX(DX,AX)  <--  被除数寄存器
    AL(AX)    <--  商寄存器
    AH(DX)   <--  余数寄存器

三、逻辑指令
1.逻辑运算指令

(1)AND DST,SRC–>(DST)<–(DST)∧ (SRC)
(2)OR DST,SRC–>(DST)<–(DST)∨ (SRC)
(3)NOT OPR(OPR不能为立即数)
(4)XOR DST,SRC
(5)TEST OPR1,OPR2–>(OPR1)∧(OPR2)

2.移位指令

(1)SHL  OPR,CNT     逻辑左移指令
(2)SHR OPR,CNT    逻辑右移指令
(3)SAL  OPR,CNT    算术左移指令
(4)SAR OPR,CNT    算术右移指令
(5)ROL  OPR,CNT    循环左移指令
(6)ROR OPR,CNT    循环右移指令
(7)RCL  OPR,CNT    带进位循环左移指令
(8)RCR  OPR,CNT    带进位循环右移指令

 这里最高有效位右移,同时再用它自身的值填入,即如果原来是0,则仍为0,原来是1则仍为1。
在这里插入图片描述

算术移位指令用于带符号数运算,SAL用来乘以2,SAR用来除以2;
逻辑移位指令用于无符号数运算,SHL用来乘以2,SHR用来除以2;
有多少次,则乘多少次或除多少次。

注意:OPR:用除立即数以外的任何寻址方式。
   移位次数由CNT决定,可以为1或CL,若移位次数大于1,则可以在该移位指令前把移位次数置于CL寄存器中,而移位指令中的CNT写为CL即可。
例:MOV AX,62H  或  MOV AL,62H
  SHR  AX,1       MOV CL,4
               SHR AL,CL

3.串处理指令

①SI<–源串地址(DS)
②DI<–串长度地址(ES)(DI是相匹配字符的下一个地址)
③CX<–串长度
④设置DF=0 CLD,DF=1 STD
⑤串指令(REP)

(1)REP string primitive
其中string primitive可为MOVS (串传送)、LODS(从串取)、STOS(存入串)、INS(串输入)和OUTS(串输出)指令。
与REP重复串操作直到计数寄存器的内容为0为止。
例:LEA SI,X
  LEA DI,Y
  MOV CX,count
  CLD
  REP MOVSB
(2)REPE/REPZ string primitive当相等/为零时重复串操作
其中string primitive可为CMPS(串比较)或SCAS(串扫描)指令
(3) REPE/REPZ string primitive当不相等/不为零时重复串操作
其中string primitive可为CMPS(串比较)或SCAS(串扫描)指令

串比较指令:
CMPS SRC,DST
CMPSB、CMPSW、CMPSD
指令由源变址寄存器指向的数据段中的一个字节,字或双字与由目的变址寄存器所指向的附加段中的一个字节、字或双字相减。

串扫描指令:
SCAS DST
SCASB(字节)、SCASW(字)、SCASD(双字)
指令把AL、AX或EAX的内容与由目的变址寄存器指向的在附加段中的一个字节,字或双字进行比较。

串传送指令:
MOVS  ES:BYTE PTR[DI],DS:[SI]
  把源变址寄存器指向的数据段中的一个字(字节或双字)传送到由目的变址寄存器指向的附加段中的一个字(字节或双字)中去。
MOVSB(字节)、MOVSW(字)、MOVSD(双字)
  该指令与REP联用时,则可将数据段中的整串数据传送到附加段中。(源串必须在数据段中、目的串必须在附加段中)还须先把数据串的长度值送入计数寄存器中。

存入串指令:
STOS DST
把AL、AX或EAX的内容存入由目的变址寄存器指向的附加段的某单元中。
STOSB(字节)、STOSW(字)、STOSD(双字)
与REP联用时,可把AL、AX或EAX的内容存入一个长度为(Count Reg)的缓冲区中。
STOS指令在初始化某一缓冲区时很有用。

从串取指令:
LODS SRC
该指令把由源变址寄存器指向的数据段中某单元的内容送到AL、AX或EAX中
LODSB(字节)、LODSW(字)、LODSD(双字)
一般来说,该指令不和REP联用。有时缓冲区中的一串字符需要逐次取出来测试时,可采用本指令。

4.控制转移指令

(1)JMP 无条件转移指令
①JMP SHORT OPR     段内直接短转移(CS不变,IP变)
相对寻址方式  操作码 操作数  (IP=现行IP+8位位移量)
(2B机器码): XX   XX

②JMP NEAR PTR OPR  段内直接近转移(CS不变,IP变)
相对寻址方式 操作码  操作数 (IP=现行IP+16位位移量)
(3B机器码): XX  XX,XX

③JMP WORD PTR OPR  段内间接近转移(CS不变,IP变)
等价于JMP OPR(寄存器或存储器)
IP从操作数中获得

④JMP FAR PTR OPR   段内直接远转移(CS,IP变)
 直接寻址方式    操作码    IP     CS
  (5B机器码):  XX    XX XX,XX XX

⑤JMP DWORD PTR OPR  段间间接远转移(CS,IP变)
   OPR为存储器操作数。
   IP从操作数中获得前两字节的内容。
   CS从操作数中获得后两字节内容。

(2)条件转移指令
①JZ(JE)   OPR    结果为零(或相等)则转移
②JNZ(JNE) OPR   结果不为零(或不相等)则转移

③JS  OPR       结果为负 则转移
④JNS  OPR        结果为正则转移
⑤JO OPR        溢出则转移
⑥JNO OPR       不溢出则转移
⑦JP(JPE) OPR    奇偶位为1则转移
⑧JNP(JPO)  OPR   奇偶位为0则转移
⑨JB(JNAE、JC)  OPR 
 低于,或者不高于或等于,或进位为1则转移
⑩JNB(JNE、JNC) OPR
 不低于,或者高于或等于,或进位为零则转移

比较两个无符号数,并根据比较的结果转移:
①JB(JNAE、JC) OPR
 低于,或者不高于或等于,或进位为1则转移
②JNB(JNE、JNC) OPR
 不低于,或者高于或等于,或进位为零则转移
③JBE(JNA) OPR   低于或等于,或不高于则转移
④JNBE(JA) OPR   不低于或等于,或高于则转移

比较两个无符号数,并根据比较的结果转移:
①JL(JNGE) OPR 
 低于,或者不高于或等于,或进位为1则转移
②JNL(JGE) OPR
 不低于,或者高于或等于,或进位为零则转移
③JLE(JNG) OPR
 低于或等于,或不高于则转移
④JNLE(JG) OPR
 不低于或等于,或高于则转移

5.循环指令

LOOP OPR(CX中存放循环次数)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是8251A串口双机通信在80x86指令集下的汇编代码: ``` ;初始化串口 MOV AL, 00110000B ;设置波特率为9600bps,数据位为8位,无校验位,停止位为1位 OUT 43H, AL ;将AL中的值送入8253的控制字寄存器中 MOV AL, 00000010B ;设置8253的控制字寄存器的第0位和第1位为10,选择第二个计数器 OUT 40H, AL ;将AL中的值送入8253的计数器0的初始计数值计数器中 MOV AL, 00110000B ;设置8253的控制字寄存器的第0位和第1位为00,选择第一个计数器 OUT 40H, AL ;将AL中的值送入8253的计数器0的初始计数值计数器中 MOV AL, 00000011B ;设置8251A的控制字寄存器为11,选择异步模式,禁止中断,允许接收和发送 OUT 3FH, AL ;将AL中的值送入8251A的控制字寄存器中 MOV AL, 00000110B ;设置8251A的命令寄存器为0110,清除接收和发送缓冲区 OUT 3FH, AL ;将AL中的值送入8251A的命令寄存器中 ;发送数据 MOV DX, 02F8H ;将8251A的数据寄存器的端口地址送入DX中 MOV AL, 'H' ;将要发送的数据'H'送入AL中 MOV AH, 01H ;将AH的值设置为01,表示发送数据 CALL SEND_DATA ;调用发送数据的子程序 ;接收数据 MOV DX, 02F8H ;将8251A的数据寄存器的端口地址送入DX中 MOV AH, 00H ;将AH的值设置为00,表示接收数据 CALL RECEIVE_DATA ;调用接收数据的子程序 SEND_DATA PROC PUSH AX ;保存AX寄存器的值到栈中 PUSH DX ;保存DX寄存器的值到栈中 WAIT_FOR_SEND: IN AL, 3FH ;将8251A的状态寄存器的值读入AL中 AND AL, 00100000B ;将AL与00100000B进行与操作,判断是否发送缓冲区为空 JNZ WAIT_FOR_SEND ;如果发送缓冲区不为空,则继续等待 OUT DX, AL ;将AL中的值送入8251A的数据寄存器中 POP DX ;将栈中保存的DX寄存器的值弹出 POP AX ;将栈中保存的AX寄存器的值弹出 RET ;返回 RECEIVE_DATA PROC PUSH AX ;保存AX寄存器的值到栈中 PUSH DX ;保存DX寄存器的值到栈中 WAIT_FOR_RECEIVE: IN AL, 3FH ;将8251A的状态寄存器的值读入AL中 AND AL, 00000001B ;将AL与00000001B进行与操作,判断是否接收缓冲区有数据 JZ WAIT_FOR_RECEIVE ;如果接收缓冲区没有数据,则继续等待 IN AL, DX ;将8251A的数据寄存器的值读入AL中 POP DX ;将栈中保存的DX寄存器的值弹出 POP AX ;将栈中保存的AX寄存器的值弹出 RET ;返回 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值