在汇编中怎样往flag中置1或者-1

作者&投稿:蔡山 (若有异议请与网页底部的电邮联系)
在汇编程序中什么指令可以将中断允许标志位IF置0~

sti 指令 是接受 外部中断 也就是 IF=1
CLi 指令 是屏蔽 可屏蔽外部中断 也就是 IF=0

运算结果标志位
1、进位标志CF(Carry Flag)
进位标志CF主要用来反映运算是否产生进位或借位。如果运算结果的最高位产生了一个进位或借位,那么,其值为1,否则其值为0。

使用该标志位的情况有:多字(字节)数的加减运算,无符号数的大小比较运算,移位操作,字(字节)之间移位,专门改变CF值的指令等。


2、奇偶标志PF(Parity Flag)
奇偶标志PF用于反映运算结果中“1”的个数的奇偶性。如果“1”的个数为偶数,则PF的值为1,否则其值为0。

利用PF可进行奇偶校验检查,或产生奇偶校验位。在数据传送过程中,为了提供传送的可靠性,如果采用奇偶校验的方法,就可使用该标志位。



3、辅助进位标志AF(Auxiliary Carry Flag)
在发生下列情况时,辅助进位标志AF的值被置为1,否则其值为0:

(1)、在字操作时,发生低字节向高字节进位或借位时;
(2)、在字节操作时,发生低4位向高4位进位或借位时。

对以上6个运算结果标志位,在一般编程情况下,标志位CF、ZF、SF和OF的使用频率较高,而标志位PF和AF的使用频率较低。

4、零标志ZF(Zero Flag)
零标志ZF用来反映运算结果是否为0。如果运算结果为0,则其值为1,否则其值为0。在判断运算结果是否为0时,可使用此标志位。

5、符号标志SF(Sign Flag)

符号标志SF用来反映运算结果的符号位,它与运算结果的最高位相同。在微机系统中,有符号数采用补码表示法,所以,SF也就反映运算结果的正负号。运算结果为正数时,SF的值为0,否则其值为1。

6、溢出标志OF(Overflow Flag)
溢出标志OF用于反映有符号数加减运算所得结果是否溢出。如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。

“溢出”和“进位”是两个不同含义的概念,不要混淆。如果不太清楚的话,请查阅《计算机组成原理》课程中的有关章节。

二、状态控制标志位

状态控制标志位是用来控制CPU操作的,它们要通过专门的指令才能使之发生改变。

1、追踪标志TF(Trap Flag)
当追踪标志TF被置为1时,CPU进入单步执行方式,即每执行一条指令,产生一个单步中断请求。这种方式主要用于程序的调试。

指令系统中没有专门的指令来改变标志位TF的值,但程序员可用其它办法来改变其值。

2、中断允许标志IF(Interrupt-enable Flag)
中断允许标志IF是用来决定CPU是否响应CPU外部的可屏蔽中断发出的中断请求。但不管该标志为何值,CPU都必须响应CPU外部的不可屏蔽中断所发出的中断请求,以及CPU内部产生的中断请求。具体规定如下:

(1)、当IF=1时,CPU可以响应CPU外部的可屏蔽中断发出的中断请求;

(2)、当IF=0时,CPU不响应CPU外部的可屏蔽中断发出的中断请求。

CPU的指令系统中也有专门的指令来改变标志位IF的值。

3、方向标志DF(Direction Flag)
方向标志DF用来决定在串操作指令执行时有关指针寄存器发生调整的方向。具体规定在第5.2.11节——字符串操作指令——中给出。在微机的指令系统中,还提供了专门的指令来改变标志位DF的值。

汇编语言中, 一般所说的flag是指CPU里标志寄存器中的那些标志位。
对PC中的8086 CPU来说,就是指程序状态字寄存器PSW中的各个位。
这些标志只占一个bit,所以,只有置1还是清0的操作,不存在置-1的问题。

多数标志有专门的操作指令,比如进位标志CF可以用CLC, STC指令清0或置1,中断允许标志IF用CLI和STI清0和置1.

对于那些没有专门指令清零或置1的标志,可以将PSW内容读出,处理好相关标志位的值以后再写回去。

比如,要将PSW所有各位全部清零,可以这么做:

PUSHF ; 将标志寄存器内容入栈
POP AX ; 从栈中取出内容送AX寄存器处理

SUB AX, AX ; 将AX清零,若作其它处理换成相应的处理指令

PUSH AX ; 将处理后的数据压入堆栈
POPF ; 将栈中数据送到标志寄存器

看你的flag具体存在什么地方了。
下面是个最简单的情况。
dseg segment
flag db ?
dseg ends

cseg segment
assume cs:cseg, ds:dseg
start:
mov ax, dseg
mov ds, ax

mov flag, 1
mov al, flag

mov ah, 4ch
int 21h
cseg ends
end start

一般操作flag的低8位
lahf
or ah,00001000置一(或and ah,11110111置零)
sahf

对于全部十六位以堆栈为中介
pushf
pop ax
or ax,0000100000000000置一(或and ax,1111011111111111置零)
push ax
popf

