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

预备知识:

一个汇编语言程序从写出到执行的简要过程:

一:编写汇编源程序;

二:对源程序进行编译连接;可执行文件包含两部分内容:1.程序(指令机械码)和数据(程序定义的数据)、2.相关信息描述

三:执行可执行文件中的程序

课本P94:

(1) 将下面的程序保存为t1.asm文件,将其生成可执行文件t1.exe。

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  

        mov ax, 4c00h  

        int 21H  

codesg ends  

end

(2) 用DEBUG跟踪t1.exe的执行过程,写出第一步执行后,相关寄存器的内容和栈顶内容。

 前四条指令只用了三次t命令,初始化栈地址为:SS:SP=2000:10;

使用栈操作命令先是把栈中数据段(2000:0~E)的内容放置到ax(01A3),bx(0000)中再使用Push命令堆回去,使得栈中偏移地址为0~ E数据内容颠倒,再使用Pop命令导出到ax,bx中可见,ax=0000H,bx=01A3H。

(3)PSP的头两个字节是CD 20,用DEBUG加载t1.exe,查看PSP的内容。

PSP和物理地址连续,然而,却有不同的地址!

实验内容;

1. 练习 1

第 1 步,编写汇编源程序 t1.asm, 源程序代码如图 1-1 所示。

图 1-1 汇编源程序 t1.asm 源代码

第 2 步,对源程序 t1.asm 进行汇编、连接、运行、调试

(1) 运行程序,观察程序输出结果是什么?

在masm集成环境中写入代码:

运行结果:

Dos窗口左上方出现36数字,疑似与dl数据段有关。

(2) 将 line4 和 line9 种寄存器 dl 的值分别修改为 0~9 中任何一个数字,重新汇编→ 连接→运行,观察结果的变化。

分别进行修改成5和9,得执行结果如图:

这次dos窗口左上方出现了数字59,由两次执行结果易知5对应第一次int 21H之前得dl数据5,9对应第二次int 21H 之前得dl数据内容9。

(3) 用 debug 对生成的可执行文件 t1.exe 进行调试。

① 使用 r 命令查看。观察寄存器 cx 的值是 多少;观察寄存器 ds 和 cs 的值是多少,它们之间是否满足关系(cs)=(ds)+10H?

由图可知:CX =0016H,CS=076AH,ds=075AH,满足(cs)=(ds)+10H;

② PSP(程序段前缀)的头两个字节是 CD 20, 用debug 查看 PSP 的内容,验证是否如此。 

如图:

③ 使用 u 命令对 t1.exe 进行反汇编,观察反汇编得到的源代码。

④ 使用 t 命令和 p 命令(遇到 int 命令时,用 p 命令)单步调试,观察结果。

单步调试如图:

观察到每遇到一次int 21H, 在执行命令P下方即出现dl所对应得数值。

2. 练习 2

第 1 步,编写汇编源程序 t2.asm,源程序代码如图 1-2 所示。

注*:

图 1-2 汇编源程序 t2.asm 源代码

line6-7 相当于 mov [0],0433h line9-10 相当于 mov [2], 0436h

至于为什么这样使用两条指令,而不直接简化写成上面的形式,有两个原因。其中一个是方便以后循环;另一个原因,留待第 5 章再解释说明。暂时,先这样使用。

第 2 步,对源程序 t2.asm 进行汇编、连接、运行、调试

(1) 对 t2.asm 进行汇编、连接后,得到可执行文件 t2.exe。运行 t2.exe,观察程序运行结果,验证是否在屏幕左上方出现红色的数值 36。

注*)经测试,有些平台在 dosbox 下运行这个程序时有些问题,如果屏幕左上方没有输出结果,请运行程序 t2.exe 前,先输入 cls 命令清空一下屏幕,然后再执行 t2.exe。

程序运行出现错误,如图:

修改成mov [0],0433h mov [2] ,0436h 亦生错误:

然而,使用debug编译连接,无错误发生:

产生文件如下:

在Debug中运行得结果:

在左上角出现红色数字36

(2) 如果(1)结果得到验证,重新打开 t2.asm,尝试将源代码中 line7 的 0433h→0432h,

line10 的 0436h→0439h, 然后重新汇编、连接,得到可执行文件 t2.exe。使用 cls 命令清屏后,再次观察程序运行结果。

用记事本对其进行更改:

修改后需重新编译连接:

执行:

左上方出现红色数字29

(3) 如果(1)结果得到验证,重新打开 t2.asm,尝试将源代码中 line7 的 0433h→0333h,

line10 的 0436h→0336h, 然后重新汇编、连接,得到可执行文件 t2.exe。使用 cls 命令清屏后,再次观察程序运行结果。

同(2)再次进行修改-编译-连接,得执行结果如图:

