概述
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 = bx | zf =1 | 表明ax的值和bx的值相等,结果为0的标志位为1,表明结果为0 |
---|---|---|
ax!= bx | zf = 0 | 表明ax的值和bx的值不相等,结果为0的标志位不为1,表明结果不为0 |
ax<bx | cf=1 | 表明ax的值小于bx的值,因为产生了进位 |
ax>=bx | cf=0 | 表明ax的值大于等于bx,无法确认ax是不是等于bx |
ax>bx | cf=0 并且 zf=0 | 表明ax>bx,又因为zf=0,即结果不是0那么,ax大于bx |
ax<=bx | cf=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:04+2=CS
一号中断程序的CS和IP:
0:14=IP
0:14+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,翻译过来是港口,是装货和卸货的地方。【也就是数据的传输的关键位置】
就是很简单的笔记,不学了,也不是不学了,就是跟同学聊起这个,觉得这个了解一波吧,毕竟,就目前看来,提高学习成绩的几率不是很大,先功利点吧。停了停了,其实还有很多东西可以学,不管了,不再“不务专业”了,搞点课程上的东西了
最后
以上就是土豪小懒虫为你收集整理的基础汇编(三)的全部内容,希望文章能够帮你解决基础汇编(三)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复