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

传送类指令

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

MOV例题讲解:

2.取有效指令LEA指令:

LEA例题讲解:

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

LDS例题讲解:

LES例题讲解:

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

5.数据交换指令:XCHG

6.字节转换指令:XLAT

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

栈操作例题讲解:

22c143489e48c5400eb08a95cbe832c3.png

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

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说明是字操作

4009e807c68c3b6b51786a37150527c8.png

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)

e0dafb89aabbb76bd61da02203d1103b.png

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

d88647e843b2e867d6833a5acc0921e6.png

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

373122abda23b809526ddf0b9147e6e2.png

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

过程:

b185ac26d9b3fc980ac94d2b6eb5770d.png

压栈和出栈的流程:

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

26265dd2aea0709fdea3585ef0e2b0a4.png

PUSHF和POPF:

48dc422ab2ecb1a0444b1b7a4e2ea696.png

513a103b83ba4e04870895a0bee6c557.png

栈操作例题讲解:

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在任何时候都指向当前的栈顶

  • 2
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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 ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值