汇编语言_实验三_编程、编译、连接、跟踪

四、实验结论

1.       练习1

第一步,在记事本中输入实验要求中提供的代码,结果如下:

将其以文件名t1.asm另存为到E:/masm。

第2步,为方便后续操作,此处先准备一个批处理文件:

同样将其放入E盘masm路径下,重命名为process.bat。

(1)进入并配置好DSBox环境,使用process t1对t1.asm进行编译、连接并运行:

屏幕上出现36.

(2)将修改line 4和line 6中寄存器dl增加的值,发现line 4中写入的数值是屏幕上显示的第一位数字1,line 9中的数值是屏幕上第二位数字。

(3)使用debug命令对生成的t1.exe进行调试。

①首先,使用r命令查看寄存器的值:

注意到,此处CX的值是0016H,DS的值为075AH,CS的值为076AH,刚好满足CS=DS+10H。

②使用d命令查看程序段前缀的前两个字节,发现前两个字节的确是CD 20:

3.反汇编t1.exe,查看所得代码,由于CX=0016H,所以此处我们查看从CS开始的0015H个字节的代码:

刚好是t1.asm中的内容。

④使用t命令和p命令进行单步调试直至程序结束,观察结果:

2.       练习2

第一步,编写汇编源程序:

第二步,

(1)对源程序进行编译、连接、运行,运行结果如下:

看到屏幕出现酒红色的36,嗯,这说明我们的程序有好好的编译连接和运行了……

