当前位置: 首页 > news >正文

【汇编】 13.3 对int iret和栈的深入理解

书中示例

assume cs:codecode segment
start:mov ax,csmov ds,axmov si,offset lpmov ax,0mov es,axmov di,200hmov cx,offset end0-offset lpcldrep movsb	;lp到end0的指令传送到0:200处mov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*4+2],0	;设置7c表项的入口地址为0000:0200,也就是int 7ch时,执行lp到end0的指令mov ax,0b800hmov es,axmov di,160*12;设置bx的位移mov bx,do0-semov cx,80
do0:	mov byte ptr es:[di],'!'add di,2int 7ch	;中断,cs和ip入栈。cs为do0所在的段地址,ip为执行完int 7ch后下一条指令的偏移地址;此时栈顶是se的偏移地址		
se:	nopmov ax,4c00hint 21hlp:	push bp	;bp入栈,此时栈顶是bpmov bp,sp		;当前栈顶的偏移地址。dec cxjcxz lpret	;cx=0则转移到lpret,否则继续执行add [bp+2],bx	;bp+2为se的偏移地址;此时ip=se+bx=se+do0-se=do0lpret:pop bp	;bp出栈iret	;ip、cs、flag依次出栈,此时ip=d0的偏移地址;也就是回到do0标号处继续执行指令,直到cx=0,ip=se的偏移地址。
end0:nop mov ax,4c00hint 21hcode ends
end start 

可能还可以优化,这代码看着有点多。
在这里插入图片描述

检测点13.1

同上。

assume cs:code
data segmentdb 'conversation',0
data ends
code segment
start:mov ax,csmov ds,axmov si,offset lpmov ax,0mov es,axmov di,200hmov cx,offset end0-offset lpcldrep movsb	;lp到end0的指令传送到0:200处mov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*4+2],0	;设置7c表项的入口地址为0000:0200,也就是int 7ch时,执行lp到end0的指令mov ax,0b800hmov es,axmov ax,datamov ds,axmov di,160*12mov si,0;设置bx的位移mov bx,offset s-offset ok
s:	cmp byte ptr [si],0je okmov al,[si]mov es:[di],almov byte ptr es:[di+1],2inc siadd di,2int 7ch	;中断,cs和ip入栈。cs为s所在的段地址,ip为执行完int 7ch后下一条指令的偏移地址;此时栈顶是ok的偏移地址		
ok:	mov ax,4c00hint 21hlp:	push bp	;bp入栈,此时栈顶是bpmov bp,sp		;当前栈顶的偏移地址。dec cxjcxz lpret	;cx=0则转移到lpret,否则继续执行add [bp+2],bx	;bp+2为ok的偏移地址;此时ip=ok+bx=ok+s-ok=slpret:pop bp	;bp出栈iret	;ip、cs、flag依次出栈,此时ip=s的偏移地址;也就是回到do0标号处继续执行指令,直到cx=0,ip=ok的偏移地址。
end0:nop mov ax,4c00hint 21hcode ends
end start 

在这里插入图片描述

http://www.lryc.cn/news/286466.html

相关文章:

  • Git提交大文件报错“remote: Please remove the file from history and try again. ”
  • 接口测试 03 -- 接口自动化思维 Requests库应用
  • SpringBoot:Bean生命周期自定义初始化和销毁
  • Git--基本操作介绍(2)
  • 第08章_面向对象编程(高级)(static,单例设计模式,理解mian方法,代码块,final,抽象类与抽象方法,接口,内部类,枚举类,注解,包装类)
  • Java中Map接口常用的方法
  • Linux软件包管理器yum
  • Linux中NFS服务器的搭建和安装
  • c递归算法模型
  • 力扣740. 删除并获得点数
  • spring和springboot的区别
  • imgaug库图像增强指南(35):【iaa.Fog】——轻松创建自然雾气场景
  • 网络安全--防御保护02
  • UE5 C++学习笔记 常用宏的再次理解
  • SpringBoot整合SSE
  • mysql-进阶篇
  • Js中的构造函数
  • [小程序]页面事件
  • vue echarts地图
  • v38.Switch语句
  • 如何进行产品的人机交互设计?
  • 【ARMv8M Cortex-M33 系列 7.3 -- EXC_RETURN 与 LR 及 PC 的关系详细介绍】
  • Linux之权限(内容详细,细节满满)
  • 了解云工作负载保护:技术和最佳实践
  • 【Godot4自学手册】第三节设置主人公的动画
  • excel学习1
  • 裁员致谷歌中国籍程序员身亡,技术变革下裁员对程序员的影响有多大
  • MybatisPlus的主键ID生成策略和公共字段自动填充的使用及注意事项
  • 【GitHub项目推荐--微软开源的可视化工具】【转载】
  • Python基础之文件操作(I/O)