汇编语言综合研究试验2--使用寄存器

我们为什么必须用变量?
因为我们在编程时必须存储数据,那么如果可以用别的方法存储数据,我们就可以不必因此目的而使用变量
用什么方法来存储数据呢?在学习汇编语言时,我们如何存储数据?
我们把数据存储在寄存器或者内存空间中

本次研究试验中,我们研究一下使用寄存器的问题

一.实验过程

1.首先在c:\minic 目录下的tc.exe编写一个ur1.c程序,编译、链接成ur1.exe

2.用debug加载ur1.exe,用u命令查看ur1.c编译后的机器码和汇编代码
在这里插入图片描述
根据我们汇编语言学习的经验,main函数代码应该存放在code段中

3.在ur1.c文件中添加一行 Printf(“%x/n”,main);,用此方法打印出ur1.exe被加载运行时,main函数在代码段中的偏移地址
在这里插入图片描述
语句为打印语句,main相当于一个指针变量,%x是将该指针的内容以16进制格式打印出来。而指针变量中存着地址,所以上面的程序可以将main函数在代码段中的偏移地址打印出来

4.用debug加载url.exe,查看01fa,即mian函数的汇编代码,除去开始处的“push bp mov bp,sp”和结尾处的“pop bp”,其余代码就是main函数中的代码,对应每条c语句
在这里插入图片描述
5.我们设想:C语言将函数实现为汇编语言中的子程序,在c:\minic 目录下的tc.exe编写一个ur2.c程序,编译、链接成ur2.exe ,用debug跟踪并查看01fa处的代码
在这里插入图片描述
发现有一个call 命令 找到 020b处的代码,其实这里就是f(void)函数的入口,下面的ret相当于函数的返回 ,所以,我们就知道,当c语言中调用一个函数时,将其转化为相应的汇编代码时用call命令,而程序结束返回时就用ret指令,显然,刚才的猜想成立

二.总结思考

在查看url.c中每条C语言对应的汇编代码时,可以发现
_AX = 1; => mov ax,0001
_AX = _BX + _CX => mov ax,bx
add ax,cx
进入函数后的push bp,mov bp,sp和后边的pop bp可以认为是c函数中可能用到bp寄存器而做的对bp寄存器的设置

三.研究体会

经过本次实验,学会了如何查看用C语言编译而成的程序中main函数的偏移地址,并能利用debug的u命令查看C语言所对应的汇编代码,发现C语言对寄存器的操作分别对应汇编语言中的哪些寄存器,以及C语言对函数的实现原理

综合研究阶段所需要的tc2.0我已经上传网盘,免费分享给大家,关注我的公众号,菜单栏–>技术相关–>免费资源即可领取,还有网课查答案,包括学习通、智慧树、mooc,内容涵盖计算机、政治等等,还有其他免费资源(简历模板、电子版书籍和考试资料等等),说不准大家会有用(分享干货)!

扫码加关注吧!
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值