《汇编语言》学习(四)汇编程序
2016-09-29 16:59
253 查看
《汇编语言》第四章主要介绍“汇编程序从源码编写到执行和调试的过程”,包括:源码编写、源码构成、编译和链接、加载和返回shell、运行和调试。
本章是一般原理性的内容,没有安排练习题,只有一个实验题。在此,我将用一个思维导出来总结本章的知识点,并分享我搭建实验环境的过程,和给出实验题调试过程。
一、知识图谱
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/08/3ee1bb513993f64c3a0fa6424407f9ed)
二、环境搭建
本系列第一篇博文我就提到了,我的汇编学习环境是在虚拟机中“win7 x86”下进行的。一开始,我通过bing搜索“win7 汇编编译器”,发现了微软官方的http://www.masm32.com/ 提供masm32的下载。然后按照网上的教程进行安装,安装过程很简单,一路按“下一步或确认”即可,除了选择安装路径外。
安装好masm32,会在桌面上生成一个快捷方式。它是一个32位的汇编程序开发IDE,像一个超级简易版的VS,提供源码编辑、编译、链接和debug功能。
我在masm32的IDE中,安装《汇编语言》的示例一步步操作,编辑源码和编译都正常,到链接时,报错:
LINK: error LINK2001: unresolved external symbol _WinMainCRTStartup
使用这个错误信息去搜索,有大牛说,masm32只支持Windows汇编,而《汇编语言》中的汇编代码是DOS下的汇编。或者说,masm32支持的是32位汇编,而本书实验的是16位汇编。
此后,我有尝试搜索,最终找到这个帖子:
http://www.cnblogs.com/S-E-P/archive/2011/05/18/2049730.html
下载该帖中的16位masm,解压到c盘根目录下,即可安装《汇编语言》一书中的操作,一步步实验了。
三、实验题
1,源码——t1.asm
2,编译和链接
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/08/76950e511445b558e9db1b50576fc5c8)
3,调试
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/08/18050efcee8f4e03b8a5decc18afc803)
分析:
1)初始时,DS是该程序所在内存区的段地址,也即PSP的段地址。默认偏移地址为0。
2)cx存放程序的长度。
3)给SS赋值时,SP也被执行,参看上面的第二条t执行后的状态。
4)最初,SP设置为0,表示满栈,此时只能进行出栈操作。但事实上,CPU不会现在用户对栈的操作,用户需要自己管理栈空间和操作。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/08/c5e26123b99dc60bda3f4248ccc641a3)
分析:
1)程序中设定的栈空间的会临时保存寄存器的信息,如cs ip ax等。
2)临时信息从右往左排列,随着栈指针的移动而移动。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/08/b7947ef595e8d4c2c1a3703baae4d765)
注:pop和push可以实现数据交互
![](https://oscdn.geek-share.com/Uploads/Images/Content/202012/08/18167e80a0be31b5f55dc05e03517652)
最后,执行“int 21h”指令时,需要用p-perform。
本章是一般原理性的内容,没有安排练习题,只有一个实验题。在此,我将用一个思维导出来总结本章的知识点,并分享我搭建实验环境的过程,和给出实验题调试过程。
一、知识图谱
二、环境搭建
本系列第一篇博文我就提到了,我的汇编学习环境是在虚拟机中“win7 x86”下进行的。一开始,我通过bing搜索“win7 汇编编译器”,发现了微软官方的http://www.masm32.com/ 提供masm32的下载。然后按照网上的教程进行安装,安装过程很简单,一路按“下一步或确认”即可,除了选择安装路径外。
安装好masm32,会在桌面上生成一个快捷方式。它是一个32位的汇编程序开发IDE,像一个超级简易版的VS,提供源码编辑、编译、链接和debug功能。
我在masm32的IDE中,安装《汇编语言》的示例一步步操作,编辑源码和编译都正常,到链接时,报错:
LINK: error LINK2001: unresolved external symbol _WinMainCRTStartup
使用这个错误信息去搜索,有大牛说,masm32只支持Windows汇编,而《汇编语言》中的汇编代码是DOS下的汇编。或者说,masm32支持的是32位汇编,而本书实验的是16位汇编。
此后,我有尝试搜索,最终找到这个帖子:
http://www.cnblogs.com/S-E-P/archive/2011/05/18/2049730.html
下载该帖中的16位masm,解压到c盘根目录下,即可安装《汇编语言》一书中的操作,一步步实验了。
三、实验题
1,源码——t1.asm
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,编译和链接
3,调试
分析:
1)初始时,DS是该程序所在内存区的段地址,也即PSP的段地址。默认偏移地址为0。
2)cx存放程序的长度。
3)给SS赋值时,SP也被执行,参看上面的第二条t执行后的状态。
4)最初,SP设置为0,表示满栈,此时只能进行出栈操作。但事实上,CPU不会现在用户对栈的操作,用户需要自己管理栈空间和操作。
分析:
1)程序中设定的栈空间的会临时保存寄存器的信息,如cs ip ax等。
2)临时信息从右往左排列,随着栈指针的移动而移动。
注:pop和push可以实现数据交互
最后,执行“int 21h”指令时,需要用p-perform。
相关文章推荐
- Java API 1.8源码--【集合类 collection】
- Spring-MVC第一弹简单项目搭建
- python中easy_install 卸载已经安装的包
- Java API 1.8源码--【集合类 collection】
- 使用java语言实现各种排序算法
- C#使用MemoryStream类读写内存
- Spring Boot中使用Swagger2构建强大的RESTful API文档
- 使用springfox整合SpringMVC和Swagger
- 菜鸟练习华为级考题——字符串过滤和统计高频数字出现频次
- Spring Security3 - MVC 整合教程 (初识Spring Security3)
- C#创建基本图表(Chart Controls)
- 增强for循环和普通for循环的区别
- JavaMail--基础类详解
- Struts2-类型转换器-Converter
- PHP制作数字、字母型验证码及其工作原理剖析
- PHP使用mysqli扩展库实现增删改查(面向对象版)
- 监控和管理生产环境spring boot actuator
- 特殊容器bitset的用法
- JavaMail发送和接收邮件
- java语言复制数组的四种方法