汇编语言实验1查看CPU和内存,用机器指令和汇编指令编程
汇编语言实验1查看CPU和内存,用机器指令和汇编指令编程
0x00 预备知识
debug程序,用来调试8086程序的调试工具,该工具需要运行在16位的ms-dos系统中。win10系统已经不附带,所以需要安装dosbox,提供dos环境。8086程序有三种运行模式,实模式,保护模式和虚拟8086模式,区别在于能否自有访问所有地址空间,主要是有无操作系统从中作梗。
安装好dosbox后,将debug.exe masm.exe link.exe(后面两个分别是编译和连接工具)都当道d:根目录下,在dosbox里输入mount c d:/ 将d盘挂载成虚拟dos的c盘 然后输入 c:/ 进入虚拟的c盘即可使用debug masm link 等命令。
0x01 debug具体用法
R命令
可以查看所有寄存器的值,并且会显示当前cs:ip对应的物理地址存放的内容以及该内容对应的汇编指令,下图中0483:0100处的内容是0000 对应的汇编指令是 ADD [BX+SI],AL
R命令同样还可以改变寄存器的值,R 寄存器名 会显示对应寄存器的值,并且让输入新值,即可改变
D命令
用来查看内存当中的内容,以16进制的格式显示。有三种使用格式
1直接输入D,继续显示之前d命令后面的内容,若前面没使用d命令,则显示cs:ip对应地址开始的128个内存单元的内容
左边是地址,中间是16进制的内容 右边是对应的ascii码
2使用 D 段地址:偏移地址的形式显示指定地址后的128个内存单元,可以用寄存器如D DS:0
E命令
E命令用来修改内存中的内容,方式为 E 起始地址 数据 数据 。。。
也可以直接E 起始地址 然后一个一个输入数据
E命令中的数据可以是 ‘字符’ 或者“字符串” 如 E 起始地址 “nmsl” 是可行的
U命令
U命令是查看内存中的内容对应的汇编指令,使用的形式和D命令一样 可以直接用U也可以U 段地址:偏移地址
可以看到,字符串”NMSL”四个字节机器码分别为 4E 4D 53 4C对应四条汇编指令 DEC SI DEC BP PUSH BX DEC SP
所以内存中的到底是数据还是指令,完全取决于我们怎么看待。
T命令
T命令用来执行一条或者多条指令,直接用T命令,即可执行CS:IP指向的指令
例如,我们先向1000:0处用E命令写入b8 01 00(对应汇编指令为 mov ax,01)
并使用d命令和u命令检查,修改成功
使用R命令 查看当前ax为0
使用R命令 修改cs ip 指向 1000:0,再用r命令确认修改成功,同时注意到提示cs ip指向的1000:0对应的汇编指令是mov ax,0001
使用t命令执行,ax已经被改变成0001,同时发现ip由0增加成3指向下一条指令 add [bx+si],al
A命令
A命令直接向指定的内存单元逐条写入汇编指令,使用方法为A 起始地址 汇编指令
注意该10是16进制的10h。debug程序默认都是16进制
0x02 实验任务
该实验中主要是注意最高位发生进位时会丢弃进位
如第六条 add ax,ax时
第一次执行t ax变为1 ip指向3也就是第二条语句
第二次执行t ax变为2 ip指向5,也就是第三条语句
第三次执行t ax不变 ip先指向7,执行完后指向3,也就是第二条语句(注意任何一条语句被取指后ip都会自动改变,jmp执行完后又会改变)
应该是地址空间中,有些地址是只读的,所以写入无效