微机原理——指令系统——传送类指令(MOV、LEA、LDS、LES、LAHF、SAHF、XCHG、XLAT、PUSH、POP、PUSHF、POPF)

博主联系方式:
QQ:1540984562
QQ交流群:892023501
群里会有往届的smarters和电赛选手,群里也会不时分享一些有用的资料,有问题可以在群里多问问。

【没事儿可以到我主页看看】https://blog.csdn.net/qq_42604176

指令分类
功能:把数据、地址、或立即数传送到寄存器或存储单元中 。

1.通用传送类指令:MOV指令

MOV指令的格式为:   MOV   DST,   SRC	(MOV指令的实质是:把SRC的内容复制到DST中,执行操作后 SRC的内容不变!)
语法格式:MOV reg/mem/seg ,reg/mem/seg/imm

Reg:寄存器,mem:存储器,seg:段寄存器,imm立即数
对标志位的影响:除标志寄存器传送指令外,均不影响标志位

当无法通过任一个操作数确定是操作类型时,需要利用汇编语言的操作符显式指明
MOV [BX+SI], 255 ;非法指令,修正:
MOV BYTE PTR [BX+SI],255;BYTE PTR说明是字节操作
MOV WORD PTR [BX+SI],255;WORD PTR说明是字操作
传输方向

MOV例题讲解:

问:将以AREA1为首地址的100个字节数据搬移到以AREA2为首地址的内存中,若AREA1和AREA2都在当前数据段中,可以用带有循环控制的数据传送程序来实现。

MOV   SI,OFFSETAREA1;(OFFSET是取地址					
MOV   DI,OFFSETAREA2;  偏移量,必须加上)
;SI DI作为指针指向两个内存的首地址
MOV   CX,100;	循环次数为100	
AGAIN:MOV   AL,[SI];RD为低
       MOV [DI],AL  ;WR为低	通过中间寄存器,将SI指向的内容转移到DI指向的空间
       INC    SI	
       INC    DI	;指针自加1
       DEC   CX		;计数器减1
       JNZ  AGAIN 	;结果不为0转移		等效于LOOP

有关寻址方式的一些语法要求请看这里!!!

2.取有效指令LEA指令:

指令格式: LEA reg16 ,存储器寻址方式/地址标号
将源操作数指向的偏移地址送入寄存器中

LEA  BX,[BX+SI+0F62H]
如指令执行前:
(BX)=0400H,(SI)=003CH
则指令执行后:
(BX)=0400H+003CH+ 0F62H
            =139EH
            ;139EH是偏移地址!不是DS:139EH中的内容!

LEA 指令与MOV 指令的区别:
LEA SI,BUFF;将标号BUFF的偏移地址送入寄存器中
MOV SI,BUFF;将标号BUFF所指存储单元的内容送入SI

LEA例题讲解:

问:如指令执行前(SI)=3000H,(BX)=0400H,MEEM=12000H,DS=1000H,执行LEA BX,MEEM指令后BX的内容为

BX存储的是MEEM的偏移地址,BX=MEEM-DS*16H=2000H;

问:执行LEA BX,(SI)指令后BX的内容为

BX存储的是SI的偏移地址所以BX=(SI)=3000H;

3.取地址指针指令:LDS、LES

LDS指令 (指针送寄存器和DS)
指令格式:LDS reg16 ,存储器寻址方式
语法格式:LDS reg16 ,reg16/mem/lable
指令功能:从src指定的存储单元开始,由4个连续存储单元中取出前2字节送到reg,取出后2字节送到DS

LDS例题讲解:

问:LDS AX,(SI +20 ) (20050H)=1234H,(20052H)=5678H,AX=0000H,DS=2000H,SI=0030H,
执行的结果为:AX=???,DS=???

src存储单元地址=DS*16H + SI + 20H =20000+0030+0020=20050;
AX=(20050)=1234H;
DS=(20050+2)=5678H;

