;文件名:test.asm
     ;文件说明:硬盘主引导扇区代码
     ;创建日期:2020-2-12 22:12 
  
     jmp near start
    mytext db 'L',0x07,'a',0x07,'b',0x07,'e',0x07,'l',0x07,' ',0x07,'o',0x07,\
    'f',0x07,'f',0x07,'s',0x07,'e',0x07,'t',0x07,':',0x07
    number db 0,0,0,0,0
     start:
     mov ax,0x7c0                  ;设置数据段基地址 
     mov ds,ax
     
     mov ax,0xb800                 ;设置附加段基地址 
     mov es,ax                     ;0xb800 为显示缓冲区,显卡专用地址
     
     cld                           ;方向标志位,相反的是std
     mov si,mytext                 ;ds:si 为传送源地址
     mov di,0                      ;es:di为传送目的地址
     mov cx,(number-mytext)/2      ;实际上等于 13 要传送的实际数量
     rep movsw                     ;rep 重复执行 cx 次,每执行一次cx减1
 
     ;得到标号所代表的偏移地址
     mov ax,number                 ;设置基址
     
     ;计算各个数位
     mov bx,ax                     ;bx 段寄存器,保存基址
     mov cx,5                      ;循环次数 
     mov si,10                     ;除数 
    digit: 
     xor dx,dx                     ;或非门,把dx清零。
     div si                        ;执行除法,用ax除以si结果存在dx中
     mov [bx],dl                   ;保存数位
     inc bx                        ;inc bx内容加1 dec是减1
     loop digit                    ;循环执行
     
     ;显示各个数位
     mov bx,number                 ;取得地址
     mov si,4                      ;偏移,从高位往你位依次显示            
     show:
     mov al,[bx+si]                ;传送到al中
     add al,0x30                   ;转换为assci码
     mov ah,0x04                   ;显示属性
     mov [es:di],ax                ;传送到es显示缓冲区
     add di,2                      ;DI加上2以指向下一个缓冲区
     dec si                        ;si减1,也就number的地址一直向下走
     jns show                      ;如果标志寄存器符号位(SF)不为0就跳转到jshow执行,
                                   ;dec减到0就就会把SF弄为0 SI的初始值为4,当执行到最后一个
                                   ;时,也就是为0时再减1就成负数 了,产生了错位。于是最高位为1,因最高位为1故SF为1了
                                   
     
     mov word [es:di],0x0744       

     jmp near $
      times 510-($-$$) db 0
               db 0x55,0xaa

;其他符号位
;奇偶标志位PF 计算结果低8位有1的总数是偶的话就为1,否则为0
;进位标志CF,计算结果如果最高位有向前进位或借位的情况发生则CF等于1,否则为0,少数指令除外,如inc和dec
;溢出标志OF,用于指出两个有符号运算是否正确,它假定你进行的都是有符号运算,无符号运算可以忽略。正确的OF=0
;现在指令对标志位的影响
;OF是溢出标志位指示有符号运算是否正确
;SF有符号位,计算结果最高位为0,就是0,否则 是1
;ZF零标志位,计算结果为0这一位为1,否则为0
;CF进位标志,当add或shl指令操作有进位时cf置1、否则置0。
;AF为辅助进位标志,对10进制数的运算进位仅仅标识。
;PF为奇偶标志位,如果计算结果,低8位中有偶个数为1则PF为1否则为0
;ADD加法指令,影响CF,SF,OF,ZF,AF
;CBW 字节转换为字指令执行的操作:AL的内容扩展到AH,形成AX中的字。不影响任何位
;CLD 方向指令 cld使DF 复位 DF=0,其他的标志位未定义。不要在程序中依赖这些标志
;CWD是汇编语言中字到双字符的扩展指令,不影响任何标志位
;DEC( DECrement ) 减1指令 CF标志不受影响,其他指令依计算结果而定。
;div为无符号除法,idiv为有符号除法,对所有标志位未定义
;inc加1指令 CF标志位不受影响。其他的依计算结果 而定。
;mov/movs 普通的mov指令 做符号扩展的movs 不影响任何标志
;NEG命令就是取反+1,也就是补码,如计算结果 为0则CF为1,对其他标志位没影响
;std置方向标志1,DF=1
;SUB减法指令,依计算结果而定
;XOR异或指令,OF=0,CF=0,其他依计算结果而定。
;JCC是一条指令族,功能是根据某些条件进行转移。
;JNS当SF(符号位)是0的时候就跳转
;JS跟上面相反,如果 SF是1的时候就跳转
;JZ的意思是ZF(0标志位)为1则跳转,JNZ不为1则跳转
;JO的意思 是OF(溢出标志位)标志位为1则跳转,jNO不为1则跳转
;JC是是CF(进位标志)为1则跳转,JNC相反为0就跳转
;JP是PF为1则跳转,JNP相反
;cmp比较指令,cmp我sub一样都是做减法运算,但不同的是cmp不保存结果 ,cmp将会影响CF,OF,SF,ZF,AF和PF标志位。如:
;cmp ax bx
;ax 是被测量对象,bx是测量基准。
;比较完后就用下面指令进行跳转。
;靠于就跳转用je (Equal) 相减结果为0,故ZF=1;不等于是jne (not Equal),ZF为0
;大于 Greater 用JG 只用于有符号比较。SF=OF,ZF=0
;大于或等于,jge (Greater OR Equal) SF=OF
;不大于,JNG (not Greater) 只用于有符号比较 ZF=1 SF!=OF
;不大于等于 JNGE (not Greater OR Equal) SF!=OF
;小于 JL (less) 小于,等同于JNGE
;小于等于 JLE (Less or Equal) 等同于 JNG
;不小于 JNL (not Less) 等同于jge
;不小于等于 (not Less or Equal) jnle 等于jg
;下面用于无符号比较
;高于 ja (above) CF=0 ZF=0
;高于等于 jae (above or Equal) cf=0
;不高于 jna (not above) cf等于1或者zf=1 等同于jbe (低于等于)
;不高于等于 jnae (not above or Equal) cf=1 等同于jb
;低于 Below jb CF=1
;低于等于 jbe (Below or Equal) CF=1或ZF=1
;不等于 jnb (not Below) cf=0
;不低于等于 (not Below or Equal) jnbe cf=0或 zf=0
;校验为偶 jpe (parity even) PF=1
;校验为奇 jpo (parity Odd) pf=0
;最后一个校验指令 jcxz 当CX寄存器为0时则跳转。