作为汇编语言的课程笔记,方便之后的复习与查阅
本篇为课程第一次课内容
目录
程序语言分类
- 机器语言、汇编语言、高级语言
汇编语言的意义
- 与硬件关系密切,有助于理解计算机硬件与操作系统
- 有利于理解软件程序的工作原理
- 执行效率高,占用空间小
- 有些特殊领域只能用汇编
应用
- 软件破解、程序保护
- 逆向分析 (对目标软件进行反汇编、反编译或是动态调试跟踪,理解其核心代码)
- 驱动程序开发
搭建环境
DOSBox 安装
- 安装 DOSBox。DOSBox 可以在windows系统下构建一个虚拟的 DOS 环境
dasm
文件夹中包括了 debug、编译、链接时必要的可执行文件,因此可以把这个文件夹当成工作目录- 还有一个压缩包是 HexTools,用来以二进制形式查看文件内容
挂载硬盘
- 首先将本地的工作目录挂载到 DOSBOX 的 C 盘上
mount c e:\Workspace\assembly_language
- 挂载之后在命令行中输入
c:
就切换到了你的工作目录 (我这里是e:\Workspace\assembly_language
)
- 但每次打开 DOSBox 都要自己输入挂载命令的话毕竟还是太不方便,因此可以设置自动挂载。运行 DOSBox 安装根目录下的
DOSBox 0.74 Options.bat
,它会自动打开配置文件,在配置文件最后的[autoexec]
后输入挂载命令即可
[autoexec]
# Lines in this section will be run at startup.
# You can put your MOUNT lines here.
mount c E:\Workspace\assembly_language
命令行基本命令
cd
: change directorydir
: 列出目录内文件cls
: 清屏.exe
,.bat
,.com
文件可以直接执行
快捷键
Alt + Enter
: 全屏Ctrl + F4
: 更新所有目录缓存 (即刷新目录页面)
Hello World!
汇编代码
.model tiny ; model存储模式伪指令
.code ; code段定义伪指令
.startup ; 程序开始伪指令
mov dx, offset str ; 指定字符串的偏移
mov ah, 9 ;
int 21h ; 利用功能调用显示信息
.exit 0 ; 程序结束伪指令
str db 'Hello,World!',0dh,0ah,'$' ; 定义字符串
end ; 汇编结束
.model
伪指令
.model
是存储模式伪指令,该指令
- 决定程序规模
- 确定进行程序调用、指令转移、数据访问的缺省属性
主要包括:
tiny
(微型模式),small
,compact
,medium
,large
,huge
,flat
- 我们主要使用
tiny
模式,生成.com
文件
.code
简化段定义伪指令
.code
用来创建一个代码段
.startup
程序开始伪指令
.startup
用来指定程序开始执行的起始点
利用系统调用显示信息
- DOS系统调用给我们提供了很多函数,比如在屏幕上显示字符串,创建文件,读写文件…这个函数库调用哪个函数就有
ah
寄存器指定- 这里使用的DOS系统调用9号功能就是将寄存器
dh
所存地址上的字符串显示到屏幕上
- 这里使用的DOS系统调用9号功能就是将寄存器
mov dx, offset str ; 指定字符串的偏移
mov ah, 9 ;
int 21h ; 利用功能调用显示信息
- 先用
offset
获取字符串变量str
在内存中的地址,放入dx
寄存器。然后将ah
寄存器复位为9
,表示启用DOS系统调用的9号功能,即在屏幕上显示字符串的功能。最后用int
指令触发中断,进行DOS系统调用,在屏幕上显示信息
.exit 0
程序退出伪指令
- 利用
.exit 0
来结束程序,退回 DOS 环境
定义字符串
- 注意:定义的数据要放到
.exit
指令后
str db 'Hello,World!',0dh,0ah,'$' ; 定义字符串
0dh,0ah
为回车换行,$
为字符串结束标志db
为定义数据的伪指令,代表后面定义的数据都是以字节为单位。因此变量str
中的数据即为字符串中每一个符号的ascii
码
end
汇编程序结束标志
end
告诉汇编编译器,整个汇编语言程序到此结束
生成可执行文件
编译
masm hello.asm
链接生成可执行文件
link hello.obj/tiny