(等等,说好的err呢?

(2)好吧,我们进继续按照实验要求中将原代码line 7的0433H改为0432H,将line 10中毒的0436H改为0439H,重新进行编译、链接、运行,得到结果如图:

(3)我们继续尝试修改填入显存单元中的数值,将源代码中line7的0433h改为0333h, line10 的 0436h改为0336h, 然后重新汇编、连接,并运行,结果如下:

此时屏幕左上角出现了绿色的36。

3.       延伸思考与分析

(1)在实验一中,我们已知地址A0000~BFFFF被用来当做显存地址空间,向地址为A0000~BFFFF的内存单元中写入数据,就是向显存中写入数据,这些数据会被显示卡输出到显示器上。在练习2中,line 7和line 10实际上即是在向段地址为B800H,偏移地址为BX的内存单元中写入数据,所以会被直接显示在屏幕的对应位置。而且,注意到显示的数字的ASCII码正好为写入的数据第二个字节。同时我们也看到,屏幕上打印的文字的颜色随着第一个字节的改变而改变。

(2)练习2中打印字符的原理参见上问,此处不再赘述。在练习1中是通过系统功能调用来显示数值,并且我们观察到,INT 21H所实现的功能随寄存器AH中的值不同而不同,当AH=02H时,所实现的功能是显示字符,并且显示的字符所对应的ASCII码正好是寄存器DL中的数据。

五、总结与体会

通过实践两种不同的方式在显示器上打印字符,学习了完整汇编源程序编写→汇编→连接→运行→调试的方法,加深了对之前所学知识的理解,掌握了通过寄存器BX实现间接寻址。

原文地址:https://www.cnblogs.com/AlexanderYang/p/9979260.html

时间: 2024-08-04 16:11:27

汇编语言_实验三_编程、编译、连接、跟踪的相关文章

微机接口技术与汇编语言上机实验报告_汇编初步(intel8086)

实验环境:intel x386 一.要求:将3000H单元开始置数为00H-0FH SSTACK SEGMENT STACK DW 32 DUP(?) SSTACK ENDS CODE SEGMENT ASSUME CS:CODE, SS:SSTACK START: PUSH DS XOR AX, AX MOV DS, AX MOV SI, 3000H MOV CX, 16 AA1: MOV [SI], AL INC SI INC AL LOOP AA1 ;CX == 0? NEXT():AA1

[芯片] 3、接口技术·实验三·可编程并行接口8255A

目录 一.实验目的和要求 二.实验原理与背景 2-1.8255A简介 2-2.8255A编程 三.实验具体的内容 3-1.8255方式0实验1 3-2.8255方式0实验2 3-3.8255方式1输出实验 3-4.8255方式1输入实验 四.实验的代码说明 4-1.8255方式0实验1代码及说明 4-2.8255方式0实验2代码及说明 4-3.8255方式1输出实验代码及说明 4-4.8255方式1输入实验代码及说明 五.实验结果的分析 5-1.8255方式0实验1实验分析 5-1.8255方式

Linux实验三 shell编程(1)

1. 练习 shell 中命令历史.别名.特殊字符用法(第 4 章 4.2 节~4.5 节) (1)定义别名 定义别名是,往往用单引号将它所代表的内容括起来,以防止shell对其中的内容产生歧义,如对空格和特殊字符另作解释. (2)特殊字符用法 1.一般通配符 *(星号):匹配任意字符的0次或多次(文件名中的圆点和路径名中的斜线必须显示匹配) ?(问号):匹配任意一个字符 [字符组]:匹配该字符组所限定的任何一个字符 !(惊叹号):如果它紧跟在一对方括号的左方括号[之后,表示不在此字符组的所列出

实验三 shell 编程(1)

一.shell命令应用练习 1.简述以下几个文件的用途 ① /etc/passwd passwd为密码文件,用来管理用户的密码.普通用户通常只能修改自己的密码信息. ② /etc/shadow shadow是一个影子化的密码文件,它包含系统账户的密码信息和可选的年龄信息.只有管理员能查看修改. ③ /etc/group group文件是用户组的配置文件,内容包括用户和用户组,并且能显示出用户是归属哪个用户组或哪几个用户组,因为一个用户可以归属一个或多个不同的用户组:同一用户组的用户之间具有相似的

【汇编语言】实验三

练习一:编写代码 用masm进行编译调试 可以得到结果为 :36 如果将line4的dl变为2,line9的dl变为5,我们再进行编译 可见结果变成了25!说明改动有效啦 用debug对生成的可执行文件 t1.exe 进行调试. 首先用r命令: 实验截图: 得到cs=076A,ds=075A,满足公式(cs)=(ds)+10H. PSP(程序段前缀)的头两个字节是CD 20, 用debug查看PSP的内容,验证是否如此. 由此可见,确实如此 使用 u 命令对 t1.exe 进行反汇编,观察反汇编

2016年4月24日_JAVA学习笔记_多线程三_线程间通信

1.毕老师第十四天内容,线程间的通信.大概是使用wait(),notify()等一系列函数来控制各个线程的CPU执行资格和执行权,通过合适的时机在各个线程当中切换来达到线程间通信的目的. 涉及到的方法: wait():让线程处于等待状态,被wait()的线程会被存储到线程池当中,直到被唤醒.只能在同步方法中被调用. notify():随机选择一个在该对象上调用wait方法的线程,解除其阻塞状态.只能在同步方法和同步代码块中被调用. notifyAll():接触所有在该对象上调用wait()方法的

Netfilter&iptables:如何理解连接跟踪机制?

如何理解Netfilter中的连接跟踪机制? 本篇我打算以一个问句开头,因为在知识探索的道路上只有多问然后充分调动起思考的机器才能让自己走得更远.连接跟踪定义很简单:用来记录和跟踪连接的状态. 问:为什么又需要连接跟踪功能呢? 答:因为它是状态防火墙和NAT的实现基础. OK,算是明白了.Neftiler为了实现基于数据连接状态侦测的状态防火墙功能和NAT地址转换功能才开发出了连接跟踪这套机制.那就意思是说:如果编译内核时开启了连接跟踪选项,那么Linux系统就会为它收到的每个数据包维持一个连接

实验三 编程、编译、连接、跟踪

学号:20171308150 姓名:江漪雯 班级:17计科4班 实验结论 一.练习1 第一步,编写汇编源程序 t1.asm,源程序代码如图 1-1 所示. 第二步,对源程序 t1.asm 进行汇编.连接.运行.调试 首先打开DOSBOX界面,输入如下指令,进入edit界面. 然后会出现以下界面,点击Enter进入. 输入指定代码,并保存为t1.asm. 然后进行编译 连接 运行 1)运行程序,观察程序输出结果是什么? 36 2)将 line4 和 line9 种寄存器 dl 的值分别修改为 0~

汇编试验三:编程、编译、连接、跟踪

masm 的下载,直接在机房拷贝,本打算直接在win10上编译连接好,但是发现还是不兼容:还是要利用DOSBox虚拟编译,连接: 开始加载程序,单步调试: 栈的效果: 因为这里的ss:sp位置恰好都是0,看不出ax,bx发生了交换: Source Code: assume cs:codesg codesg segment mov ax,2000H mov ss,ax mov sp,0 add sp,10 pop ax pop bx push ax push bx pop ax pop bx mo