8086汇编语言学习目录
参考课程:CSDN贺利坚汇编视频课
参考书籍:汇编语言 王爽
衷心感谢老师们的耐心教导,课程和书籍都非常用心,内容十分详细,再次感谢老师们的贡献。
文章目录
前言
汇编语言保持了机器语言的优点,具有直接和简捷的特点,可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等,且占用内存少,执行速度快,是高效的程序设计语言。
一、实践环境搭建
根据附录里面的链接以及里面的帮助文档配置。
- 驱动器C已经挂载到本地目录d:\masm:在dos中用到的C盘,实际上对应的是当前目录上的d盘的MASM文件夹(从解压包拷贝的)
mount c d:\masm
- c: 转换到C盘工作,dir是查看当前目录中的文件和文件夹
c:
二、debug的使用
1. 启动debug
挂载
mount c d:\masm
进入到C盘
c:
查看
dir
启动debug
debug
2. R命令
查看寄存器(R命令)
r
选择某个寄存器,并修改地址
ax
1234
rax与r ax涵义一样
3. D命令
列出预设地址内存处的128个字节的内容(D命令)
d
查看内存中指定地址处的内容
d 2000:0000
列出内存中指定地址范围内的内容
d 2000:0 f
为段地址:偏移地址
- 再次敲d,偏移量继续往下走,每一次都列出128个字节,一行是16个字节,一共是8行
还能指定找某个地址,如2000:0000
- 最后再加上结尾偏移地址,一次可以显示若干个,如f,即0-f共有16个数据;如2f,是48个数据
4. E命令
改变内存中的内容(E命令)
e 2000:0000 12 34 56 AB 3F F3
逐个询问式修改; 空格 - 接受,继续; 回车 - 结束
e 2000:0 12:61 34:41
12 34都是16进制数
逐个询问修改,空格是继续,回车是结束
5. U命令
将内存中的机器指令翻译成汇编指令(U命令)
先写入数据(不区分大小写)
e 2000:0 b8 23 01 bb 03 00 89 d8 01 d8
查看
d 2000:0 f
查看汇编代码
u 2000:0
将机器指令转换为汇编指令
6. A指令
以汇编指令格式在内存中写入机器指令
查看寄存器
r
写入汇编指令
a 073f:100
mov ax,0123
mov bx,3
mov ax,bx
add ax,bx
查看数据
d 073f:100
查看代码
u 073f:100
U查看代码
7. T命令
cs是073f,IP是0100的时候,执行的是上面的代码,还能用rip修改ip
查看寄存器
r
修改IP
rip
0000
查看寄存器
r
用t执行指令
t
用t执行指令
8. q命令
退出debug
q
总结
以上就是今天要讲的内容,本文仅仅简单介绍了debug的使用,而使用debug可以查看CPU各种寄存器中的内容、内存的情况,并且在机器指令级跟踪程序的运行。
附录
寄存器
216-1为FFFFH
H为16进制,D为10进制,B为2进制
AX十六位的可以看成两个八位的,AH高八位和AL低八位
mov和add指令
ADD与add是同义的
8266H+8266H=1044CH
但是图中为044CH,是因为溢出问题,1超出4位(16进制)了,没法保存,即汇编中存在溢出问题
ax,bx都是16位,ah,bh都是高八位,al,bl都是低八位
C5H+93H=158,但是图上为58H,1溢出了,不能进到高位去,因为al是一个八位的寄存器,两个八位作为字节的相加,结果是58,产生的进位被丢掉
物理地址
- 物理地址是5位的16进制数,对应的是20位的2进制,如A0000
- 20根地址总线,寻址能力是1M,10的20次方是1M
- 16位地址意味寻址能力是64KB,本身寻址能力有1M这么大,中间这个巨大的差异矛盾该如何解决?
用两个16位的地址(段地址、偏移地址)合成20位的物理地址
- 段地址x16是左移4个二进制位,即x16,左移一位是乘以2,左移四位就是x16,就是已经凑成20位了,再把偏移地址加上,最后得到的值就是物理地址了
- 如上图所示的例子,四位十六进制数,左移一位,相当于二进制左移四位,再加上偏移地址00C8,得到物理地址123C8,即两个16位的地址合成20位的地址。
两个16位地址,经过加法器运算后,得到20位地址,最后到达内存完成寻址
不同的段地址,经过调整偏移地址后,可以得到相同的物理地址。
内存的分段表示法
- 内存本身并不分段,内存本身的逻辑地址空间是连续的,段的划分是CPU干的事情
- 段地址x16,最后一位一定是0,是16的倍数
- 2的16次方位64K
某个单元位置表示
段地址:偏移地址
,如2000:1F60
,多用于书面语