汇编语言学习笔记11

时间:2022-12-05 03:30:09

标志寄存器

     先来总结一下以前的寄存器的作用:
1 存储相关指令的执行结果
2 为cpu执行相关指令提供的行为依据
3 控制cpu的相关工作方式。
      本课学习的标志寄存器也是 16位的,其中存储的信息通常被称为程序状态字(psw)标志寄存器的16位有9位分别表示了不同的状态 如下
0   cf   
2   pf
3
4   af
6   zf
7   sf
8   tf
9   if
10 df
11 of
12
13
14
15
没有表示空白 ,不具备任何含义 ,下面了解一下非空白区的各个含义 
zf     零标志位。记录相关指令执行后其结果是否为零,若是结果为零 那么zf=1,否则zf=0;
pf 标志位    奇偶标志位,记录相关指令执行后,其结果的所有二进制位中1的个数是否为偶数,若是偶数那么pf=1,不是偶数那么pf=0;
sf 标志位    符号标志位,记录相关指令执行后,其结果是否为负,如果结果为负,那么sf=1,不为负,sf=0
cf 标志位   进位标志位。一般在无符号运算的情况下,它记录了运算结果的最高有效为向更高位的进位值,或者从更高位的借位值,cf标志位就是标志了是否进行了借位或进位运算,但一定记得是最高有效位。
of 标志位   溢出标志位,我们这里说的溢出仅适用于有符号数,例如对于8位寄存器能表示的数值范围是-128-127,若是超出了这个范围那么就是溢出了。若是有溢出,则of=1,否则of=0; 
       adc指令--带进位加法指令,他利用了cf为上记录的进位值。
指令格式   adc  操作数一,操作数二 
功能    操作对象1=操作数1+操作数2+cf值     
例如   
mov ax, 2
mov bx,   1
sub  bx,ax
adc  ax,1
那么 ax最终存储的结果是4由于进行减法运算的时候进行了借位,那么再次进行带进位的加法的时候就要考虑cf的值了。
       其实cpu进行数值运算的时候,跟我们进行的运算方法是一样的 ,例如我们进行加法运算的时候,我们先将低位进行相加,在进行高位相加,高位想家的时候我们会把低位运算产生的进位或借位应用到高位上去,例如指令  add  ax,bx ;可以分解为
add al,bl      adc ah,bh
那么虽然寄存器是16位的,我们也可以进行更高位的运算,例如下面的程序举例:计算1EF000H+201000H,结果存放到ax(高16位)和bx(低16位)中,
分析 :显然这两个数都超过了寄存器的数值表示范围,用add指令无法进行运算,我们可以将他们分步运算。
程序如下:
assume cs:code ,ss:stack
stack segment 
db 16 dup(?)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16
push ax
push cx
push bx
mov ax,001eh
mov bx,0f00h
mov cx,1000h
add cx,1ee0h
adc bx,1000h
adc ax,0020h
pop bx
pop cx
pop ax
code ends
end start
当然我们在程序中本不用去进行进栈出战的操作但是为了保留程序中所用寄存器的原来信息我们就必须进行数据的保存,  另外需要说明的是,inc  loop指令不会影响标志位的数值,其他的指令就难说了,
同理我们也会用到带进位的减法指令,add    不作详细说明,
我们需要掌握的一个比较重要的指令就是cmp指令  比较指令 
  cmp 操作数一 ,操作数二  功能操作数1-操作数2,仅仅进行减法比较并不对运算结结果进行保留,用运算结果来影响标志位。例如
cmp  ax,bx
如果  ax=bx 那么zf=0
如果  ax<bx 那么zf!=0  进而会有 cf=1
呵呵 由此可见一个表达式的值,不仅仅会影响一个标志位,
  我们进行cmp指令的比较得到了相应的标志位数值,cpu就会有相应的指令来去进行下一步的运算处理。下面是根据无符号数的比较结果进行转移的条件转移指令
  je  等于则转移   zf=1
jne  不等于则转移  zf=0
jb   低于则转移 cf=1
jnb  不低于则转移cf=0
ja    高于等于则转移 zf=0且cf=1
jna   不高于则转移  cf=1或zf=1
其实j代表了jmp    e=equal    a=above     b=blew  
都是相应的英文单词的解释,
相应的应用格式   条件转移指令  标号(要想转移到的标号地址)
 举例如下
编程实现如下功能  如果 ah=bh 那么ah=ah+ah 否则  ah=ah+bh
程序小段
  cmp ah ,bh
  je s
  add ah,bh
  mov ax, 4c00h
  int 21h
  end
s:add ah,ah 
  mov ax, 4c00h
  int 21h
  end
这样我们就实现了转移,
当然这种比较也可以应用到内存单元上,例如  
cmp   byte ptr 【0】,2  或者 cmp byte ptr 【0】,ah 这样都是可以的、  
额今天的任务55有完成了。哥们仙剑了个网站希望去注册谢谢咯,