我是靠谱客的博主 土豪小懒虫,最近开发中收集的这篇文章主要介绍基础汇编(三),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

16位寄存器 bit 每一个bit 为 0 或者 1.
CF进位标志寄存器 标志位 Carry Flag【进位旗帜】
标志位寄存器: CF,跟运算指令有关
如果是移动指令:mov,push,pop是不会改变cf的值的

代码:

assume cs:code,ds:data,ss:stack

data segment
			db 128 dup(0)
data ends

stack segment stack
			db 128 dup(0)
stack ends

code segment

start:


		mov ax,stack
		mov ds,ax
		
		mov ax,0


		mov al,0FFH
		add al,al
		
		
		mov ax,4C00H
		int 21H

code ends
end start

在这里插入图片描述
运算结果:CY =Carry Yes,NC = Not Carry.就是没有进位(默认)。
注意:产生的进位只跟运算指令有关系,跟移动指令(mov,pop,push是没有关系的)。

add,sub,mul,div都会产生


ZF标志位寄存器 Zero Flag[结果为0的标志寄存器]
代码:

assume cs:code,ds:data,ss:stack

data segment
			db 128 dup(0)
data ends

stack segment stack
			db 128 dup(0)
stack ends

code segment

start:


		mov ax,stack
		mov ds,ax
		
		mov ax,0


		mov al,0FFH
		sub al,al
		
		
		mov ax,4C00H
		int 21H

code ends
end start	

结果:寄存器ZF 由NZ(not zero)变为了 ZR,结果为0就为ZR。
这个地方,对于mul指令和div指令会不会影响ZF标志寄存器,有待进一步实验。目前我的电脑上是mul指令会影响,但是div指令是不影响的

在这里插入图片描述


PF:奇偶性标志位寄存器 PF:parity,但是,这里不是结果的奇偶性,而是指结果中1的个数的奇偶性。我们知道,结果在cpu中,都是保存为 二进制形式的这有利于以后传输数据中的奇偶性检验,校验码【传输数据中一种检验方法,计组会学】

0000 0011【偶数】0000 0010【奇数】
PF=PE【parity even】PF=PO【parity odd】

在这里插入图片描述


SF标志位:SF=Sign Flag[运算结果的符号,是补码的符号]
SF:取值有两个,一个是NG【negative】【结果为负数】,一个是PL【positive】【结果为正数】。把计算的结果,看作是正数还是负数。


OF标志位: 表示运算的结果是否溢出。 o表示 overflow
OV代表溢出了,NV代表没溢出

第一个标志位就是这个溢出标志位。
-128-127
-32768-32767

CF标志位是把结果当做无符号结果运算,在 CF 标志位眼里1111 1111 =255,不是一个负数,
加法溢出:
在这里插入图片描述
减法溢出:
在这里插入图片描述

pushf : 把标志位寄存器中的值存到栈中
popf :把栈中的值pop到标志位寄存器中


add指令:add ax,bx ax = ax + bx
adc指令: adc ax,bx ax = ax + bx +carry
sub指令:sub ax,bx ax=ax-bx
sbb指令:sbb ax,bx ax=ax-bx-carry


cmp 指令 :
sub指令 sub ax,bx ax=ax-bx【结果会存放在ax中】
cmp指令:cmp ax,bx ax-bx 【做了这个过程,但是没有保存结果,但是会修改标志位】

cmp指令作用:修改标志位,不保存结果,也就是对于所有寄存器的数值没有影响,但会对标志位造成影响
这里的1是表示状态,例如zf=1,是表示这个zf标志位是true的。

ax = bxzf =1表明ax的值和bx的值相等,结果为0的标志位为1,表明结果为0
ax!= bxzf = 0表明ax的值和bx的值不相等,结果为0的标志位不为1,表明结果不为0
ax<bxcf=1表明ax的值小于bx的值,因为产生了进位
ax>=bxcf=0表明ax的值大于等于bx,无法确认ax是不是等于bx
ax>bxcf=0 并且 zf=0表明ax>bx,又因为zf=0,即结果不是0那么,ax大于bx
ax<=bxcf=1或者 zf =1表明产生进位了或者zf=1的话就是ax=bx

利用cmp指令和jmp指令,完成上面的判断,可以与jmp指令结合起来产生 可以if ,else的效果。

跳转的范围还是-128-127

je 标号jmp equal等于的时候跳转
jne 标号jmp not equal不等于的时候跳转
jb 标号jmp below小于
jnb 标号jmp not above大于等于【即不小于】
ja 标号jmp above大于
jna 标号jmp not above小于等于【即不大于】

内中断
发生了需要cpu去立即去处理的信息
1.除法错误 divide overflow
2.单步执行
3.执行了into指令
4.执行了int指令
cs:ip 指向了cpu需要处理的程序入口,段地址 : 偏移地址

存放位置:
0000:0000-0000:03FF
**零号中断程序的CS和IP:
0:04=IP
0:0
4+2=CS
一号中断程序的CS和IP:
0:14=IP
0:1
4+2=CS
**
CPU通过中断类型码找到中断向量表,再找到程序地址的位置。如 int 21H 的21H就是使用给一个中断程序

中断执行的过程:
1.取得中断类型码
2.保存标志位寄存器 ----> 栈 pushf
3.将标志位寄存器的第 8位 TF 和第 9 为 IF 设置为0
4.push cs
5.push ip
6.CS = N4+2,IP=N4.
【根据中断类型码设置cs和ip】
中断处理程序返回的办法:
ret指令:pop ip
零号中断因为是除法出错,所以会直接退出,但是其他的中断会返回到继续执行。
iret指令:
pop ip
pop cs
popf

**TF标志位和IF标志位的作用:TF和IF标志位是告诉CPU需要执行中断的,然后再执行中断的过程中,我们需要把它赋值为0.相当于告诉它,不要再执行中断了【这个时候中断已经开始执行了】,如果没有告诉它,那cpu又会检测到这个时候需要执行中断,那么这样,cpu就是在不断的执行中断了。所以设置为0,就是相当于告诉cpu不要无限次地引发中断。
**


中断执行的过程:
1.取中断类型码
2.标志位寄存器入栈 IF=0 ,TF=0
3.push cs push ip
4.cs = N4+2 ;ip = N4


端口:port,翻译过来是港口,是装货和卸货的地方。【也就是数据的传输的关键位置】


就是很简单的笔记,不学了,也不是不学了,就是跟同学聊起这个,觉得这个了解一波吧,毕竟,就目前看来,提高学习成绩的几率不是很大,先功利点吧。停了停了,其实还有很多东西可以学,不管了,不再“不务专业”了,搞点课程上的东西了

最后

以上就是土豪小懒虫为你收集整理的基础汇编(三)的全部内容,希望文章能够帮你解决基础汇编(三)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(55)

评论列表共有 0 条评论

立即
投稿
返回
顶部