兜兜零元 发表于 2024-12-22 21:01:10

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

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

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

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

字节是内存操纵的最小单位,但是
位才是计算机操纵的最小单位
•电子器件二极管
•正向加电则通,反向加电则差别
https://bpsend.net/notesimg/1651839511904-7fede3d3-589c-42e9-88c2-edef42132514.png
•门电路
https://bpsend.net/notesimg/1651839733379-ff9fd706-6933-4a06-b1b0-99b7a9940fea.pnghttps://bpsend.net/notesimg/1651839773278-abe95de1-a5f7-4ca0-a079-16baf8a1b56b.png
https://bpsend.net/notesimg/1651839836688-b9d805af-d263-44a6-85af-89d4b4110b35.png
 


[*]因为二进制是最简单的计算,所以二进制的计算非常快,CPU的处置惩罚是通过算术/逻辑 单位 ALU 来处置惩罚数据的。
例如:

[*]+ 可以通过位于运算获取结果。
https://bpsend.net/notesimg/1651840885827-b0435fa1-df1e-4cac-99c0-c58be0cf734f.png
用法:
https://bpsend.net/notesimg/1651840904799-d55f0422-41bd-4580-a9fb-86a93ad6f73b.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)DosBox常用指令

= 大概
指令作用用法?帮助文档-?U反汇编(把呆板码变成助记符)-u,-u****A输入汇编指令a R检察和修改寄存器r D检察内存单位d E修改内存单位e addrG直接运行相当于 F5T单步步入相当于 F11P单步步过相当于 F10写入文件(n,cx,w)将内存数据保存到文件-n "文件名"-r cx 20 (字节数)-w 开始地址(没有默认为100)Q退出 https://bpsend.net/notesimg/1651863936713-a35449fd-1f6e-4681-8d5f-e3ed0db9ea58.png
https://bpsend.net/notesimg/1651864588002-a4c3d88b-cc37-4f9c-8512-b61f2fe7ec6a.png
a 后面如果跟地址,代表从该地址开始写汇编代码,不跟则默认从ip地址开始写,写完一行按回车确认,全部写完空行回车
https://bpsend.net/notesimg/1651864778985-0d72cd4c-1095-4760-a590-bab01410f095.png
R 后面跟寄存器代表可以修改寄存器的值
https://bpsend.net/notesimg/1651864924090-0173dae2-13e5-4218-a7a1-ec49b1e26f9e.png
https://bpsend.net/notesimg/1651865025904-db429166-b6cb-49dc-9f0c-c486cf3aa7a5.png
e后面跟地址代表修改该处内存的值,按空格 表现 继承修改后面的,按回车表现修改竣事
e addr
https://bpsend.net/notesimg/1651865318640-59aef5dc-8d45-4006-8ddc-8ebeafe9741a.png
e addr "字符串"
https://bpsend.net/notesimg/1651865476791-23fcb364-1c37-4498-b482-060f5ca590f9.png
https://bpsend.net/notesimg/1651865755190-3a846534-dafe-43ad-823b-f4faa14059bc.png
https://bpsend.net/notesimg/1651865867474-6cf13c36-9ec7-40cf-8f7e-44a119727d68.png
https://bpsend.net/notesimg/1651867005362-17ab315e-8253-43b8-bfa3-d04a3f980e56.png
注意: 保存数据是从 地址 100 开始的,跟ip地址的值无关,如果要向指定开始位置,w 后面加 开始地址
https://bpsend.net/notesimg/1651867252388-72a78d85-c497-4f98-9860-b6c0f27aaf72.png
标记寄存器

常用的是 ZF 和 DF
https://bpsend.net/notesimg/1631847954912-d71fb7dd-520a-4904-a09a-f58a4892f05e.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 进位标记

#include <stdio.h>

int main()

