注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

熊猫正正的博客

熊猫正正的天空

 
 
 

日志

 
 

传送类指令  

2012-05-06 18:02:45|  分类: 8086饭客网汇编学 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

需要掌握的内容:

1. 学会数据传送指令

2. 地址传送指令

3. 标志寄存器传送指令

1.数据传送指令

MOVMove 传送指令

PUSHPush onto the stack 进栈指令

POPPop form the stack 出栈指令

XCHGExchange 交换指令

XLATTranslate 换码指令

1) MOV

格式:mov dst,src dst是目的Destinationsrc是源Source

执行操作:dst?src

要求:

允许:寄存器到寄存器,立即数到寄存器,立即数到存储单元,存储单元到寄存器,寄存器到存储单元,寄存器或存储单元到除CS外的段寄存器,段寄存器到寄存器或存储单元。

数据可是字或字节,但dstsrc必须一致,即同为字节或字。

正确:

mov ax,bx

错误:

mov ax,bh

段基址不能直接传送到段寄存器,必须通过寄存器分两次传送。

正确:

mov ax,data

mov ds,ax

错误:

mov ds,data

存储单元之间不能直接传递。

vlaue1 db 1

vlaue2 db 2

正确:

mov ax,vlaue1

mov vlaue2,ax

错误:

mov vlaue2,vlaue1

立即数不能直接送入段寄存器。

正确:mov ax,1

错误:mov ds,1

CS段寄存器不允许做为dst

正确:

mov ax,cs

mov vlaue,cs

错误:

mov cs,ax

mov cs,vlaue

2) PUSH

格式:push src

执行操作: sp?sp-2, sp的内容减2指向新的栈顶)

sp+1sp?src (将src的内容压入新的栈顶,低8位存入sp单元,高8位存入sp+1单元)

3) POP

格式:pop dst

执行操作:dst?sp+1sp (将栈顶内容存入dst单元,即sp中内容存入dst的低8位,sp+1中内容存入dst的高8)

sp?sp+2 (sp的内容加2,指向新的栈顶)

01913H

01914H

01915H

01916H

01917H

01918H

4) XCHG

格式:xchg opr1,opr2 opr是操作数operand

执行操作:opr1?à opr2

要求:

两个操作数必须有一个在寄存器中,不允许使用立即数或段寄存器。

xchg ax,bx

=

mov dx,ax

mov ax,bx

mov bx,dx

实现两个存储单元x1y1之间的数据互换。

xchg ax,x1

xchg ax,y1

xchg ax,x1

5) XLAT

格式:xlat oprxlat

执行操作:AL?BX+AL

要求:

在使用这条指令前,应先建立一个字节表格,将表格的首地址提前存入BX中,将需要转换的代码存入AL中,这时表格内容则是所要换取的代码,指令执行后,AL中得到转换后的代码。

由于AL寄存器只有8位,所以表格的长度不能超过256

例如:在数据区中Table开始的存储区顺序存放着A~ZASCII码,下列程序段将把字母从0开始存放顺序号变为对应字母的ASCII码值。

Table db ABCDEFGHIJKLMNOPQRSTUVWXYZ

mov bx,offset Table

mov al,4

xlat

xlat执行完后,al中的内容为字母EASCII码。

2.地址传送指令

LEALoad Effective Address 有效地址送寄存器指令

LDSLoad DS with Pointer 指针送寄存器和DS指令

LESLoad ES with Pointer 指针送寄存器和ES指令

1)LEA

格式:lea reg,src

执行操作:reg?src (把源操作数的有效地址送到指定寄存器中)

要求:

源操作数src必须是内存操作数,目的操作数必须是16位的通用寄存器。

例如,设符号地址XYZ代表数据段内偏移地址为222H的存储单元地址,该单元存放数据为1916H,即

lea bx,XYZ

执行完后BX的内容为222H,即BX0222H

mov bx,XYZ

执行完后BX的内容为1916H,即BX=1916H

lea bx,XYZmov bx,offset XYZ功能完全相同。

2)LDS

格式:lds reg,src

执行操作:reg?src , ds?src+2

该指令把源操作数src指令的4个相继字节的地址指针中的段内偏移地址(低字),送入寄存器reg中,将段基址(高字)送到DS寄存器中,该指令中的reg常特指为SI寄存器。

例如,指令lds si,ABC的功能与下面三条指令相同:

mov si,ABC

mov ax,ABC+2

mov ds,ax

3)LES

格式:les reg,src

执行操作:reg?src , es?src+2

该指令把源操作数src指令的4个相继字节的地址指针中的段内偏移地址(低字),送入寄存器reg中,将段基址(高字)送到ES寄存器中,该指令中的reg常特指为DI寄存器。

例如,指令les si,ABC的功能与下面三条指令相同:

mov si,ABC

mov ax,ABC+2

mov es,ax

源串隐含使用DS:SI,目的隐含使用ES:DI,使用指令LDS SI,SRC和指令LES DI,SRC可以立刻使SI指向源串,使DI指向目的串。

x1 dd 12345678H

lds si,x1

执行之后:si=5678H  ds=1234H

3.标志寄存器传送指令

LAHF(Load AH from Flag) 标志寄存器送AH寄存器指令

SAHFStore AH into Flag AH寄存器送标志寄存器指令

PUSHFPush the Flag 标志寄存器进栈指令

POPFPop the Flag 标志寄存器出栈指令

psw:机器状态字

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

OF

DF

IF

TF

SF

ZF

AF

PF

CF

1) LAHF

格式:lahf

执行操作:ah?psw的低字节

2) SAHF

格式:sahf

执行操作:psw的低字节? ah

lahf

mov ah,0 ;00000000B

sahf

3) PUSHF

格式:pushf

执行操作:sp?sp-2 , (sp+1sp)?psw

4) POPF

格式:popf

执行操作:psw?(sp+1,sp) , sp?sp+2

  评论这张
 
阅读(186)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017