找回密码
 立即注册
首页 资源区 代码 8086汇编(16位汇编)学习笔记01.汇编基础和debug使用 ...

8086汇编(16位汇编)学习笔记01.汇编基础和debug使用

篙菠 前天 18:30
原文链接:
https://bpsend.net/thread-100-1-2.html
 
 
 
 
 
为什么学习16位汇编?

16位操作指令最多能够操作两个字节,且更能够体现出与硬件的交互。16位下的指令和32位汇编的指令差不多。16位汇编的指令在32位一样使用.要学好汇编必须要了解一点点硬件知识,16汇编是直接操作硬件,32位汇编指令跟硬件隔离了
硬件运行机制

1. 为什么计算机的操作数据的单位是二进制?

字节是内存操作的最小单位,但是
位才是计算机操作的最小单位
•电子器件二极管
•正向加电则通,反向加电则不同
1.png

•门电路
2.png
3.png

4.png

 


  • 因为二进制是最简单的计算,所以二进制的计算非常快,CPU的处理是通过算术/逻辑 单元 ALU 来处理数据的。
例如:

  • + 可以通过位于运算获取结果。
5.png

用法:
6.png

算术运算的结果是通过位运算得到得
加法

结果 进位
0 + 1 = 1 0
0 + 0 = 0 0
1 + 0 = 1 0
1 + 1 = 0 1
结果 - 异或
进位 - 位与
减法

加补码
乘法


3 * 5 = 3 * (4 + 1) = 34 + 31 = 3 下#dir ——显示文件列表#md hb ——建立hb子目录#cd hb ——进入hb子目录#copy d:\dos\masm.exe c:\hb ——将D盘dos目录下的masm.exe拷贝到C盘hb目录下#copy d:\dos\link.exe c:\hb ——将D盘dos目录下的link.exe拷贝到C盘hb目录下#cd .. ——退回到上一级目录#del \hb\masm.exe ——删除hb子目录中的某文件#rd hb ——删除hb子目录(子目录中的所有文件必须先删除)#e:——进入e盘#cls ——清屏#type——显示文本文件内容(如type c:\hb\abc.asm)[/code]DosBox常用指令

[range] = [startaddr] [endaddr] 或者 [startaddr]
指令作用用法?帮助文档-?U反汇编(把机器码变成助记符)-u,-u**[range]**A输入汇编指令a [addr]R查看和修改寄存器r [reg]D查看内存单元d [range]E修改内存单元e addrG直接运行相当于 F5T单步步入相当于 F11P单步步过相当于 F10写入文件(n,cx,w)将内存数据保存到文件-n "文件名"-r cx 20 (字节数)-w 开始地址(没有默认为100)Q退出 
7.png

8.png

a 后面如果跟地址,代表从该地址开始写汇编代码,不跟则默认从ip地址开始写,写完一行按回车确认,全部写完空行回车
9.png

R 后面跟寄存器代表可以修改寄存器的值
10.png

11.png

e后面跟地址代表修改该处内存的值,按空格 表示 继续修改后面的,按回车表示修改结束
e addr [val1 逗号|空格 val2 逗号|空格 val3 。。。]
12.png

e addr "字符串"
13.png

14.png

15.png

16.png

注意: 保存数据是从 地址 100 开始的,跟ip地址的值无关,如果要向指定开始位置,w 后面加 开始地址
17.png

标志寄存器

常用的是 ZF 和 DF
18.png

条件标志:


  • **CF 进位标志:**用于反映运算是否产生进位或借位。如果运算结果的最高位产生一个进位或借位,则CF置1,否则置0。运算结果的最高位包括字操作的第15位和字节操作的第7位。移位指令也会将操作数的最高位或最低位移入CF。
  • **PF 奇偶标志:**用于反映运算结果低8位中“1”的个数。“1”的个数为偶数,则PF置1,否则置0。
  • AF 辅助进位标志**:**算数操作结果的第三位(从0开始计数)如果产生了进位或者借位则将其置为1,否则置为0,常在BCD(binary-codedecimal)算术运算中被使用。
  • **ZF 零标志:**用于判断结果是否为0。运算结果0,ZF置1,否则置0。
  • **SF 符号标志:**用于反映运算结果的符号,运算结果为负,SF置1,否则置0。因为有符号数采用补码的形式表示,所以SF与运算结果的最高位相同。
  • **OF 溢出标志:**反映有符号数加减运算是否溢出。如果运算结果超过了8位或者16位有符号数的表示范围,则OF置1,否则置0。