{

printf(“hello world\n”);

}https://bpsend.net/notesimg/1651869047425-c9d0cd06-774e-4b9a-9a84-5805534141e6.png
https://bpsend.net/notesimg/1651869660147-54de3559-386a-4063-951c-982b99a6273b.png
零标记ZF

mount C: G:\asm16
C:https://bpsend.net/notesimg/1651869814916-85d894ee-4ee3-4fcc-b2f7-a8cb7b398b4d.png
https://bpsend.net/notesimg/1651869977252-2baf7ec1-3ff7-405b-99c7-ae1c76b1ab74.png
溢出标记OF

溢出只发生在 正数+正数 负数+负数 负数- 正数 正数-负数 的情况
#cd\ ——首先要用cd\ 退回到根目录C>下
#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)https://bpsend.net/notesimg/1651870719132-3e06fb2b-54d2-437e-9127-4ee1da1f7b90.png
https://bpsend.net/notesimg/1651870912936-909b3f39-58bd-4716-bb9e-c22fd79e2b20.png
进位和溢出

当运算结果的最高有效位有进位(加法)或借位(减法)时设置。
进位标志置1,即CF = 1;否则CF = 0
用途:用于表示两个无符号数高低。
举例:
3AH + 7CH=B6H,   没有进位:CF = 0   NC
AAH + 7CH=(1)26H,有进位:CF = 1   CY符号标记SF

若运算结果为0则ZF=1,否则ZF=0。
用途:用于表示两个无符号数高低。
举例:
3AH + 7CH=B6H,结果不是零:   ZF = 0    ZR
84H + 7CH=(1)00H, 结果是零:ZF = 1    NZhttps://bpsend.net/notesimg/1651871956916-8537c927-35e0-43e2-b11b-ab0641fe32b3.png
https://bpsend.net/notesimg/1651872109828-b1141dc2-d5c3-4759-96fd-35e83b509f39.png
奇偶标记位PF

使用该标志位判断运算结果是否溢出。(当将操作数作为有符号数时)
加法:若同符号数相加,结果的符号与之相反则OF=1,否则OF置0。
减法:被减数与减数异号,而结果的符号与减数相同则OF=1,否则置0。
发生了溢出,说明了运算结果不可信。
3AH + 7CH=B6H,   产生溢出:OF = 1   OV
AAH + 7CH=(1)26H, 没有溢出:OF = 0   NVhttps://bpsend.net/notesimg/1651872308411-1896fdc5-712f-4b30-bb87-9400932e3420.png
https://bpsend.net/notesimg/1651872511799-b0d2a4d0-7857-43f6-b328-f9d3461ab5d3.png
辅助进位标记位AF

进位CF 针对的是无符号数运算,溢出OF 针对的是有符号数运算。
当看成无符号数,则关注CF标志,看成有符号数,则关注OF标志。

cpu运算时,不管数据是有符号还是无符号,它运算完,会当作有符号数设置 CF 位,也会当作无符号数设置 of 位,即2个操作位都会设置, 至于最后看哪个位要根据我们的业务逻辑自己去选择https://bpsend.net/notesimg/1651872847728-41c34943-79dd-48b7-a422-91cb5c5daf48.png
https://bpsend.net/notesimg/1651872950494-8106206e-2861-4d5b-ac55-45640c130d7f.png
标记位状态总结

.标记位标记名称FLASETUREOF溢出标记NVOVDF方向标记UPDNIF中断标记DIEISF符号标记PLNGZF零标记NZZRAF辅助进位标记NAACPF奇偶标记POPECF进位标记NCCYhttps://bpsend.net/notesimg/1652098077921-a1092bea-3907-4064-9ea3-8cdacbc233fd.png
在 debug中次序
https://bpsend.net/notesimg/1651874265884-b45d2630-ea0c-41ea-bdb6-35544f596a4a.png
OF[溢出 ] DF[方向] IF[中断] SF[符号] ZF[零] AF[辅助进位] PF[奇偶] CF[进位]

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 8086汇编(16位汇编)学习笔记01.汇编基础和debug使用