问:已知指令执行前(22000H~22005H)=12H、34H,56H、78H,9AH、BCH,AX=0000H,DS=2000H,BX=2000H,MEEM=22002H,执行指令LDS AX,MEEM和执行指令LDS AX,(BX)
过程
LES指令 (指针送寄存器和ES)
指令格式:LES reg16 ,存储器寻址方式
语法格式: LES reg16 ,reg16/mem/lable ;
指令功能:从src指定的存储单元开始,由4个连续存储单元中取出前2字节送到reg,取出后2字节送到ES中

LES例题讲解:

问:LES AX,20(SI)或 LES AX,(SI +20 ) 假设执行前为(20050H)=1234H,(20052H)=5678H,AX=0000H,DS=2000H,SI=0030H
执行的结果为:AX=???,ES=???

物理地址=20020+0030H=20050H
AX=(20050H)=1234H
ES=(20050+2H)=5678H

4.标志传送指令:LAHF、SAHF

LAHF SAHF

5.数据交换指令:XCHG

执行的操作:交换DST与SRC的内容 DST SRC
语法格式为: XCHG reg/mem,reg/mem
注意点:这种交换只能在通用寄存器之间、通用寄存器与存贮器之间进行,存储器与存储器之间不能交换段寄存器不能作为一个操作数。

例:XCHG BX ,[BP+SI]
如指令执行前:(BX)=6F30H,(BP)=0200H,2F246H=54H 2F247H=51H ,(SI)=0046H,(SS)=2F00H,(2F00H)=4254H,OPR2的物理地址=2F00×16+0200+0046=2F246H
则指令执行后:(BX)=5154H,(2F246H)=6F30H。

6.字节转换指令:XLAT

XLAT

7.堆栈操作指令:PUSH、POP、PUSHF、POPF

堆栈概念–存储器的一段区域,按“先进后出”的原则进行存取操作。8086/8088系统,堆栈位于堆栈段,其段地址由SS指示,SP寄存器作为指针,SP内容始终指向栈顶所在存储单元
堆栈是一块特殊的存储区域,利用这块区域可以存储返回地址等信息,从而实现子程序的嵌套调用。
作用:在调用一个过程时,保存返回地址;暂时存放寄存器或存储器单元操作数的内容。
PUSH:
指令格式:进栈 PUSH SRC (堆栈压入指令,进栈指令)
操作:(SP) (SP)-2, 指针-2
((SP)+1,(SP)) SRC 把操作数压入栈中
功能:将16位寄存器,段寄存器,16位存储单元数据压入堆栈。
POP:
指令格式: 出栈 POP DST
操作:(DST) ((SP)+1,(SP)),
(SP) (SP)+2
过程:
1
压栈和出栈的流程:

MOV  AX,8000H
MOV  SS,AX   ;设堆栈段地址  (SS)=8000H
MOV  SP,2000H ;设堆栈指针
MOV  DX,3E4AH
PUSH DX ;(先进) DX内容存入(SS×16+1FFEH=(SP-2))
PUSH AX  ; AX内容存入(SS×16+1FFCH =(SP-2-2) )
PUSH  (2000H);取数据段 (DS×16+2000H)内容进栈
             ;存入(SS×16+1FFAH =(SP-2-2-2) )
   
POP (2000H); (SS×16+1FFAH)到(DS×16+2000H)
POP   AX     ; (SS×16+1FFCH)到AX 
POP   DX   ;(后出) (SS×16+1FFEH)到DX

流程
PUSHF和POPF:
在这里插入图片描述
在这里插入图片描述

栈操作例题讲解:

1、交换DS 和 ES的内容

PUSH DS;
PUSH ES;
POP DS;
POP ES;

2、在子程序设计时,需要从子程序返回时保持通用寄存器不变,这时候可以利用堆栈把寄存器保护起来

PUSH AX;
PUSH BX;
PUSH CX;
PUSH DX;
//调用子程序;
//子程序返回;
POP DX;
POP CX;
POP BX;
POP AX;

