【2021.03.19】长调用与短调用

要点回顾

  1. 通过前文知道JMP FAR可以实现段间跳转,如果要实现跨段的调用就必须要学习CALL FAR,也就是长调用。
  2. CALL FAR 比 JMP FAR 要复杂,JMP并不影响堆栈,而CALL指令会影响。

短调用

指令格式:CALL 立即数/寄存器/内存

发生改变的寄存器:ESP、EIP

长调用(跨段不提权)

指令格式:CALL CS:EIP(EIP是废弃的)

并不使用后面的EIP,EIP是被废弃的。

主要是CS段寄存器中的段选择子,通过段选择子去查询GDT表找一个段描述符,且该段描述符必须是调用门

  1. 想跳到另一个段中,需要提供一个段选择子。
  2. 如果目标段与当前段是同级别的,比如CPL都是3,称为跨段不提权。
  3. 如果是这种情况,堆栈的变化与短调用不同的是:会先压入调用者的CS,把当前CS段选择子压入堆栈中,然后执行。并且ESP+8,ESP+8以后指向的仍然是返回地址。

这个时候,如果执行完了长调用,如果想返回就不能像原来短调用使用RET来返回,如果使用RET是没有办法把CS段选择子赋值回去的。

  1. 长调用执行后,需要使用长返回(RETF)来从另一个段跳转回来。
  2. 修改ESP,并将原来保存的段选择子重新赋值给CS段寄存器。

发生改变的寄存器:ESP、EIP、CS

长调用(跨段并提权)

指令格式:CALL CS:EIP(EIP是废弃的)

执行前:3环权限

执行后:0环权限

当跨段提权的时候,执行后的堆栈已经不是原来的堆栈了。且CS、ESP、CS都发生了切换。

发生改变的寄存器:ESP、EIP、CS、SS

总结

  1. 跨段调用时,一旦有权限切换,伴随着的就有堆栈的切换。
  2. CS的权限一旦改变,SS的权限也要随着改变,CS与SS的等级必须一样
  3. JMP FAR 只能跳转到同级非一致代码段,但 CALL FAR 可以通过调用门提权,提升 CPL 的权限。

思考

