汇编--指令系统 数据传送类指令 IN OUT

(1) 数据传送类指令

通用数据传送指令(都不影响标志位):MOV 、PUSH、POP、XCHG 交换指令

累加器专用传送指令: IN、OUT 、XLAT 换码指令

地址传送指令:LEA、LDS、LES

标志寄存器传送指令:LAHF、SAHF、PUSHF、POPF

类型转换指令:CBW、CWD、CDQ、BSWAP

MOV指令

注:对于存储器单元立即数同时作为操作数的情况,必须显式指明   ;byte ptr 说明是字节操作   ;word ptr 说明是字操作

 mov [bx],[si+2]  错误

 不允许立即数传送给段寄存器

 不允许直接改变CS值

 不允许段寄存器之间的直接数据传送

栈顶是地址较小的一端(低端)

堆栈和队列都是一段存储空间

进栈和出栈只对操作

 

交换指令:XCHG(exchange)

把两个地方的数据进行互换

 XCHG reg,reg/mem

 

寄存器与寄存器之间交换数据

寄存器与存储单元之间交换数据

不能在存储单元之间交换数据

 不能在段寄存器之间交换数据

 二、累加器专用传送指令

 IN     输入    OUT  输出    XLAT  换码

 (1)格式:IN    AX/AL,I/O端口地址            表示从外部设备输入数据给AX累加器

IN AX,80H
MOV DATA_WORD,AX   ;这两条指令把端口28H的内容经过AX传送到存储单元DATA_WORD中

 

mov DX,3FCH
IN EAX,DX

(2)OUT     I/O端口地址,AX/AL         表示将AX累加器的数据输出给外部设备

OUT 5,AL  ;从AL中输出一个字节到5端口中

说明:当I/O端口地址不超过8位时,则直接放在指令中,若超过8位,则用DX间址。比如:

MOV DX,8080H
IN AL,DX

 

换码指令:XLAT(translate)

XLAT    ;al←ds:[bx+al]

换码指令执行前: 在主存建立一个字节量表格,内含要转换成的目的代码 表格首地址存放于BX,AL存放相对表格首地址的位移量

换码指令执行后: 将AL寄存器的内容转换为目标代码

换码指令没有显式的操作数,但使用了BX和AL;

 地址传送指令

 取有效地址指令:LEA   (load EA)     将存储器操作数的有效地址传送至指定的16位寄存器中

 指针传送指令:LDS

 指针传送指令:LES 

注意不是获取存储器单元的内容,而是其有效地址

 LEA r16,mem           ;r16←mem的有效地址EA    获得主存单元的有效地址;不是物理地址,也不是该单元的内容

  LDS r16,mem ;r16←mem, ;DS←mem+2            

LDS指令将主存中mem指定的字(就是地址里面的值)送至r16,并将mem的下一字送DS寄存器

 LES r16,mem ;r16←mem, ;ES←mem+2    

     LES指令将主存中mem指定的字送至r16,并将mem的下一字送ES寄存器

 

 标志传送类指令

标志寄存器传送指令:LAHF、SAHF

标志寄存器传送指令:PUSHF、POPF

  •    用来传送标志寄存器FLAGS的内容,方便进行对各个标志位的直接操作
  •   影响标志位

 LAHF   ;AH←FLAGS的低字节

  • LAHF指令将标志寄存器的低字节送寄存器AH
  • SF/ZF/AF/PF/CF状态标志位分别送入AH的第7/6/4/2/0位,而AH的第5/3/1位任意

 SAHF  ;FLAGS的低字节(5个)←AH

  • SAHF将AH寄存器内容送FLAGS的低字节
  • 用AH的第7/6/4/2/0位相应设置SF/ZF/AF/ PF/CF标志

 PUSHF ;SP←SP-2 ;SS:[SP]←FLAGS

  • PUSHF 保存全部标志到堆栈

 POPF ;FLAGS←SS:[SP] ;SP←SP+2

  • POPF 将堆栈内容取到标志寄存器

 

 类型转换指令

 字节转换成字指令:CBW

 字转换成双字指令:CWD

 双字转换成四字指令:CDQ

CBW ;AL的符号扩展至AH ;如AL的最高有效位是0,则AH=00 ;AL的最高有效位为1,则AH=FFH。AL不变

CWD ;AX的符号扩展至DX ;如AX的最高有效位是0,则DX=00 ;AX的最高有效位为1,则DX=FFFFH。AX不变

 类型转换指令常用于获得倍长的数据

注意:

  • 无操作数指令
  • 隐含对 AL 或 AX 进行符号扩展
  • 不影响条件标志位

 什么是符号扩展?     

符号扩展是指用一个操作数的符号位(即最高位)形成另一个操作数,后一个操作数的各位是全0(正数)或全1(负数)。

符号扩展不改变数据大小

对于数据64H(表示数据100),其最高位D7为0,符号扩展后高8位都是0,成为0064H(仍表示数据100)

对于数据ff00H(表示有符号数-256),其最高位D15为1,符号扩展后高16位都是1,成为ffffff00H(仍表示有符号数-256)

 

mov al,80h ;al=80h

cbw ;ax=ff80h

add al,255 ;al=7fh

cbw ;ax=007fh

 

    cwd         ;DX.AX←AX

    idiv bx     ;AX←DX.AX÷BX

  • 利用符号扩展指令得到除法指令所需要的倍长于除数的被除数
  • 对无符号数除法应该采用直接使高8位或高16位清0的方法,获得倍长的被除数

 

你可能感兴趣的:(汇编--指令系统 数据传送类指令 IN OUT)