【8086汇编-Day3】用debug做实验时的技巧与坑
Ⅰ· 无病呻吟
学一门语言,不动手实验是学不好的,在实验中不断遇坑然后解决,才有进益。所以写一下我在第一次汇编实验中的所思所想(王爽《汇编语言》第二章章末实验)。
Ⅱ · 实验内容

- 题解思路:
这个题需要我们向内存中写入一段代码并单步执行,仔细看过我上篇博文给出的链接,很容易想到,写入一段东西 有两个指令:e和a。
e是向指定位置写入机器码,(-e [段地址]:[偏移量],可逐个修改,亦可批量修改,下面是逐个修改),输完回车会显示指定内存地址处的原数据,输入要修改为的值。然后个选择,1.空格:修改紧接着的下一个地址的内容。2.回车:不再继续修改。单步执行命令为t,从cs:ip默认地址开始执行命令。
- 题解过程:
1.再用 a 指令直接输入一段代码,然后用 d 命令查看其机器码。

2.t单步执行(每次执行一条指令的时候,会根据指令长度,计算下一个命令的地址,做预读取)


- 题解思路:
写入指令倒是没什么难度,a 命令加上个指定地址就好了,重点在于,利用无条件跳转 jmp 达到计算2^8的目的,这就需要自己手动指定什么时候停止。这里用 t 加 指定指令数来实现。那就要算好要执行的指令数,将 add 和 jmp 做为一套运算,每套运算下来相当于ax的值乘以2,所以要计算2^8就是要做8套运算,乘以二就是要执行16条指令,别忘了还有一开始给ax赋初值的一条,所以总共17条指令!这里有个坑!!!dosbox里都是十六进制,所以如果输入条数的时候输入的是17,那实际上执行了23条指令。
另外,讲过t从cs:ip默认指向的地址开始执行,所以要先改好cs值,ip的值可以在用 t 命令时指定。
- 题解过程:
1.写完指令后看下寄存器状态和指令机器码

2.用 r 查看并修改cs值

3.单步执行,并查看最后运算结果



- 题解思路:
用 d 命令加上起始地址查看指定内容,并用 e 尝试修改
- 题解过程:

事实证明,不能修改,原因是这段属于ROM(只读存储),其内容,在一开始就烧录好,只供读取使用。

- 题解思路:
照打命令,查看现象。修改命令参数,尝试修改显示的位置、符号、颜色、背景色、闪烁。
- 题解过程:
1.照例尝试

2.上图发现写入不同内容后显示的图案样式颜色有所不同,在找到规律后,如下实验

实际上,这里能看出来两点:一、dos内显示区域起始位置为b8000。二、参数细节不同,显示效果不同。详细如下:
奇数位的字节表示显示什么符号,这是对应的十六进制ASCII码值,四行命令对比即可体现,诸君可尝试不同图案。
然后偶数位字节分出来高位(前位)和低位(后位)。低位表示何种颜色(0~F共16种)图中用笑脸和梅花共同展示了所有的16种颜色(黑色在最开头,不过融入窗体黑色,看不到,这里就可以当作“隐藏了”)高位数字又分成两个段,0~7和8~F,他们都有背景色,且一样,但是后段有闪烁效果。
(以上文段为本人总结规律,并非真正原理,有所偏差,以下面链接作矫。)
https://blog.csdn.net/nicholas199109/article/details/8554886

整体上就是这些了,最后一个比较有意思,诸君可以玩出点不同的效果。
Ⅲ · 补充
补充一张8086PC机内存地址空间分配的基本情况,实验3、4都用到了