控制标志:


  • **TF 跟踪标志:**当TF被设置为1时,CPU进入单步模式,所谓单步模式就是CPU在每执行一步指令后都产生一个单步中断。主要用于程序的调试。8086/8088中没有专门用来置位和清零TF的命令,需要用其他办法。
  • **IF 中断标志:**决定CPU是否响应外部可屏蔽中断请求。IF为1时,CPU允许响应外部的可屏蔽中断请求。
  • **DF 方向标志:**决定串操作指令执行时有关指针寄存器调整方向。当DF为1时,串操作指令按递减方式改变有关存储器指针值,每次操作后使SI、DI递减。
CF 进位标志
  1. #include <stdio.h>
  2. int main()
  3. {
  4. printf(“hello world\n”);
  5. }
复制代码
19.png

20.png

零标志ZF
  1. mount C: G:\asm16
  2. C:
复制代码
21.png

22.png

溢出标志OF

溢出只发生在 正数+正数 负数+负数 负数- 正数 正数-负数 的情况
  1. #cd\ ——首先要用cd\ 退回到根目录C>下
  2. #dir ——显示文件列表
  3. #md hb ——建立hb子目录
  4. #cd hb ——进入hb子目录
  5. #copy d:\dos\masm.exe c:\hb ——将D盘dos目录下的masm.exe拷贝到C盘hb目录下
  6. #copy d:\dos\link.exe c:\hb ——将D盘dos目录下的link.exe拷贝到C盘hb目录下
  7. #cd .. ——退回到上一级目录
  8. #del \hb\masm.exe ——删除hb子目录中的某文件
  9. #rd hb ——删除hb子目录(子目录中的所有文件必须先删除)
  10. #e:——进入e盘
  11. #cls ——清屏
  12. #type——显示文本文件内容(如type c:\hb\abc.asm)
复制代码
23.png

24.png

进位和溢出
  1. 当运算结果的最高有效位有进位(加法)或借位(减法)时设置。
  2. 进位标志置1,即CF = 1;否则CF = 0
  3. 用途:用于表示两个无符号数高低。
  4. 举例:
  5. 3AH + 7CH=B6H,     没有进位:CF = 0     NC
  6. AAH + 7CH=(1)26H,有进位:  CF = 1     CY
复制代码
符号标志SF
  1. 若运算结果为0则ZF=1,否则ZF=0。
  2. 用途:用于表示两个无符号数高低。
  3. 举例:
  4. 3AH + 7CH=B6H,结果不是零:   ZF = 0    ZR
  5. 84H + 7CH=(1)00H, 结果是零:ZF = 1    NZ
复制代码
25.png

26.png

奇偶标志位PF
  1. 使用该标志位判断运算结果是否溢出。(当将操作数作为有符号数时)
  2. 加法:若同符号数相加,结果的符号与之相反则OF=1,否则OF置0。
  3. 减法:被减数与减数异号,而结果的符号与减数相同则OF=1,否则置0。
  4. 发生了溢出,说明了运算结果不可信。
  5. 3AH + 7CH=B6H,     产生溢出:OF = 1     OV
  6. AAH + 7CH=(1)26H, 没有溢出:OF = 0     NV
复制代码
27.png

28.png

辅助进位标志位AF
  1. 进位CF 针对的是无符号数运算,溢出OF 针对的是有符号数运算。
  2. 当看成无符号数,则关注CF标志,看成有符号数,则关注OF标志。
  3. cpu运算时,不管数据是有符号还是无符号,它运算完,会当作有符号数设置 CF 位,也会当作无符号数设置 of 位,即2个操作位都会设置, 至于最后看哪个位要根据我们的业务逻辑自己去选择
复制代码
29.png

30.png

标志位状态总结

.标志位标志名称FLASETUREOF溢出标志NVOVDF方向标志UPDNIF中断标志DIEISF符号标志PLNGZF零标志NZZRAF辅助进位标志NAACPF奇偶标志POPECF进位标志NCCY
31.png

在 debug中顺序
32.png

OF[溢出 ] DF[方向] IF[中断] SF[符号] ZF[零] AF[辅助进位] PF[奇偶] CF[进位]

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册