注意事项:

PUSH操作使栈顶向低地址方向移动,而POP操作则刚好相反;
·堆栈操作只能作字操作;
·SS:SP在任何时候都指向当前的栈顶

【没事儿可以到我主页看看】https://blog.csdn.net/qq_42604176

  • 39
    点赞
  • 237
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
西安工业大学课程设计用纸 课程名称:汇编语言程序设计 课程英文名称:PROGRAMMING BY ASSEMBLE LANGUAGE 一.设计目的: 1. 理解掌握定时/计数器和中断的使用方法。 2. 掌握微机常用的输入输出方式及接口技术。 3. 掌握一定的汇编语言知识,培养自己的动手操作能力。 4. 学习程序设计的基本思路和方法。 二.程序内容: 第一部分:定义显示界面。 第二部分:调用系统时间,并将调用的用二进制表示的时间数转换成ASCII码,并将时间 数存入内存区。 第三部分:将存在系统内存区的时间数用显示字符串的形式显示出来。 第四部分:获取键盘的按键值,以ESC键退出系统返回DOS。 三.程序设计原理: 首先在数据段开辟一显示缓冲区,用来存储系统时间。调用DOS中断,返回系统时间,并 将来返回的二进制时间转换成ASCII码,方便时间显示时的调用。分别将来小时数、分钟 数、秒数存入显示缓冲区,并最终存入一结束字符号'$'。调用DOS字符串显示功能将时 间显示 西安工业大学课程设计用纸 出来。并调用屏幕I/O中断,定位光标的开始位置,结合着将时间显 示在我们预先定义好的位置上。由于获取了的系统时间不会自动刷 新,所以我们要设计成刷新的方式来不断获取系统的时间,这样就形成了会跳动的电子 钟了。调用延时TIME延时中断服务程序,累加到存放秒值的寄存器DL中,并进行十进制 调整。在累加的过程中,不断地对时、分、秒值进行比较,秒不能等于60,分不能等于 60,时不能等于24。秒等于限制值时,则使秒值为0分值加1;分等于限制值时,则使分 值为0时值加1;时等于限制值时,则使时值为0;时、分、秒值都不超过限制值时,就转 显示屏输出。时间显示的刷新要配合延时程序进行,为了得到良好的显示效果,延时程 序要尽量接近1秒,但又不能超过一秒,所以本程序调用了一段较精确的时间延迟程序。 利用BIOSS设计窗口,选择适当的背景和前景等,使屏幕显示更加完美。程序一旦进入运 行,就将不间断地在显示屏显示时间,要想程序停止运行,可同时在键盘按下ESC键返回 DOS系统。 四.程序流程图如下: DATA SEGMENT ;设置数据段 BUF1 DB 'THE TIME IS NOW: $' BUF5 DB ' @@@@@ ^^^^^^^ @@@@@@ $' BUF6 DB ' &&&&&& ####### &&&&&& $' BUF7 DB ' 00 >o o < 00 $' BUF8 DB ' 00 (::) 00 $' BUF9 DB ' 00 ~~ 00 $' BUF10 DB ' 00 !! 00 $' BUF3 DB 'CLASS:040402206 $' BUF4 DB 'NAME:hu ling wei $' BUF2 DB 10 DB 10 DUP(?) DATA ENDS STACK SEGMENT STACK ;设置堆栈段 DB 100 DUP(?) STACK ENDS CODE SEGMENT ;设置代码段 ASSUME CS:CODE,DS:DATA,SS:STACK CURSOR MACRO ROW,CLM ;设置光标位置 MOV AH,2 MOV BH,0 MOV DH,ROW MOV DL,CLM INT 10H ENDM WIN MACRO ROWL,CLML,ROWR,CLMR,COLOR ;设置窗口,位置,颜色 MOV AH,6 MOV AL,0 MOV CH,ROWL MOV CL,CLML MOV DH,ROWR MOV DL,CLMR MOV BH,COLOR INT 10H ENDM ASCBCD MACRO REG INC BX INC BX MOV REG,[BX] MOV CL,4 SHL REG,CL INC BX MOV AL,[BX] AND AL,0FH OR REG,AL ENDM BCDASC MACRO REG INC BX INC BX MOV AL,REG MOV CL,4 SHR AL,CL OR AL,30H MOV [BX],AL INC BX MOV AL,REG AND AL,0FH OR AL,30H MOV [BX],AL ENDM INCBCD MACRO REG,COUNT ;BCD数加1 MOV AL,REG INC AL DAA MOV REG,AL CMP AL,COUNT JNZ DISPY MOV REG,0 ENDM STRDSPY MACRO ADRS LEA DX,ADRS MOV AH,9 INT 21H ENDM CLOCK PROC FAR START: PUSH DS ;显示字符串 MOV AX,0 PUSH AX MOV AX,DATA MO
自己喜欢和驴友出游也喜欢和出海钓鱼,给自己做了个定位的黑匣子,给大家分享一下! 实现功能:当你出门在外遇到困难时打开,硬件将通过手机卡上网,将个人定位位置发到一个指定的IP上,用我的谷歌地图软件来显示。 因为是个人玩 所以GPRS选择的电子市场的二手模块 : AVR - ATMEGA64L+UBLOX GPS LEA-5 +BENQ M23。 如果现在想自己做的话:建议AVR ATMEGA32+UBLOX 6M+ 中兴2639 成本能控制低一些,在150左右。我这个方案贵了些。特别是北斗开始民用化了,成本更低了。定位精度为0.5米左右,也就是说我的两次定位分别显示了两个点,也就是我们家窗子的宽度,民用的这个级别感觉不错,感觉也怪危险,坐等战斧。板子做好后,又做了小板进行232串口电平转换,可以用来监控串口的数据。可以在调试时,将芯片间的通信数据用电脑测试到。这个板子做了光电隔离,为了保护电脑的串口。但要注意选择光耦的速度。 下图是自己做了一套定位软件,支持串口传入数据与网络传入数据两种模式。将自己电脑的网络IP写入单片机,通过GPRS模块 上网,将定位数据发到电脑上在地图上显示出来。 这是GPS模块提供的测试软件,直接接上串口就可以测试模块的定位性能及数据。 下图为定位精度,谷歌地图的显示。 天线是放在四楼的窗子上的,很准吧!
PUSH/PUSHA/PUSHAD指令用于将数据或寄存器的值压入堆栈。PUSH指令将一个值压入堆栈,PUSHA指令将AX、CX、DX、BX、SP、BP、SI、DI的值按从高到低的顺序压入堆栈,而PUSHAD指令将EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI的值按从高到低的顺序压入堆栈。 POP/POPA/POPAD指令用于从堆栈中弹出数据或寄存器的值。POP指令将一个值从堆栈弹出,POPA指令将堆栈中的值按从低到高的顺序弹出,分别存入AX、CX、DX、BX、SP、BP、SI、DI中,而POPAD指令将堆栈中的值按从低到高的顺序弹出,分别存入EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI中。 XCHG指令用于交换两个操作数的值。XLAT指令用于通过使用BX和AL寻址的方式,将AL中值与内存中的字节进行替换。BSWAP指令用于对寄存器中的32位数据进行字节顺序交换操作。 LEA指令用于将一个有效地址传送给目的操作数。LDSLES、LFS、LGS、LSS指令用于将段描述符选择子传送给目的操作数的段寄存器。 总结来说,堆栈操作指令用于在堆栈中压入和弹出数据或寄存器的值,交换指令用于交换两个操作数的值,地址或段描述符选择子传送指令用于传送有效地址或段寄存器的值。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [微机原理==常用汇编指令(9)](https://blog.csdn.net/weixin_29081101/article/details/118284476)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拾牙慧者

欢迎请作者喝奶茶

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值