【8086汇编-Day3】用debug做实验时的技巧与坑的更多相关文章
- 怎样让oracle实验本在不做实验时性能提升——win7下举例
怎样让oracle实验本在不做实验时性能提升--win7下举例 型号:ThinkPad E431 系统:WIN7 实验使用的笔记本不使用数据库时.建议将oracle关闭,使其释放占用的资源. orac ...
- 【8086汇编-Day5】第二次实验
debug的使用 偷个懒,之前写过了这里不再赘述 实验 1)实验1 要求:用e将一些数据写入内存,用a写入一段程序,t 逐条执行 观察具体参数变化,并探究现象 1.e写入,d检查 2.a写入程序 3. ...
- 【8086汇编-Day2】dosbox实验环境配置及测试
我学习汇编用的是王爽的<汇编语言>第三版,书中是以8086处理器为例,是工作在实模式下的,而当下的个人电脑处理器都是工作在保护模式下的.所以需要一个虚拟的工作在实模式下的处理器,这里主要用 ...
- 8086汇编语言学习(二) 8086汇编开发环境搭建和Debug模式介绍
1. 8086汇编开发环境搭建 在上篇博客中简单的介绍了8086汇编语言.工欲善其事,必先利其器,在8086汇编语言正式开始学习之前,先介绍一下如何搭建8086汇编的开发环境. 汇编语言设计之初是用于 ...
- 【8086汇编-Day1】预备知识
菜鸟的8086汇编入门之旅,偶有错处恭请大佬们指正. Ⅰ· 闲说一下 我为什么学汇编?相对于晦涩难懂的01010101011010机器语言(高低电平变化驱动机器做出不同反应),汇编语言用更便于记忆和使 ...
- 8086汇编——Introduction(8086内部寄存器,段寄存器,存储器分段)
8086汇编--Introduction 一.8086CPU的三种工作模式 实模式:只有低20位地址线起作用,仅能寻址第一个1MB的内存空间.MS DOS运行于该模式下. 保护模式:在该模式下,机器可 ...
- 做dg时遇到的log_archive_dest、log_archive_dest_1、db_recovery_file_dest之间互相影响
前提:归档开启.默认不指定归档文件夹. 今晚遇到客户那里设置了闪回区和log_archive_dest.不停库做DG时,无法指定log_archive_dest_n參数,巨坑. .实验了下.结论例如以 ...
- Win10下C语言转8086汇编
目录 Win10下C语言转8086汇编 简介 开始 写C代码 转换成汇编代码 Win10下C语言转8086汇编 简介 最近学习<王爽汇编>,然后突发奇想,想一边写C语言用编译器将其翻译成汇 ...
- 汇编初入门debug实操
修改cs:ip的值 jmp 段地址:偏移地址 //在汇编指令中用,不是在debug上用的 如 jmp 2AE3:3 //执行后CS=2AE3H ip=0003H 若只修改IP内容 jmp 某一个合法的 ...
随机推荐
- CPP11实践
- 001 以lambda作为返回值该如何声明? 标准库提供了function模板可以直接声明,如std::function<void (int, int)>.如下函数foo返回了一个函数 ...
- 实战开发一个Nginx扩展 (Nginx Module)
repo地址 https://github.com/wujunze/nginx-http-echo-module nginx_module_echo 使用echo指令输出一个字符串 Nginx 版本 ...
- swagger使用二:swagger配置多个项目注释
在项目中采用swagger测试接口,提供接口给其他人员都非常的方便. 在swagger默认配置中,默认只显示接口访问层中的注释,可是很多的参数说明都已经在实体层中了啊?(如下图)不可能再把实体层中的模 ...
- 在thinkphp5.0中调用ajax时, 返回的JSON 格式数据在html前台不能用时
在thinkphp5.0中调用ajax时,如果控制器返回的数据为json格式,视图层接收到返回值即为json格式的数据,此时应该把 JSON 文本转换为 JavaScript 对象,方便调用.具体代码 ...
- 3.spring:自动装配/Bean之间的关系/作用域/外部文件/spel/
1.自动装配/手动装配 xml配置文件里的bean自动装配 Spring IOC 容器里可以自动的装配Bean,需要做的仅仅是在<bean>的autowire属性里面指定自动装配模式 -& ...
- [转]java中文乱码的解决
在基于Java的编程中,经常会碰到汉字的处里及显示的问题,比如一大堆乱码或问号. 这是因为JAVA中默认的编码方式是UNICODE,而中国人通常使用的文件和DB都是基于GB2312或者BIG5等编码, ...
- Android杀死进程方法
1. android.os.Process.killProcess(pid) 只能终止本程序的进程,无法终止其它的 具体代码如下: ?12 Process.killProcess(Process.my ...
- 一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach
一点一点看JDK源码(五)java.util.ArrayList 后篇之forEach liuyuhang原创,未经允许禁止转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 代 ...
- DQL-分组查询
一.语法 select 分组函数,分组后的字段 from 表 [ where 筛选条件] group by 分组的字段[having 分组后的筛选][order by 排序列表] 例如 S ...
- Oracle 体系结构一 概述
Oracle服务器由两个实体组成:实例和数据库. 实例由内存结构和进程组成. 它暂时存在于RAM和CPU中.当关闭运行的实例时,实例将消失的无影无踪. 数据库由磁盘上的文件组成.不管在运行状态还是停止 ...