汇编语言实验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

QQ截图20200528143652

​ R命令同样还可以改变寄存器的值,R 寄存器名 会显示对应寄存器的值,并且让输入新值,即可改变

QQ截图20200528144310

D命令

​ 用来查看内存当中的内容,以16进制的格式显示。有三种使用格式

​ 1直接输入D,继续显示之前d命令后面的内容,若前面没使用d命令,则显示cs:ip对应地址开始的128个内存单元的内容

QQ截图20200528144650

​ 左边是地址,中间是16进制的内容 右边是对应的ascii码

​ 2使用 D 段地址:偏移地址的形式显示指定地址后的128个内存单元,可以用寄存器如D DS:0

E命令

​ E命令用来修改内存中的内容,方式为 E 起始地址 数据 数据 。。。

QQ截图20200528145521

​ 也可以直接E 起始地址 然后一个一个输入数据

QQ截图20200528145708

​ E命令中的数据可以是 ‘字符’ 或者“字符串” 如 E 起始地址 “nmsl” 是可行的

QQ截图20200528150011

U命令

​ U命令是查看内存中的内容对应的汇编指令,使用的形式和D命令一样 可以直接用U也可以U 段地址:偏移地址

QQ截图20200528150332

​ 可以看到,字符串”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)

QQ截图20200528151007

QQ截图20200528151027

​ 并使用d命令和u命令检查,修改成功

​ 使用R命令 查看当前ax为0

QQ截图20200528151133

​ 使用R命令 修改cs ip 指向 1000:0,再用r命令确认修改成功,同时注意到提示cs ip指向的1000:0对应的汇编指令是mov ax,0001

QQ截图20200528151245

​ 使用t命令执行,ax已经被改变成0001,同时发现ip由0增加成3指向下一条指令 add [bx+si],al

QQ截图20200528151323

A命令

​ A命令直接向指定的内存单元逐条写入汇编指令,使用方法为A 起始地址 汇编指令

QQ截图20200528151757

​ 注意该10是16进制的10h。debug程序默认都是16进制

0x02 实验任务

QQ截图20200528152048

QQ截图20200528152358

​ 该实验中主要是注意最高位发生进位时会丢弃进位

QQ截图20200528152647

​ 如第六条 add ax,ax时

QQ截图20200528153020

​ 第一次执行t ax变为1 ip指向3也就是第二条语句

​ 第二次执行t ax变为2 ip指向5,也就是第三条语句

​ 第三次执行t ax不变 ip先指向7,执行完后指向3,也就是第二条语句(注意任何一条语句被取指后ip都会自动改变,jmp执行完后又会改变)

QQ截图20200528153332

QQ截图20200528153449

​ 应该是地址空间中,有些地址是只读的,所以写入无效