汇编工具包提取:链接:https://pan.baidu.com/s/1gzzW96a1l4vjxY1H03X_Bw?pwd=8888
提取码:8888
--来自百度网盘超级会员V5的分享
数据传输指令
- MOV(指令)
- XCHG(指令)
- XLAT(换码指令)
- PUSH、POP(堆栈指令)
- LEA(地址传送指令)
- LDS(地址传送指令)
- LES(地址传送指令)
- 标志寄存器(SF,ZF,PF,CF,OF,AF,TF,IF,DF)
- 标志寄存器传送指令(LAHF、SAHF、PUSHF、POPF)
- 输入输出指令 (IN、OUT)
MOV指令
作用:把一个字或者直接的操作数从源地址传送到目的地址(简单理解为赋值)
-------------------------------------------------------------------------------------XCHG指令
作用:将一个字节或者自己的源操作数和目的操作数相交换(用来交换值)
--------------------------------------------------------------------------------------------------------------------------------
XLAT换码指令
作用:将bx指定的缓冲区、AL指定的位移处的一个字节数据取出赋值给AL
--------------------------------------------------------------------------------------------------------------------------------
PUSH、POP堆栈指令
作用:将寄存器或者储存器中的数据按照堆栈操作的规则进行出入栈(将操作数压入压入栈和出栈)
--------------------------------------------------------------------------------------------------------------------------------
LEA地址传送指令
作用:将对应的地址表示送入对应的寄存器中
-------------------------------------------------------------------------------------------------------------------------------
LDS地址传送指令
内存的值已经送到了DX那里,但是不太清楚DS的值为何从073F变到A73E的具体操作?
有意向的大佬,可以在评论区或者私信里讨论一下!
------------------------------------------------------------------------------------------------------------------------------
LES地址传送指令
内存的值已经送到了DX那里,但是不太清楚ES的值为何从073F变到A73E的具体操作?
有意向的大佬,可以在评论区或者私信里讨论一下
-------------------------------------------------------------------------------------------------------------------------------
标志寄存器汇总
标志位图解
下面这个图还有上面那张 是必须要知道的,不然后面的标志器地址传送指令一定会搞不懂,亲身经历啊!!!
-------------------------------------------------------------------------------------------------------------------------------
1、SF:符号标志位,如果执行结果为负数,则SF=1,非负则SF=0
2、ZF:零标志位,如果执行结果为0,则ZF=1,否则ZF=0
3、PF:奇偶标志位,如果执行结果中所有二进制位中1的个数为偶数则PF=1,否则PF=0
提示:ax:00100010 bx:00000000 -> ax+bx=00100010 这里1的个数是2(偶数)
4、CF:进/借位标志位,一般来说,在进行有符号的运算时,如果数据最高位产生了 有符号数的运算涉及符号的处理。进位或者借位CF=1,否则CF=0
提示:ffff由于最高位都是1,相加时会进位(这里的进位具体指的就是1+1)
提示:借位的话,一般都是小数减大数的时候会发生。低位减的时候不够了,向高位去借位的情
5、OF:溢出标志位,运算结果超出了机器所能表示的范围称为溢出 无符号数的运算忽略了符号的处理,仅关注数值的大小8位有符号数,机器所能表示的范围是-128 - 127;16位有符号数,机器所能表示的范围是-32768-32767;(比较计算后的十进制数,即可)
大于时溢出
小于时不溢出
在我用ffff加ffff或者其他字母加的时候,理论上大于了也会溢出,但是不知道为什么没有溢出?而我用数字相加的时候,只要超出范围就会溢出。知道的大佬可以一起讨论一下!(应该是没有超出无符号数的范围)
6、AF:辅助进位标志位,运算过程中看第三位,不论长度多少。如果最后四位向前有进位/借位,AF=1,否则AF=0;
11111111 这里是第三位有进位(进位就是1+1)
00001000
11111111 这里是:如果最后四位向前有进位/借位AF=1,否则AF=0;
10000001
7、TF:调试标志位,当TF=1时,处理器每次只执行一条指令,即单步执行;(这里具体指的就是我们单步调试的时候)
8、IF:中断允许标志位,用来控制8086CPU是否可以接受外部中断请求。IF=1,则能响应外部中断,否则屏蔽外部中断; 【这个默认就是有的(开启的) 通过上述的图片都可以看出来。主要是用在对外部设备进行汇编调试的时候】
9、DF:方向标志位,在串处理指令操作后控制DI、SI的增减,如果DF=0,则前述寄存器递增,否则递减,注意DF的值由程序员通过CLD(0)和STD(1)指令设定;(一般用在循环中)
-------------------------------------------------------------------------------------------------------------------------------
通过上述图片,记住-标志寄存器的低八位-和AX高8位(AH)
1、LAHF标志寄存器传送指令
该复制的标志位复制上去,其余的不用动(按照这里,简单来说就是就是把3,5位置上的0照搬下来)
0000 0000
1101 0111
D7:1101 0111
2、SAHF标志寄存器传送指令
99H:1001 1001 并给到标志寄存器所对应位置上面
3、PUSHF和POPF标志寄存器传送指令
先把标志寄存器设置好。
2D7的二进制数
0010 1101 0111
后面低8位原理向上面一样。第九位其实就是IF。最后,进栈再出栈
-------------------------------------------------------------------------------------------------------------------------------
输入输出指令 IN、OUT
这个其实就是根据外设的端口去获取一些外设的信息。我用DOSBOX可以成功。emu8086好像还要转ascill码,这个大家后续可以去研究一下。(端口很多,大家都可以去了解一下!)
BCD码
BCD码:主要是用一些二进制数进行拼接
70H和71H解释
获取当前日期的指令操做
原理:给al一个可以拿到外设日期的端口。然后放到70H中去访问。最后通过71H拿到数据
原理
这就是通过地址总线寻址,然后通过数据总线传输,最后通过控制总写读取和写入
-------------------------------------------------------------------------------------------------------------------------------
补充
这里是拿2B(2字节数)举的例子
有符号数空间范围:-2^15到2^15 -1 (原因:正负各一半)
无符号数空间范围:0到2^16 -1 (原因:由于没有负数,所以不用分一半)
-------------------------------------------------------------------------------------------------------------------------------