对于32位eflag,将上述的pushf、popf、ax换为pushfd,popfd,eax

;8086
mov ax,-1
push ax
popf

;80X86
push -1
popf


电脑中的文件格式
FLA Macromedia Flash电影FLC Autodesk FLIC动画文件FLF Corel Paradox产生的格式:Navison Financials许可文件;OS\/2驱动程序文件PLI Autodesk FLIC动画FLT StarTrekker音乐模块(MOD)文件;MultiGen Inc的Open Flight使用的文件格式;Corel过滤器文件FM Adobe FrameMaker文档FMB Oracle4.0版或以后版本表单的二进制源代码文件FML ...

谁有所有扩展名的列表
(IBM的DCA一部分) FH3 Aldus Freehand 3绘图文件 FIF Fractal图像文件 FIG REND386\/AVRIL使用的文件格式 FITS CCD照相机图像;灵活图像传输系统 FLA Macromedia Flash电影 FLC Autodesk FLIC动画文件 FLF Corel Paradox产生的格式:Navison Financials许可文件;OS\/2驱动程序文件 PLI Autodesk FLIC动画 FLT StarTrekker...

求助有关常用扩展名的知识
ASM 汇编语言源文件,Pro\/E装配文件 ASO Astound Dynamite对象文件 ASP 动态网页文件;ProComm Plus安装与连接脚本文件;Astound介绍文件 AST Astound多媒体文件;ClarisWorks“助手”文件 ASV DataCAD自动保存文件 ASX Cheyenne备份脚本文件;Microsoft高级流媒体重定向器文件,视频文件 ATT AT< Group 4位图...

高要市19861794666: 汇编j开头的跳转指令有哪些? -
商贵卡罗: 条件码:①OF(Overflow Flag)溢出标志.溢出时为1,否则置0.②SF(Sign Flag)符号标志.结果为负时置1,否则置0.③ZF(Zero Flag)零标志,运算结果为0时ZF位置1,否则置0.④CF(Carry Flag)进位标志,进位时置1,否则置0.⑤AF(Auxiliary ...

高要市19861794666: 汇编中的TEST指令 -
商贵卡罗: test属于逻辑运算指令,其功能为功能执行BIT与BIT之间的逻辑运算和测试功能(两操作数作与运算,仅修改标志位,不回送结果). Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器,结果本身不会保存.EST AX, ...

高要市19861794666: C语言关于flag的问题 -
商贵卡罗: flag是一个变量 当flag==1时 执行 否则不执行.flag=1是一个表达式 把1赋值给flag 那么会永远执行flag==1就可以了

高要市19861794666: 将字符串中的所有空格改为一个“ - ” -
商贵卡罗: #include<cstdio>#include<cstring> using namespace std; char s[30]; int main() { printf("输入:\n"); gets(s); bool flag=0; int len=strlen(s); int lengh=len; for(int i=len-1;i>=0;i--) { if(s[i]==' ') lengh--; if(s[i]!=' ') break; } for(int i=0;i<lengh;i++) { if(s[i]=='...

高要市19861794666: 怎么用汇编语言在单片机程序中定义标志位 -
商贵卡罗: 用汇编语言在单片机程序中定义标志位,很简单.单片机内存从20H开始的8个字节是布尔变量区,也就是为变量区.C语言定义unsigned char flag=0;,实际也是存储在这个区.汇编也一样,只不过需要直接指定位地址,并要自己初始化:flag EQU 20H;SETB flag

高要市19861794666: 程序中定义flag=1做标记,是怎么标记的 -
商贵卡罗: 就是编程者自己约定,在这个程序中,如果flag=1,就表示某种特定的含义,如果flag=0就是另外的情况.在以后的程序中,就按这个约定,及时地修改变量flag的值.需要时就检查这个flag的值,以了解情况.

高要市19861794666: c语言中flag是什么?用在哪 -
商贵卡罗: C语言中一般设置一个变量flag,是一个来表示判断的变量,当做标志.例如当一直情况的时候,置flag为1,当另外一种情况时,置flag为2. 变量名为flag,只是习惯问题,也可以取别的名字

高要市19861794666: 汇编语言怎样将OF置1? -
商贵卡罗: 计算溢出就行,比如加法操作,在32位机器中如果R0 = 0xffffffff R1=0x1 add R0,R0.R1 做无符号加法,就会出行溢出,此时OF=1

高要市19861794666: 如何把dataset中的表的flag列的值改为1(c#) -
商贵卡罗: for(int i=0;i<DS.Tables[0].Rows.Count;i++) { DS.Tabble[0].Row[i]["flag"]="1"; } 后面使用Adpt.Update()更新回源DataTable的方式!~~

高要市19861794666: 8086汇编中关于flag寄存器 -
商贵卡罗: NV,UP,EI,PL,NZ,NA,PO,NC就是标志寄存器各个标志位的值了,都是表示对应的标志位处于复位状态,也就是各个标志位的值等于0.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网