汇编语言

#program #language

8086汇编

8086
        16位机器(寄存器、运算器)                  
        20位地址总线                                
        机器启动后从0xFFFF0处执行                   
        段地址*16 + 偏移地址 = 物理地址  (CS*16+IP)

寄存器
        AX BX CX DX (AH AL ...)
        CS DS SS ES            
        SI DI (默认 DS:SI/DI)  
        SP BP (默认 SS:SP/BP)  
        FLAG(PSW)        
                ZF #零标志;执行结果是否为0
                PF #奇偶标志;执行结果的二进制位是1的数量是否为偶数
                SF #符号标志;执行结果是否为负
                CF #进位标志;无符号数运算的借/进位
                OF #溢出标志;有符号数运算超出机器表示范围
                TF #单步中断;        

寻址方式       
        直接寻址                [idata]
        寄存器间接寻址          [bx/bp/si/di]
        寄存器相对寻址          [bx/bp/si/di + idata]
        基址变址寻址            [bx/bp + si/di]
        相对基址变址寻址        [bx/bp + si/di + idata]
        注: 默认 DS:bx/si/di, SS:bp

转移       
        段内转移(改IP)
                (short)短转移(8位)
                (near)近转移(16位)
        段间转移(改CS:IP)
                (far)远转移
                
        转移指令              
               无条件转移指令(jmp) 
                        jmp short 标号           (段内短转移)
                        jmp near ptr 标号        (段内近转移)
                        jmp far ptr 标号         (段间转移/远转移)
                        jmp word ptr 内存地址    (段内转移)
                        jmp dword ptr 内存地址   (段间转移)
                条件转移指令(短转移)
                循环指令(loop)(短转移)
                        CX做计数器
                过程调用
                        ret
                                pop IP
                        retf
                                pop IP
                                pop CS
                        call 标号
                                push IP
                                jmp near ptr 标号
                        call far ptr 标号
                                push CS
                                push IP
                                jmp far ptr 标号
                        call 16-REG
                                push IP
                                jmp 16-REG
                        call word ptr 内存地址
                                push IP
                                jmp word ptr 内存地址
                        call dword ptr 内存地址
                                push CS
                                push IP
                                jmp dword ptr 内存地址

                中断(int)
        
端口访问
        64K个端口(0~65535)
        in/out (只能使用al/ax)
        CMOS时钟(70h地址端口、71h数据端口)

中断
        内中断
                除法错误(0)
                单步中断(1)
                int0(4)
                int n
        外中断
                可屏蔽
                        sti/cli  # IF=1/0
                不可屏蔽(2)
                键盘
                        扫描码(代表按键位置)
                        断码 = 通码 + 80H  # 位7置1
                        键盘输入过程:
                                键盘产生扫描码        
                                扫描码送入60H端口
                                引发9号中断
                                执行BIOS int 9中断例程
                                        字符键?:将扫描码和对应ASCII放入键盘缓冲
                                        控制键/切换键?:存入状态字节单元
                        程序员接口:
                                int 16h #从键盘缓冲读取输入
                磁盘
                        3.5寸软盘:2面*80道*18扇区*512B=1440KB=1.44M
                        程序员接口:
                                int 13h
                                        AH=功能号 # 2=读扇区,3=写扇区
                                        AL=扇区数
                                        CH=磁道号
                                        CL=扇区号
                                        DH=磁头号/面号
                                        DL=驱动器号
                                        es:bx=读/写缓冲

        中断过程
                取得中断码n
                pushf
                TF=0,IF=0
                push CS
                push IP
                IP=n*4, CS=n*4+2
        iret
                pop IP
                pop CS
                popf

四则运算
        乘法
                mul reg
                mul byte ptr 内存
                mul word ptr 内存
                8位: AH * NUM => AX
                16位:AX * NUM => DX(高16位) + AX(低16位)
        除法
                div reg
                div byte ptr 内存
                div word ptr 内存                
                8位: AX/NUM => AL(商) 、AH(余)
                16位:(DX<<16+AX)/NUM => AX(商) 、DX(余)
        加法
                add,adc
        减法
                sub,sbb

字符串处理
        movsb/movsw (es:di => ds:si)
        rep movsb/movsw (CX做计数器)
                s:movsb
                loop s
        cld/std  # DF=0/1, si/di递增/递减

操作符
      offset(距标号的偏移)
      dup(数据重复定义)

其它
        80x25彩色显示缓冲
                B8000H~BFFFFH (32K)
                256色,字符=ASCII+属性
                8页,4K/页

        中断向量表
                内存0起始处,256项,每个4字节(CS:IP)
                机器启动后BIOS、DOS轮流初始化自己的中断向量表

参考

  • 王爽. 汇编语言. 清华大学出版社,2006.