这周还是将汇编的一些东西学了一下,我是在图书馆找了一本汇编程序设计书,结合实验楼的在线实验教程做的。以下是我关于汇编一些模糊点和值得注意的点所作的笔记。
一.进位标志和溢出标志有何区别?
进位标志是针对无符号数运算的,如果两个无符号数进行加减运算
产生的进位或者借位,则置进位标志CF=1,否则置CF=0;
溢出标志是针对有符号数运算的,8位有符号数表示范围是-128--+127。如果两个有符号数的运算结果超出了这个范围,那么就产生了
溢出,置溢出标志OF=1,否则置OF=0。
处理器在对两个数进行运算时,按照无符号数求得结果,并相应设置进位标志CF,同时根据是否超出有符号整数范围设置溢出标志。应该利用哪个标志则有程序员自己判定。
并且有一点,如果是进行无符号运算,进位标志置1,加上进位标志后的结果是正确的,但是是进行有符号数运算,溢出标志置1时,运算结果不再正确。
二.关于字符扩展,即如何不改变数据的大小将数据的位数扩大?
对无符号数的扩展很简单,只要在前面加0就实现了位数扩展、大小不变,这就是零位扩展。
对有符号数的扩展则是根据符号位的状态扩展的各位都与符号位相同。这就是符号扩展。比如有符号数64H为正数,符号位是0,高位扩展成16位是0064H。再如:16位有符号数FF00H=(-256)为负数,符号位是1,那么它扩展成32位是FFFFFF00H(-256)。
也就是说:要想将一个数位数扩充但是不改变大小,其实很简单,根据上述方法判断就行了。即无符号数一律加0,有符号数就加符号位。
三.关于条件转移指令的原理
条件转移指令之前通常有CMP,TEST,加减运算,逻辑运算等影响标志位的指令,利用这些指令执行后的标志或其组合状态形成条件。
四.关于子程序调用
指令为CALL ,RET。CALL指令调用子程序时会将当前寄存器的状态入栈,然后再更改CS:IP使程序跳到子程序执行,子程序执行完后要回到主程序,只要获得离开主程序时,由CALL指令保存在堆栈中的指令地址即可。
5.关于中断
为什么要有中断:在程序运行时,必不可少的会遇到一些紧急情况,或者一些重要错误,当前程序应该能够暂停,处理器中止当前程序运行,转去执行处理这些紧急情况的程序。
什么是中断服务程序:当出现中断时,转去执行处理中断的子程序叫做中断服务程序性。
什么是断点:当前程序被中断的地方叫做“断点”,中断服务程序执行完毕后应该返回原来程序的断点,继续执行被中断的程序。
中断提供了又一种改变程序执行顺序的方法。
六.8086中断的分类:
1.外部中断:来自8086CPU之外的原因引起的程序中断,又可分为可屏蔽中断和非屏蔽中断。
2.内部中断:内部中断是由于8086CPU内部执行程序引起的程序中断。
内部中断 有四种情况:1,除法错中断,是指在执行除法指令时,若除数为0或者商超过了寄存器所能表达的范围,则产生除法错中断.
2,指令中断是指执行中断调用指令INT n就产生指令中断,也称为软件中断。
3,溢出中断是指在执行溢出中断指令INTO时,如果溢出标志OF=1,则产生溢出中断
4,单步中断是指若单步标志TF=1,则在每条指令执行完毕之后都会产生单步中断。
什么是可屏蔽中断?
就是该中断可以在CPU内部被屏蔽掉。即CPU可以控制是否引起该程序中断,标志寄存器的中断允许标志IF就是用来控制可屏蔽中断的。
什么是关中断状态?
在系统复位后,任何一个中断服务程序被执行后,以及执行关中断指令CLI后,都使IF=0,这是CPU不让可屏蔽中断中止程序的情况。
什么是开中断状态?
和关中断状态相对应,当IF=1时,可屏蔽中断被CPU允许可以中断程序的情况叫做开中断状态。
七.关于8086的乘法指令MUL和IMUL:
指令格式:
mul r8/m8
mul r16/m16
imul r8/m8
imul r16/m16
为什么乘法涉及两个数,却只有一个操作数?
因为乘法指令有一个隐含操作数AX和DX,源操作数显示给出。如果源操作数是8位,则AL与其相乘得到16位的字保存在AX中,如果源操作数是16位,那么AX与其相乘得到32位结果保存在DX.AX中。
关于除法指令:
指令格式:
div r8/m8
div r16/m16
idiv r8/m8
idiv r16/m16
除法指令隐含使用DX和AX作为一个操作数,指令中给出的是除数。
当除数是8位时,用AX除以它,al保存商,ah保存余数。
当除数是16位时,用DX.AX除以它,16位商保存进AX,16位余数保存进DX中。余数的符号和被除数的符号相同。
八.如何进行dos系统调用?
1.在AH寄存器中设置系统功能调用号,说明选择的功能
2.在指定寄存器中设置入口参数。
3.用中断调用指令INT 21H执行功能调用。
![dc629079c11754e37e05f362559fea1a.png](https://i-blog.csdnimg.cn/blog_migrate/feea25ddc3b72905bd879741d62e2bc7.jpeg)
执行结果如下:
![48bd61e310fad96d06c3e348cc713c6d.png](https://i-blog.csdnimg.cn/blog_migrate/4d2c5d4ed45f7869b1455488a6e639b9.jpeg)
什么是入口参数,出口参数呢?
我的理解就是当你需要用标准输出设备输出时,你需要给出输出的参数,就称为入口参数。
当你用标准输入设备输入时(比如用键盘输入字符),这时候计算机会将你的数据保存再某个寄存器中,这个寄存器也就是出口参数。