前言
写在前面,学习汇编有15周了,今天终于考完试,结束了调试、上机、debug、复习、查资料的ku bi日子,但是现在确实比较怀念的,这过程中真的踏了不少坑,遇到不懂的就得自己查论坛、查博客,直到搞懂为止,非常感谢有些博客整理的很仔细,我也才明白了写博客的重要性,利人的同时更利己,所以我想把自己这些天琢磨的汇编中的难于理解的或较为重要的知识(keng)总结一下,不正确的地方还请指正。
也没有什么顺序,就是自己感觉领悟的还可以的指令、程序等的总结。
溢出和进位
溢出
关于溢出和进位的理解还是比较难的,具体就是对状态标志位OF和CF的影响。
先来说一个概念,溢出是针对有符号数而言的,进位对于无符号数才有意义,很多文章都对这一点没有清晰的概念。
那什么情况下算溢出呢?
我们把二进制的8位分别称作D7,D6,D5``````D0,则只有在D6向D7进位和D7向前一位进位两种情况有且仅有一种发生时,才会发生溢出,也可以说当情况1和情况2的异或等于1时才会溢出。
下面来举个例子:
3+5=8 无溢出
因为没有次低位和最高位的进位,故无溢出。
125+5=130 有溢出
有D6 向D7的进位,而没有D7的进位,故有溢出。
-64+65=1 无溢出
D6和D7均有进位,则异或为0,同样没有溢出。
当然还有一种情况是有D7的进位而没有D6进位的,也属于溢出。
进位
而进位是指:比如两个无符号8位数进行运算时其结果为9位二进制数(有一位是进位位CF),两个8位的二进制数相加不可能超过9位的,因而不存在溢出,只有进位。
而当判断两个有符号数相减时的溢出情况时,只需判断次高位和最高位是否有借位即可
例如:
只有最高位有借位,所以溢出。
有关中断
涉及到了中断、中断向量、中断向量表的知识,下面来借用一张PPT说明
上图就非常清楚的把三者之间的关系说明白了,1号中断向量的地址就是00004H~00007H,在这个地址内存放的就是中断向量CS:IP(4000H:3006H),根据这个中断向量,CPU就能找到所要执行的中断服务子程序的入口地址在哪儿了。
有关8255A编程
这里就不再对课本上长谈的控制字等解释了,通过一些编程的题目就能对其基本的原理掌握,
1.如下所示,现将8255A的B口作为传送字符的通道,工作于方式0,输出方式,A端口未用,端口C也工作于方式0,PC0作为BUSY信号的输入端,PC7作为STB信号的输出端,负脉冲时外设才能接受一个数据,设8255A的端口地址为C0H—C6H,试对8255A进行初始化编程,并写出通过查询方式把CL中的内容向打印机传送一次数据的程序段。
MOV AL, 81H
OUT 0C6H, AL
MOV AL, 00001111B
OUT 0C6H, AL
LPST:
IN AL, 0C4H ;查询BUSY口
TEST AL, 01H ;
JNZ LPST
MOV AL, CL ;数据输出B口
OUT 0C2H, AL
MOV AL, 00001110B ;启动脉冲,PC7置为负脉冲使STB端口有效
OUT 0C6H, AL
INC AL
OUT 0C6H, AL
2.CPU通过8255A的B口(采用简单I/O工作方式)向打印机传送100个字符,这些字符在内存中的起始地址为0100:1000H,共100个字节。8255A的端口地址为400~403H,连接示意图如图所示。
mov dx, 403H (1分)
mov al, 10000001b(或者81h) (1分)
out dx, al ;初始化8255A的方式选择控制字,设定工作模式
mov al, 00001101b(或者0DH) (1分)
out dx, al ;向STB引脚发送高电平
mov ax, 0100H (0.5分)
mov ds, ax
mov si, 1000H (0.5分)
mov cx, 100
lp: mov dx, 402H (1分)
in al, dx ;读取PC3的状态
and al, 08H (1分)
jnz lp ;如果PC3为高电平,表示打印机还未处理完毕,需等待
mov dx, 401H (1分)
mov al, [si]
out dx, al ;将要打印的字符内容通过B口输出至打印机
mov dx, 403H (1分)
mov al, 00001100b(或者0CH) (1分)
out dx, al
nop
nop
mov al, 00001101b(或者0DH) (1分)
out dx, al ;在PC6上发出一个负脉冲后,然后回到高电平状态
inc si
dec cx
jnz lp
最后
文章部分参考了zqm201及神思love两位博主的文章,详细可参看
神思love
zqm201
这三方面是最初开始学理解自己理解错误的知识点,可能我只是把当初困扰自己的坑说了出来,供大家参看吧(感觉总结的一般呜呜呜)