window10下搭建汇编环境
0x00 软件和资料
软件包含:
- dosbox
- debug
- masm
- link
exe2bin(这个暂时可以忽略)
资料包含:
- 王爽老师的《汇编语言》第二版
- 《汇编语言》第二版 中的习题答案
- 汇编语言编程艺术(清晰版)
下载地址:
链接:https://pan.baidu.com/s/17QfCsbvYNwLnUCHIzsluDQ
提取码:i27u
0x01 环境搭建
把软件放在同一个文件夹下,
我的放在D/Debug下
- 安装dosbox
选择安装目录(最好是自己选择一个目录,方便后面查找)
我在D盘创建了一个dosbox文件夹,把它安装在D盘的dosbox下,选择好安装目录后,点击安装即可。
2. 修改dosbox配置文件
安装好dosbox后,
我们相当于有了一个可以运行debug,masm等(我们写的汇编程序也是用这个终端来运行)程序的终端程序(cmd,windows10自带的cmd是运行不了debug,masm。。程序的)。
现在有了可以运行这些程序的cmd,
现在去尝试运行一下debug,
我们要先转到debug程序所在的目录下,
(我的debug程序放在了D/Debug)
在dosbox中输入:
mount D D:/Debug
(mount命令是挂载硬盘或镜像的命令,这条指令我的的理解是:把D/Debug文件夹里的东西在D盘上创建了一个镜像)
回车之后再输入:D:
然后回车,就转到了所在目录
再输入debug即可运行debug程序(运行其他程序同理,因为之前我们就把它们放在了同一个目录下):
debug常用命令(不区分大小写)有:
r: 查看,修改 cpu寄存器中的内容;
d:查看内存中的内容
e:改写内存中的内容
u:将机器指令翻译成汇编指令
t:执行下一条汇编指令
a:以汇编的格式在内存中写入一条机器指令(写汇编指令)
其他指令请自行尝试,大胆尝试!(这里并不会损害我们自己的电脑)
这里有一个问题:每次我们打开dosbox,都需要写命令转到需要运行的程序的文件夹然后才能运行程序,很不方便。
我想要的是直接打开dosbox,直接输入程序名即可运行。
所以我们就需要修改一下dosbox的配置,
在dosbox安装目录中,找到如下图选中的这个文件
用记事本打开这个文件(双击会默认用记事本打开),
在文件结尾写入并保存:
MOUNT D D:\Debug
D:
现在打开dosbox,直接输入程序名就可以运行程序了。
3. 其他
debug:调试程序(数据默认就是十六进制,不需要加h)
masm:编译程序
link:链接程序
dosbox:终端运行程序
对于debug和masm,link这三个程序的切换,
在运行debug的时候,输入quit
或q
可退出运行debug,
从而可以输入其他程序名来运行其他程序.
但是对于masm和link要退出,目前我不知道有什么退出命令,
我的做法是,随便输入一个字母,按几下下回车即可。(或者关闭重新打开dosbox,再输入其他程序名)
0x03 写汇编程序实例
1. 小型汇编程序:
可以用debug写。
(但是一般还是用记事本或Notepad++等编辑软件写好,然后在dosbox下编译链接运行。debug一般都是用来调试的。)
下面用debug写一个简单的程序:
输入u可以查看汇编指令
输入t 即可执行一条汇编指令,然后可以观察寄存器的变化
执行完可以看到AX = 6
2. 比较大型的汇编程序:
用记事本或Notepad++写好,然后在dosbox下编译链接运行.
比如写一个:计算2^8的程序:
在debug,masm,link…所在目录下(这样编译运行的时候就直接可以写文件名,而不用写具体路径)新建文件2_8.asm,
用记事本打开,写入:
assume cs:code
code segment
mov ax,2
mov cx,8
s: add ax,ax
loop s
mov ax,4c00h
int 21h
code ends
end
保存。
然后打开dosbox。
编译,输入:
masm 2_8.ASM
(这里是标准的文件,.ASM可以不加文件类型后缀,如果是txt,则需要加上文件类型后缀.txt)
如果要给编译得到的文件重命名则在Object fileName后输入文件名,
否则直接回车,一路回车。
编译后会得到一个.OBJ文件:
链接,输入:
link 2_8
一路回车。。
最终得到了一个可执行文件:2_8.EXE
直接在dosbox中输入:
2_8.EXE
执行,执行完成,屏幕并不会显示什么,因为并没有写输出相关的指令(汇编输出有点麻烦,要把16进制结果进行转换,现在就是熟悉一下编程环境)。
现在只能使用debug来追踪程序指令的执行。
输入:
debug 2_8.EXE
输入r,可以查看当前寄存器的情况,
输入u,可以看到我们的汇编指令已经加载入了内存中。
然后就是t,单步执行指令了。
可以使用:g 偏移地址来一跳过我们不想追踪的部分,如下图,
0006之前的已经执行完了,即0006以前的指令看上去“一步就执行完了”.
我们继续输入t,就可以追踪循环部分。
0x04
…汇编输出真TM麻烦(不过,为了 代码了解底层实现 还是需要好好学。。)
来一个简单的“Hello world!”输出吧:
不解释,多看书~