汇编语言王爽第4版实验8答案(和你想的不一样)

news2024/10/5 17:21:29

实验8 分析一个奇怪的程序

E:\mywork\asm\p906.asm
C:\>edit p906.asm
assume cs:code

code segment

	mov ax,4c00h
	int 21h
start:	
	mov ax,0
s:
	nop		; nop的机器码占一个字节
	nop
	
	mov di, offset s
	mov si, offset s2
	mov ax, cs:[si]
	mov cs:[di],ax
s0:
	jmp short s
s1:
	mov ax,0
	int 21h
	mov ax,0
	
s2:
	jmp short s1
	nop

code ends

end 
C:\>

编译、连接、运行

C:\>debug p906.exe
-u
076A:0000 B8004C	MOV AX,4C00
076A:0003 CD 21		INT 21
076A:0005 B80000	MOV AX,0000
076A:0008 90		NOP
076A:0009 90		NOP
076A:000A BF0800	MOV DI,0008
076A:000D BE2000	MOV SI,0020
076A:0010 2E		CS:
076A:0011 B804		MOV AX,[SI]
076A:0013 2E		CS:
076A:0014 8905		MOV [DI],AX
076A:0016 EBF0		JMP 0008
076A:0018 B80000	MOV AX,0000	
076A:001B CD21		INT 21
076A:001D B80000	MOV AX,0000
076A:0020 EBF6		JMP 0018	; 位移0f6h,取反加1为:10h
076A:0022 90		NOP			;    (-0ah)11110110 00001001 00001010(0ah)
076A:0023 0000		ADD [BX,SI],AL
-q
C:\>

运行说明
在debug中默认会从第1条指令(MOV AX,4C00)运行,无法正常调试。
所以我们使用rip命令,将ip修改为5,从cs:0005处开始执行。调试过程如下图:

程序调试1
程序调试2

程序调试3
单步调试到JMP 0008时,查看内存中的代码如下图所示:
单步调试,查看内存
从上图可以看到,076A:0008处的机器指令EBF6,汇编指令是:JMP 0000,怎么回事?请看后面的详细分析。

C:\>p906
C:\>

命令行下执行,也可以正常退出,如下图所示:
运行程序可以正常退出
运行分析
先说一下整个运行流程的关键节点(可能和你想象的不一样):
1、执行076A:0016处的汇编指令JMP 0008;
2、执行076A:0008处的机器指令EBF6;
3、执行076A:0000处的汇编指令MOV AX,4C00和INT 21,调用中断结束运行。
详细分析
1、复制cs:0020处的字内容到cs:0008,实际上就是修改了内存cs:0008处内容为EBF6(cs:0020处jmp 18的机器码);
2、顺序执行到076A:0016指令:JMP 0008;
3、执行076A:0008处的内容,机器指令为:EBF6。
机器指令:EBF6,EB表示跳转,偏移量为F6。
此处为关键,有两种算法,看懂这一点,你就通了:
1)用公式算(P180),根据机器指令:EBF6,求标号处的地址
8位位移=标号处的地址-jmp指令后的第一个字节的地址
//推导:
标号处的地址=8位位移+jmp指令后的第一个字节的地址
//看仔细喽:
8位位移:就是偏移量F6
jmp指令后的第一个字节的地址:076A:0008+2=076A:000A,段地址省略,直接取000A
//计算:
标号处的地址=0F6H+000AH=0H
补码:11110110 0F6H
补码:00001010 06H
相加:00000000 0H(高位溢出的1直接舍弃)
计算方法查看:附录2 补码
标号处的地址为0H,即执行CS:0000处的代码。
2)向前跳转反推(看不懂这种就用第1种公式去算)
偏移量为F6,即向前跳转,F6取反加1为0AH,即向前跳转0AH个位移量:
补码:11110110 0F6H
取反:00001001 09H
加一:00001010 0AH(0F6H的绝对值)
jmp指令后的第一个字节的地址:076A:0008+2=076A:000A
从076A:000A向前跳转0AH,即执行076A:0000处的指令。
跳转方法查看:附录3 补汇编语言(masm.exe)对jmp的相关处理。
4、从076A:0000执行汇编指令MOV AX,4C00,调用中断结束程序。
后记
前面使用rip命令来进行调试,原因是代码抄错了:)
正确:

end start

错误:

end 

(全文完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1057647.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

tauri为窗口添加阴影效果

需求 为窗口添加阴影效果,让窗口显得更立体。 实现方案 通过 tauri 中的 window-shadows 依赖实现。 编码 修改 label 标签内容 修改 src-tauri/tauri.conf.json 文件,设置 label 字段为 “customization” 增加shadows的依赖 修改 src-tauri…

第8期ThreadX视频教程:应用实战,将裸机工程移植到RTOS的任务划分,驱动和应用层交互,中断DMA,C库和中间件处理等注意事项

视频教程汇总帖:【学以致用,授人以渔】2023视频教程汇总,DSP第12期,ThreadX第8期,BSP驱动第26期,USB实战第5期,GUI实战第3期(2023-10-01) - STM32F429 - 硬汉嵌入式论坛 …

函数、函数的傅里叶级数展开、傅里叶级数的和函数之间的关系

1.函数、函数的傅里叶级数展开、傅里叶级数的和函数之间的关系 1.1 傅里叶级数中的系数公式推导 我们先来推导一下傅里叶级数中的系数公式,其实笔者已经写过一篇相关笔记,详见:为什么要把一个函数分解成三角函数?(傅利叶级数) f ( x )…

MySQL 索引优化实践(单表)

目录 一、前言二、表数据准备三、常见业务无索引查询耗时测试3.1、通过订单ID / 订单编号 查询指定订单3.2、查询订单列表 四、订单常见业务索引优化实践4.1、通过唯一索引和普通索引优化通过订单编号查询订单信息4.2、通过普通联合索引优化订单列表查询4.2.1、分析查询字段的查…

【数据结构】HashSet的底层数据结构

🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 HashSet 一、 HashSet 集合的底层数据结构二…

GraphPad Prism 10 for Mac(统计分析绘图软件)

GraphPad Prism是一款专业的统计和绘图软件,主要用于生物医学研究、实验设计和数据分析。 以下是 GraphPad Prism 的主要功能和特点: 数据导入和整理:GraphPad Prism 可以导入各种数据格式,并提供直观的界面用于整理、编辑和管理数…

RFID与人工智能的融合:物联网时代的智能化变革

随着物联网技术的不断发展,现实世界与数字世界的桥梁已经被打通。物联网通过各种传感器,将现实世界中的光、电、热等信号转化为有价值的数据。这些数据可以通过RFID技术进行自动收集和传输,然后经由人工智能算法进行分析、建模和预测&#xf…

【LeetCode算法系列题解】第76~80题

CONTENTS LeetCode 76. 最小覆盖子串(困难)LeetCode 77. 组合(中等)LeetCode 78. 子集(中等)LeetCode 79. 单词搜索(中等) LeetCode 76. 最小覆盖子串(困难) …

Java下正面解除警告Unchecked cast: ‘java.lang.Object‘ to ‘java.util.ArrayList‘

就是我在反序列化时&#xff0c;遇到这样一个警告&#xff1a; Unchecked cast: java.lang.Object to java.util.ArrayList<com.work1.Student>然后我去网上查&#xff0c;有些人说用SuppressWarnings(“unchecked”)去忽略警告&#xff0c;但是我觉得作为一名合格的程序…

SNERT预备队招新CTF体验赛-Web(SWCTF)

目录 1、F12 2、robots 3、game1-喂青蛙 4、game 2 - flap bird 5、game 3 - Clash 6、Get&Post 7、sql &#xff08;1&#xff09;手工注入 &#xff08;2&#xff09;工具注入 8、命令执行漏洞 9、文件上传漏洞 10、文件泄露 11、php反序列化漏洞 12、PHP绕…

【网络编程】UDP数据报套接字编程和TCP流套接字编程

文章目录 1. 网络编程基础1.1 为什么需要网络编程&#xff1f;1.2 网络编程是什么&#xff1f;1.3 概念 2. Socket套接字3. UDP数据报套接字编程3.1 DatagramSocket API3.2 DatagramPacket API3.3 InetSocketAddress API 4. UDP构建服务端客户端&#xff08;一发一收&#xff0…

QSS之QComboBox

QComboBox在Qt开发过程中经常使用&#xff0c;默认的下载列表风格达不到设计师的要求&#xff0c;本篇介绍基本的QComboBox的qss设置。 属性意思QComboBoxQComboBox基本样式QComboBox:editable右边可选择按钮QComboBox:!editable, QComboBox::drop-down:editable不可编辑或下拉…

Python中匹配模糊的字符串

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 如何使用thefuzz 库&#xff0c;它允许我们在python中进行模糊字符串匹配。 此外&#xff0c;我们将学习如何使用process 模块&#xff0c;该模块允许我们在模糊…

离散数学 学习 之 5.3 一阶逻辑的推理理论

第一个证明中&#xff0c;最后三步的化简很重要&#xff0c;倒数第三步构造出一个可以化简出倒数第二步的公式&#xff0c;最后再化简 上面中的第 1&#xff0c; 2 步 和 3 &#xff0c; 4 步不能换&#xff0c;因为无法保证是同一个 c 尽量弄成前束范式 上面中2&#xff0c;3&…

无状态自动配置 DHCPv6无状态配置 DHCPv6有状态配置

1、无状态自动配置 配置命令 AR1 ipv6 #开启路由器ipv6报文转发功能 interface GigabitEthernet0/0/0 ipv6 enable #开启路由器接口IPv6报文转发功能 ipv6 address FC01::1/64 …

对比两个Series序列中的元素是否不相等,并以Series格式返回结果

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 逐一对比两个Series序列中 元素是否不相等&#xff0c;将结果 以Series格式返回 [太阳]选择题 关于以下代码的说法中正确的是? import pandas as pd a pd.Series([0,1,2],index["x"…

stm32 - 中断/定时器

stm32 - 中断/定时器 概念时钟树定时器类型基准时钟&#xff08;系统时钟&#xff09;预分频器 - 时基单元CNT计数器 - 时基单元自动重装寄存器 - 时基单元基本定时器结构通用定时器计数器模式内外时钟源选择 定时中断基本结构时序预分频器时序计数器时序 概念 时钟树 https:…

vue重修004上部

文章目录 版权声明组件的三大组成部分scoped解决样式冲突scoped原理2.代码演示 组件data函数说明演示 组件通信组件关系分类通信解决方案父子通信流程子向父通信代 props详解props校验props&data、单向数据流 小黑记事本&#xff08;组件版&#xff09;基础组件结构需求和实…

【AI处理器组合】python实现-附ChatGPT解析

1.题目 AI处理器组合 知识点数组 时间限制:1s 空间限制: 256MB 限定语言:不限 题目描述: 某公司研发了一款高性能AI处理器。每台物理设备具备8颗AI处理器,编号分别为0、1、2、3、4、5、6、7。编号0-3的处理器处于同一个链路中,编号4-7的处理器处于另外一个链路中,不通链路中…

【计算机网络笔记九】I/O 多路复用

阻塞 IO 和 非阻塞 IO 阻塞 I/O 和 非阻塞 I/O 的主要区别&#xff1a; 阻塞 I/O 执行用户程序操作是同步的&#xff0c;调用线程会被阻塞挂起&#xff0c;会一直等待内核的 I/O 操作完成才返回用户进程&#xff0c;唤醒挂起线程非阻塞 I/O 执行用户程序操作是异步的&#xf…