win64位需要使用dosbox模拟32位环境。
可以使用:https://download.csdn.net/download/w55100/11057669
或者网上搜索别人的资源
Chapter2
实验1
debug启动
1.
-r 查看
-r ax 修改ax的值
AX成功修改为0100
同理可修改 cs,ip
2.
d 1000:0
段地址:偏移地址
表示查看内存'10000H'处的内容
d 000:5 9
表示 0000段,5到9
3.
e 0000:0 0 1 2 3 4 5 6 7 8 9
表示从0000:0开始,顺次把内存中的内容改成0,1,2,3,4,5,6,7,8,9
也可以用提问式
e 0000:10
表示从这个位置开始修改。
先是第一个单元08,'.'后面可以输入我们想要的值,按空格表示处理完当前字节,跳到下一个字节。
直接空格说明不对当前字节进行处理。
第二个字节处,我输入了'0a'。
Enter后结束e命令。
用d查看,发现0000:0010的第二个字节果然已经变成了'0a'。
也可以写入字符串
e 0000:10 1 "hello" 2 "everyone"
注意,字符串内似乎不能含有空格。
4.e输入机器码,u查看释义,t执行
e 1000:0 b8 01 00 b9 02 00 01 c8
此处有3条命令
b8 01 00
b9 02 00
01 c8
使用u 1000:0查看释义
得知分别代表
mov ax,0001
mov cx,0002
add ax,cx
所以可以看到,内存中的数据和代码没有任何区别,关键在于如何解释。
下面用t来执行我们输入的命令。
执行之前,要改一下 cs:ip的值,变成我们的1000:0
然后t执行,
执行完mov ax,0001 ,得到ax = 0001。
图中同时可以看到,cs:ip指向了下一条命令的地址1000:0003。
于是我们可以继续t执行,得到cx=0002。
同时cs:ip指向了下一个地址1000:0006。
继续t执行最后一条指令'add ax,cx',得到ax=0003。
4. 直接输入汇编指令。
前面是e输入机器码,我们现在用a写入汇编指令。
可以看到很神奇的,
mov ax的起始字节为B8
mov cx的起始字节为B9
mov bx的起始字节为BB
奇怪。
实验2
任务(1)
输入内存后逐条执行观察内存变化。略。
任务(2)
将下述三条指令写入2000:0,利用三条指令计算2的8次方。
mov ax,1
add ax,ax
jmp 2000:3
这其实就是个循环。不断回到2000:3,就是不断运算ax=2*ax。
设置好cs:ip之后,t一路执行下去即可。
任务(3)
PC主板上的ROM中写有一个生产日期,在内存FFF00H~FFFFFH的某几个单元中,请找到这个生产日期,并试图改变它。
(PS:如果读者对实验结果感到困惑,请仔细阅读第1章忠的1.15节)
输入 d fff0:00 ff
可以找到这个生产日期位于fff0:00f5~fff0:00fc。
也可以说是FFFF:5~FFF:C,这样看的更清楚一点。
使用上文说过的e输入字符串,即可修改。
然后懵逼了,怎么没有变啊?
又试了几次,发现还是没能修改。
想起上面的提示,回到1.15节。
发现只有00000~9FFFF是主存储器地址空间(RAM)。
A0000~BFFFF是显存地址空间,写入数据会被显示卡输出到显示器上。
C0000~FFFFF是各类ROM地址空间,写入数据是无效的,因为这等于改写只读存储器中的内容。
任务(4)
写入。
e B810:0000 01 01 02 02 03 03 04 04。
由上文可知,这是向显存地址空间写入数据,屏幕上会有相应改变。
成功看到一串彩色的乱码符号。