SS 与 ESP 从哪里来?参见 TSS 段。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
;流水灯汇编语言程序代码: MAIN:MOV A,#0FEH ;保持只有一个LED灯亮 MOV R3,#08H ;把立即数08H送到寄存器R3中 LOOP:MOV P2,A LCALL DELAY ;调用子程序,跳转到DELAY程序 RL A ;累加器循环左移 DJNZ R3,LOOP ;R3减1,不为0则跳转到LOOP LJMP MAIN ;转移到MAIN程序 DELAY:MOV R4,#00H ;延时程序 MOV R5,#00H D1:DJNZ R4,D1 ;R4减1,不为0则继续执行D1程序 D2:DJNZ R5,D2 ;R5减1,不为0则继续执行D2程序 RET END 流水灯程序电路图: ;数码显示管/LCD汇编语言程序: MAIN: MOV R6,#00H ;把立即数00H送到寄存器R6中 MOV R5,#00H MOV R2,#00H MOV R1,#00H DR: MOV A,R6 MOV P3,#08H ;00001000,第一个数码管显示 LCALL LOOP LCALL YS0 MOV A,R5 MOV P0,#0FFH MOV P3,#04H ;00000100,第二个数码管显示 LCALL LOOP LCALL YS0 MOV A,R2 MOV P0,#0FFH MOV P3,#02H LCALL LOOP LCALL YS0 MOV A,R1 ;第一次循环时R1为0送入A中,第二次循环时把R1+1送入A中 MOV P0,#0FFH MOV P3,#01H LCALL LOOP INC R1 CJNE R1,#0AH,DR ;R1循环10次,R2加1 INC R2 MOV R1,#00H CJNE R2,#0AH,DR ;R2循环10次,R5加1 INC R5 MOV R2,#00H CJNE R5,#0AH,DR ;R5循环10次,R6加1 INC R6 MOV R5,#00H CJNE R6,#0AH ,DR LJMP MAIN TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H LOOP: MOV DPTR,#TAB ;把查表地址送到DPTR指针中 MOVC A,@A+DPTR MOV P0,A ;在数码管中显示 RET YS0: ;延时程序 MOV R3,#06H MOV R4,#06H YS3: DJNZ R3,YS3 ;R3减1,不为0则继续执行YS3 YS4: DJNZ R4,YS4 RET END 数码显示管程序电路图: ;键盘汇编语言程序代码: ORG 0000H MAIN:MOV P1,#0FH ;以行列排布,若按键按下列为1 MOV A ,P1 CJNE A,#0FH,SCAN ;比较A与0FH是否相等,不相等则跳转到SCAN SJMP MAIN ;转移 SCAN: JB P1.4 ,HX0 ;直接寻址位P1.4为1则转移到HXO,判断按键是否按下 JB P1.5 ,HX1 JB P1.6,HX2 JB P1.7 ,HX3 HX0: MOV R2,#0 ;列编号0、1、2、3送入R2中 LCALL FX HX1: MOV R2,#1 LCALL FX HX2:MOV R2,#2 LCALL FX HX3:MOV R2,#3 LCALL FX FX: MOV P1, #0F0H ;若按键按下则行为1 JNB P1.0 ,FX1 ;直接寻址位P1.0为0则转移到FX1,判断按键是否按下 MOV A,#0 ;行编号0、4、8、12送入A中 ADD A,R2 ;将列编号与行编号相加得键值送入A中,经压栈送入显示程序 PUSH Acc ;压栈 LCALL XS ;键值经压栈后送入显示程序 POP Acc ;出栈 LJMP MAIN FX1:JNB P1.1 ,FX2 MOV A,#4 ADD A,R2 PUSH Acc LCALL XS POP Acc LJMP MAIN FX2: JNB P1.2 , FX3 MOV A,#8 ADD A,R2 PUSH Acc LCALL XS POP Acc LJMP MAIN FX3: MOV A,#12 ADD A,R2 PUSH Acc LCALL XS POP Acc LJMP NONE XS: MOV DPTR, #TAB ;显示程序 MOVC A,@A+DPTR MOV P2 ,A LCALL DELAY RET DELAY:MOV R3 ,#0 ;延时程序 D1:MOV R4 ,#0 D2:DJNZ R4,D2 DJNZ R3,D1 RET NONE :NOP TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,
目 录 第1篇 序 幕 单片机是什么?单片机有何用?如何系统学习单片机?单片机系统设计的流程是怎样的,需要掌握哪些辅助软件?本篇将针对这些问题一一阐述,为读者掀开单片机完全学习与应用的华丽序幕。 第1章 单片机在哪里 1.1 ■寻找单片机 1.1.1 电磁炉与单片机 1.1.2 MP3播放机与单片机 1.1.3 更多单片机 1.2 ■学习单片机 1.2.1 掌握单片机基础知识 1.2.2 理解单片机系统 1.2.3 成为单片机系统设计师 1.3 ■单片机之家 1.3.1 Intel 8051单片机 1.3.2 PIC单片机 1.3.3 AVR单片机 1.3.4 其他单片机 1.4 ■应用体验——数字温度计 1.4.1 数字温度计工作原理 1.4.2 体验数字温度计 1.5 ■实例解读——装小球系统 1.5.1 需求分析 1.5.2 系统框架 第2章 如何成为单片机系统设计师 2.1 ■需要准备哪些 2.1.1 综合素质 2.1.2 软件工具 2.1.3 硬件工具之一:面包板 2.1.4 硬件工具之二:万用板和 印制电路板 2.1.5 焊接工具 2.1.6 焊接方法 2.2 ■单片机系统设计流程 2.2.1 需求分析 2.2.2 电路设计 2.2.3 程序设计 2.2.4 系统调试 2.3 ■应用体验——单片机控制下的 发光二极管 2.3.1 发光二极管工作原理 2.3.2 单片机的控制 2.3.3 体验单片机控制发光二极管 2.4 ■实例解读——反应时间测试仪 2.4.1 需求分析 2.4.2 电路设计 2.4.3 程序设计 第3章 单片机系统登场 3.1 ■单片机系统组成 3.1.1 单片机本身 3.1.2 系统的构成 3.2 ■单片机系统抽丝剥茧 3.2.1 AT89S51单片机的“外衣” 3.2.2 AT89S51单片机的管脚 3.2.3 常见外设 3.3 ■元器件插曲之一:变压器 3.3.1 变压器基础知识 3.3.2 电源变压器 3.4 ■元器件插曲之二:二极管与整流 3.4.1 二极管基础知识 3.4.2 整流 3.4.3 整流全桥 3.5 ■元器件插曲之三:电容 3.5.1 电容基础知识 3.5.2 电容的种类 3.5.3 电源滤波 3.6 ■元器件插曲之四:三端稳压与 单片机系统电源 3.6.1 三端稳压基础知识 3.6.2 单片机系统电源方案一: 自制直流稳压电源 3.6.3 单片机系统电源方案二: 电源适配器 3.6.4 单片机系统电源方案三: USB口供电 3.7 ■元器件插曲之五:晶振与振荡器 3.7.1 晶振基础知识 3.7.2 振荡器 3.8 ■诠释单片机最简系统 3.8.1 单片机最简系统 3.8.2 电源端(VCC、GND) 3.8.3 时钟信号端(XTAL1、 XTAL2) 3.8.4 复位端(RST) 3.8.5 外部程序存储器访问控制端 ( ) 3.8.6 从最简系统出发 3.9 ■元器件插曲之六:电阻 3.9.1 电阻基础知识 3.9.2 电阻的参数和种类 3.9.3 电阻的分压、限流、上拉作用 3.10 ■从单片机最简系统开始设计 3.10.1 发光二极管交替发光 3.10.2 程序设计 3.10.3 初见汇编语言 3.10.4 初识指令 3.10.5 立即数 3.11 ■应用体验——发光二极管的交替 发光 3.11.1 控制交替发光的原理 3.11.2 体验交替发光 3.12 ■元器件插曲之七:开关 3.12.1 开关基础知识 3.12.2 常用开关 3.13 ■实例解读——与发光二极管的 交互 3.13.1 需求分析 3.13.2 电路设计 3.13.3 程序设计 3.13.4 延时子程序 第4章 单片机系统设计辅助软件 4.1 ■Proteus单片机系统仿真软件 4.1.1 Proteus软件界面 4.1.2 用Proteus仿真 Vision单片机程序开发4.2 ■ Vision软件界面4.2.1 4.2.2 新建和保存项目 4.2.3 向项目中添加文件 4.2.4 汇编程序,生成执行代码 4.2.5 生成下载到单片机的执行 代码HEX文件 Vision的调试及仿真功能4.3 ■ 4.3.1 调试界面 4.3.2 虚拟逻辑分析仪 4.4 ■应用体验——把程序下载到 单片机里 4.4.1 下载器与单片机 4.4.2 体验下载过程 4.5 ■实例解读——流水灯 4.5.1 需求分析 4.5.2 电路设计 4.5.3 软件设计 第2篇 揭 密 单片机的内部结构是怎样的?单片机开发经常会用到哪些电子技术和元器件知识?还有那困扰了很多人的单片机编程语言……本篇将生动地通过诸多实例带出单片机的基础知识,在遇到相关模拟电路、数字电路、元器件知识时会有及时的补充说明,带领读者一点点揭开单片机的神秘面纱。 第5章 单片机的触角——I/O口 5.1 ■何谓I/O口 5.1.1 I/O口的功能 5.1.2 I/O口与单片机的关系 5.1.3 I/O口的操作 5.2 ■元器件插曲之八:场效应管 5.2.1 JFET 5.2.2 MOSFET 5.3 ■元器件插曲之九:逻辑门 5.3.1 非门 5.3.2 或门 5.3.3 或非门 5.3.4 与门 5.3.5 与非门 5.3.6 异或门 5.3.7 缓冲器 5.4 ■元器件插曲之十:锁存器与触发器 5.4.1 门控D锁存器 5.4.2 边沿D触发器 5.5 ■I/O口结构探密 5.5.1 P1口 5.5.2 P3口 5.5.3 P0口 5.5.4 P2口 5.5.5 I/O口小结 5.6 ■应用体验——控制流水灯 5.6.1 功能与电路 5.6.2 体验控制流水灯 5.7 ■实例解读——晃晃灯 5.7.1 原理分析 5.7.2 需求分析 5.7.3 电路设计 5.7.4 软件设计 第6章 七段数码管显示 6.1 ■二进制与数据 6.1.1 二进制与数字 6.1.2 二进制与语音 6.1.3 二进制与图像 6.2 ■元器件插曲之十一:七段数码管 6.2.1 七段数码管原理 6.2.2 七段数码管显示数字 6.3 ■应用体验——计时器 6.3.1 功能与电路 6.3.2 体验计时器 6.4 ■元器件插曲之十二:蜂鸣器 6.4.1 蜂鸣器 6.4.2 蜂鸣器如何工作 6.5 ■元器件插曲之十三:三极管及 三极管开关 6.5.1 三极管基础 6.5.2 三极管的直流放大特性 6.5.3 三极管的直流增益 6.5.4 三极管的电流关系式 6.5.5 三极管开关 6.6 ■实例解读——带声音提示的秒表 6.6.1 需求分析 6.6.2 电路设计 6.6.3 开关抖动的处理 6.6.4 计时中数字的增加 6.6.5 软件设计 第7章 解剖单片机 7.1 ■单片机的功耗 7.1.1 运行功耗 7.1.2 I/O口驱动功耗 7.1.3 空闲模式 7.1.4 待机模式 7.2 ■单片机内部结构 7.2.1 从I/O口到内部结构 7.2.2 数据在内部交换 7.2.3 算术逻辑单元(ALU) Vision中观察寄存器7.2.4 在 7.3 ■单片机的程序存储器 7.3.1 整体结构 7.3.2 程序下载到哪里 7.3.3 片内程序存储器 7.3.4 程序计数器PC 7.3.5 是片内还是片外程序存储器 Vision中观察程序存储器7.3.6 在 7.4 ■单片机的数据存储器 7.4.1 片内数据存储器 7.4.2 工作寄存器区(00H~1FH) 7.4.3 位寻址区(20H~2FH) 7.4.4 开放区(30H~7FH) Vision中观察数据存储器7.4.5 在 7.5 ■单片机的特殊功能寄存器 7.5.1 特殊功能寄存器分布图 7.5.2 特殊功能寄存器的功能 7.5.3 特殊功能寄存器的字节操作 7.5.4 特殊功能寄存器的位操作 Vision中观察特殊功能7.5.5 在 寄存器 7.6 ■应用体验——用取表方式实现 流水灯 7.6.1 取表法 7.6.2 取表法小结 7.6.3 体验流水灯 7.7 ■实例解读——直接驱动七段 数码管 7.7.1 需求分析 7.7.2 电路设计 7.7.3 软件设计 第8章 单片机与汇编指令 8.1 ■汇编语言真面目 8.1.1 汇编语言与高级语言 8.1.2 从汇编程序到执行代码 8.1.3 伪指令 8.2 ■指令的执行 8.2.1 振荡周期、机器周期、指令 周期 8.2.2 指令的执行 8.3 ■寻址方式 8.3.1 直接寻址 8.3.2 间接寻址 8.3.3 寄存器寻址 8.3.4 寄存器特征寻址 8.3.5 立即寻址 8.3.6 变址寻址 8.4 ■指令分类 8.4.1 指令概述 8.4.2 指令的度 8.5 ■算术运算指令 8.5.1 加法指令——ADD A, <src-byte> 8.5.2 带进位的加法指令——ADDC A, <src-byte> 8.5.3 带借位的减法指令——SUBB A,<src-byte> 8.5.4 自增/自减指令——INC <byte> / DEC <byte> 8.5.5 乘法指令——MUL AB 8.5.6 除法指令——DIV AB 8.5.7 十进制调整指令——DA A 8.6 ■逻辑运算指令 8.6.1 与操作——ANL <dest-byte>,<src-byte> 8.6.2 或操作——ORL <dest-byte>,<src-byte> 8.6.3 异或操作——XRL <dest-byte>, <src-byte> 8.6.4 累加器A清0操作——CLR A 8.6.5 累加器A取反操作——CPL A 8.6.6 累加器A位移动操作——RL、 RLC、RR、RRC 8.6.7 累加器A高低位交换操作 ——SWAP A 8.7 ■数据装载指令 8.7.1 片内数据装载指令——MOV   <dest>, <src> 8.7.2 数据指针DPTR装载指令 ——MOV DPTR, #data16 8.7.3 堆栈指令——PUSH、POP 8.7.4 数据交换指令——XCH、 XCHD 8.7.5 片外数据装载指令——MOVX   <dest>, <src> 8.7.6 查表指令——MOVC  <dest>, <src> 8.8 ■布尔指令 8.8.1 清0、置1、取反操作——CLR、 SETB、CPL 8.8.2 布尔逻辑运算指令——ANL、 ORL 8.8.3 位数据装载指令——MOV <dest-bit>,<src-bit> 8.8.4 布尔跳转指令——JC、JNC、 JB、JNB、JBC 8.9 ■调用子程序指令 8.9.1 调用指令——LCALL 8.9.2 绝对调用指令——ACALL 8.9.3 返回指令——RET、RETI 8.10 ■跳转与循环指令 8.10.1 无条件跳转指令——LJMP、 AJMP、SJMP、JMP 8.10.2 条件跳转指令——JZ、JNZ 8.10.3 比较跳转指令——CJNE <dest-byte>, <src-byte>, rel 8.10.4 循环指令——DJNZ <byte>,<rel-addr> 8.10.5 无操作指令——NOP 8.11 ■应用体验——七段数码管的串行 控制技术 8.11.1 串行与并行传输 8.11.2 串行控制七段数码管 8.11.3 程序设计 8.12 ■实例解读——指令应用(程序) 实例 8.12.1 数据求和 8.12.2 减法与二进制的二补数 8.12.3 异或操作指令XRL用于比较 寄存器数值 8.12.4 利用布尔指令产生矩形波 信号 8.12.5 布尔指令应用于控制

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值