由(1)(2)不难得知,显示出的数字与数据段中末尾值相关,而如今修改了前三位数值后,数字颜色发生变化,由043变化至033,颜色由红变天蓝色。

总结:综上可知,int 21H似乎与屏幕显示有关,根据ax,bx所指向啊不同,进行不同的输出,int 是interupt 中断的缩写,int 21H是指dos的中断调用命令。根据目前所学,至ax=4C00h,再调用int 21H,程序结束,而有实验可知ax=2时,调用int 21h会使字符输出。

关于练习2使用masm集成实验环境运行t2时,为何出错,出现mov [bx],0433h指令无效的错误,]本人不知所以,如有所知,期待有所解答。

原文地址:https://www.cnblogs.com/qiqi-14/p/9865047.html

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

实验3 编程、编译、连接、跟踪的相关文章

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

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

实验作业:使gdb跟踪分析一个系统调用内核函数

实验作业:使gdb跟踪分析一个系统调用内核函数(我使用的是getuid) 20135313吴子怡.北京电子科技学院 [第一部分] 根据视频演示的步骤,先做第一部分,步骤如下 ①更新menu代码到最新版 ②在代码中加入C函数.汇编函数 ③在main函数中加入makeconfig ④make rootfs ⑤可以看到qemu中增加了我们先前添加的命令: ⑥分别执行新增的命令 [第二部分]gdb跟踪分析一个系统调用内核函数 ①进入gdb调试 ②设置断点,继续执行: ③相对应的得到这样的结果: ④查看我

在Linux的连接跟踪(nf_conntrack)中缓存私有数据省去每次查找

前面说过很多次,conntrack作为一中连接跟踪机制,如果它本身是可扩展的,那么将会是多么令人激动的一件事,当你看了N多文档代码之后,你发现它确实是可以扩展的,但是却没有感到激动,因为你可能发现:1.它可以注册一个account扩展,但是计数机制却很原始:2.我希望增加一个新型的扩展,却不得不重新编译内核:怎 么办?我曾经很生气地默默指责过当初实现这个的人,想当然的认为将扩展本身也做成可扩展的,而不是写死几个特定的扩展将是一个多么容易的事,我一直憋着没 有去做这个实现,就是因为觉得它太简单,在

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

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

VC编译连接选项详解(转)

大家可能一直在用VC开发软件,但是对于这个编译器却未必很了解.原因是多方面的.大多数情况下,我们只停留在“使用”它,而不会想去“了解”它.因为它只是一个工具,我们宁可把更多的精力放在C++语言和软件设计上.我们习惯于这样一种“模式”:建立一个项目,然后写代码,然后编译,反反复复调试.但是,所谓:“公欲善其事,必先利其器”.如果我们精于VC开发环境,我们是不是能够做得更加游刃有余呢? VC的处理流程,大致分为两步:编译和连接.源文件通过编译生成了.obj文件:所有.obj文件和.lib文件通过连接

vc++ 编译连接错误and解决方法

1. LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol [email protected] Debug/lizi.exe : [分析]: 项目创建错误,因该选择Win32 Console Project,而不是 Win32 Projectvc++ 编译连接错误and解决方法,布布扣,bubuko.com

VC编译连接选项详解

VC编译连接选项详解 大家可能一直在用VC开发软件,但是对于这个编译器却未必很了解.原因是多方面的.大多数情况下,我们只停留在"使用"它,而不会想去"了解"它.因为它只是一个工具,我们宁可把更多的精力放在C++语言和软件设计上.我们习惯于这样一种"模式":建立一个项目,然后写代码,然后编译,反反复复调试.但是,所谓:"公欲善其事,必先利其器".如果我们精于VC开发环境,我们是不是能够做得更加游刃有余呢? VC的处理流程,大致分

linux内核netfilter连接跟踪的hash算法

linux内核中的netfilter是一款强大的基于状态的防火墙,具有连接跟踪(conntrack)的实现.conntrack是netfilter的核心,许多增强的功能,例如,地址转换(NAT),基于内容的业务识别(l7, layer-7 module)都是基于连接跟踪.然而,netfilter的性能还有很多值得改进的地方. netfilter的连接跟踪的hash算法是在Bob Jenkins的lookup2.c基础上的改进实现,Bob Jenkins已经推出lookup3.c的实现,见地址:h

[转]nf_conntrack: table full, dropping packet 连接跟踪表已满,开始丢包 的解决办法

nf_conntrack: table full, dropping packet  连接跟踪表已满,开始丢包 的解决办法 中午业务说机器不能登录,我通过USM管理界面登录单板的时候发现机器没有僵死,然后一看日志,g一下子就明白了 tail -2000 /var/log/messages Apr 10 12:48:35 bj-push-pushserver83 kernel: [95129.138804] __ratelimit: 16523 callbacks suppressed (“连接跟