您的位置:首页 > 其它

汇编语言学习笔记

2016-09-09 10:45 127 查看
一、补码

00000000b~01111111b表示0~127,按位取反后加1表述负数:

00000000b:0       11111111b+1=00000000b:0

00000001b:1       11111110b+1=11111111b:-1

00000010b:2       11111101b+1=11111110b:-2

01111111b:127     10000000b+1=10000001b:-127

结论:

1)最高位为1,表示负数

2)正数补码取反加1后为负数的补码;负数的补码取反加1后位其绝对值。比如:

   1的补码位00000001b,取反加1后位:11111111b,表示-1

   -1的补码位11111111b,取反加1后位:00000001b,其绝对值位1

   利用此特性可以得知负数补码代表什么数值

二、寄存器

1、CS为指令段寄存器;IP为指令指针寄存器;CS:IP(CS*16+IP)为指令地址

   不可使用mov指令直接修改寄存器值,可使用jmp指令:jmp 2Ae3:3  同时修改CS和IP;jmp ax 单独修改IP

2、DS为内存数据寄存器;ds设值后,[bx]取指定索引数据;或者DS:[bx]

   不可mov一个立即数给它,使用mov bx,1000h; mov ds,bx来赋值

   ES指向附加段,和DS功能相同,都可访问内存,特殊情况:进行串操作时,目的地址的段寄存器规定为ES。

3、SS为栈段寄存器;SP为栈指针寄存器;SS:SP(SS*16+SP)指向栈顶元素

   PUSH:SP=SP-2后入栈

   POP ax:SS:SP数据取到ax,SP+=2;

   PUSH、POP可以对段寄存器做操作

4、BX、SI、DI、BP,只有这四个寄存器可以存放内存索引:

   mov ax,[si]               

   mov ax,[bx+si]           

   mov ax,[si+idata]        

   组合情况只有四种:bx+si;bx+di;bp+si;bp+di

   使用到BP寄存器,默认段在SS中;其他默认DS中。

5、CX存放循环次数:

   mov cx,12

s: add dx,ax

   loop s

   存储条件转移指令的条件:

   jcxz s

6、DX、AX默认存放除数:

   除数16位则默认放AX,32位则默认DX存放高16位,AX存放低16位;

   被除数位8位,默认AL存放商,AH存放余数,16位则AX存放商,DX存放余数。

   div bx     将dx*10000H+ax除bx,商放在ax,余数放在dx

   div bl     将ax除bl,商放在al,余数放在ah

7、DX、AX用于乘法:

   8位相乘,一个默认放在AH中,另一个放在8位寄存器或者内存,结果默认放在AX中。

   16位相乘,一个默认在AX中,另一个放在16位寄存器或者内存,结果高位默认放在DX中,地位在AX中。

8、in和out指令只能使用ax或al来存放从端口中读入或发送的数据。

   in al,60h    从60h端口读入一个字节

   out 20h,al   往20h端口写入一个字节

9、flag标志寄存器,8086CPU中,各位含义:

   15  14  13  12  11  10  9   8   7   6   5   4   3   2   1   0

                   OF  DF  IF  TF  SF  ZF      AF      PF      CF

   第0位:CF,进位标志位,无符号运算时,记录结果的最高有效位向更高位进位或从最高位的借位值;

   第11位:OF,溢出标志位,有符号运算时,结果发生溢出则OF=1;否则OF=0;

   第2位:PF,奇偶标志位,记录指令执行后,结果的二进制位中1的个数是否为偶数,是偶数则PF=1,为奇数则PF=0;

   第6位:ZF,零标志位,记录指令执行后,结果是否为0,为0则ZF=1;不为0则ZF=0;

   第7位:SF,符号标志位,记录指令执行后,结果是否为负,为负则SF=1;不为负则SF=0;

   第10位:DF,方向标志位,串处理指令中,控制每次操作后,si,di的增减,DF=0,每次操作后si,di递增;DF=1,则递减;

   第9位:IF,CPU响应中断标记,CPU检测到可屏蔽中断信息时,如果IF=1,则响应中断,如果IF=0,则不响应。

   

   标志寄存器在debug中式单独标示的:

   标志   值为1的标记    值为0的标记

   OF     OV             NV

   SF     NG             PL

   ZF     ZR             NZ

   PF     PE             PO

   CF     CY             NC

   DF     DN             UP

三、指令

1、mov: mov ax,bx  将bx赋值给ax

2、add: add ax,bx  将bx累加到ax

3、sub: sub ax,bx  将ax减去bx,保存到ax

4、div: div bx     将dx*10000H+ax除bx,商放在ax,余数放在dx

5、inc: inc bx     将bx自增1

6、and: and al,11011111b   将al逻辑与11011111b,结果保存在al

7、or:  or  al,11011111b   将al逻辑或11011111b,结果保存在al

8、ptr: add word ptr [bx],2 对bx开始的内存做字操作

        inc byte ptr [bx]   对bx开始的内存做字节操作

        有寄存器参与的表达式,由寄存器决定操作长度:add ax,[bx] /  add al,[bx]

9、伪指令db、dw、dd分别代表定义立即数类型为字节、字、双字:

   db  1   data:0 = 01h        占一个字节

   dw  1   data:0 = 0001h      占一个字

   dd  1   data:0 = 00000001h  占两个字

10、伪指令dup表示立即数重复次数,配合db、dw、dd使用:

   db  3  dup(0) 定义三个字节都是0,即db 0,0,0

   db  3  dup(0,1,2) 定义9个字节,即db 0,1,2,0,1,2,0,1,2

11、操作符offset:

    start:mov ax,offset start   相当于mov ax,0  offset操作符取得标号start的偏移地址0

        s:mov ax,offset s       相当于mov ax,3

12、jmp指令:可以只修改IP,也可以同时修改CS和IP

    jmp short s    短转移,只修改IP:-128~127         机器码包含位移

    jmp near ptr s 段内近转移,只修改IP:-32768~32767 机器码包含位移

    jmp far ptr s  段间近转移,修改CS和IP             机器码明确包含了CS地址和IP地址

    jmp al:将al赋值给IP

    jmp word ptr ds:[0]:将内存地址0处的一个字赋给IP

13、jcxz指令:条件转移指令,都是短转移,只修改IP:-128~127

    jcxz s:如果CX寄存器为0,则转移到s处。

14、loop指令为循环指令,所有循环指令都是短转移。机器码包括位移而不是目的地址

    loop s:如果CX--后不为0,则转移到s处

15、ret指令用栈中的数据修改IP,实现近转移,相当于POP IP;

    retf指令用栈中数据修改CS和IP内容,实现远转移,相当于POP IP;POP CS;

16、call指令执行以下两步操作,不能实现短转移,其他合jmp指令相同:

    1)将当前的IP或者CS和IP压栈

    2)转移

    用法包括:

    1)call 标号:将当前IP压栈后,转移到标号处执行,相当于

       PUSH IP

       jmp near ptr 标号

    2)call ax:类似1

    3)call word ptr [bx]:类似1

    4)call dword ptr [bx]:段间转移,相当于

       push CS

       push IP

       jmp dword ptr [bx]

17、mul乘法指令:

    8位相乘,一个默认放在AH中,另一个放在8位寄存器或者内存,结果默认放在AX中。

    16位相乘,一个默认在AX中,另一个放在16位寄存器或者内存,结果高位默认放在DX中,地位在AX中。

    mul reg

    mul byte ptr ds:[0]

    mul word ptr [bx+si+8]

    举例:

    mov al,1000

    mov bl,10

    mul bl

    结果:ax = 1000

18、adc指令:带进位加法指令

    adc ax,bx 相当于ax=ax+bx+CF

19、sbb指令:借位减法指令

    sbb ax,bx 相当于ax = ax-bx-CF

20、cmp指令:比较指令,做减法运算,不保存结果,只影响标志寄存器

    mov ax,8

    mov bx,3

    cmp ax,bx

    执行后:ax=8,ZF=0,PF=1,SF=0,CF=0,OF=0

    cmp ax,bx比较无符号数各种可能:

    ZF=1  说明ax=bx

    ZF=0  说明ax!=bx

    CF=1  说明ax<bx

    CF=0  说明ax>=bx

    CF=0 && ZF=0  说明ax>bx

    CF=1 || ZF=1  说明ax<=bx

    cmp ah,bh比较有符号数各种可能:

    ZF=1  说明ah=bh

    ZF=0  说明ah!=bh

    SF=1 && PF=0  说明ah<bh

    SF=1 && OF=1  说明ah>bh

    SF=0 && OF=1  说明ah<bh

    SF=0 && OF=0  说明ah>=bh

21、其他条件转移指令:

    je   等于则转移      ZF=1

    jne  不等于则转移    ZF=0

    jb   低于则转移      CF=1

    jnb  不低于则转移    CF=0

    ja   高于则转移      CF=0 且 ZF=0

    jna  不高于则转移    CF=1 或 ZF=1

22、movsb:将di:si指向的内存字节送入es:di,然后根据DF位标记,将si和di递增或递减

    movsw:传送的是字,然后si和di递增或递减2

    rep movsb/w:rep指令根据cx的值,重复指向后面的串传送指令,相当于:

                 s: movsb/w

                     loop s

    cld:将标志寄存器DF位置0

    std:将标志寄存器DF位置1

23、pushf:将标志寄存器的值压栈

    popf:从栈中弹出数据,送入标志寄存器

24、shl和shr逻辑移位指令

    shl逻辑左移指令(shr类似):

    1)将一个寄存器或内存单元中的数据向左移位

    2)将最后移出的一位写入CF中

    3)最低位用0补充

    mov al,01001000b

    shl al,1

    执行后al=10010000b,CF=0

    如果移动位数大于1,必须将位数放在cl中。

    mov al,01001000b

    mov cl,3

    shl al,cl

    执行后al=10001000b,CF=1

    

25、in、out指令。

   CPU最多可以定位64K个不同端口,即0~65535。

   对端口的读写不能使用mov指令,只能使用:in和out。

   in和out指令只能使用ax或al来存放从端口中读入或发送的数据。

   对0~255以内端口读写:

   in al,20h   从20h端口读入一个字节

   out 20h,al  从20h端口写入一个字节

   对256~65535的端口读写,端口号放在dx中:

   mov dx,3f8h

   in al,dx

   out dx,al       

26、sti、cli指令

   sti  用于设置IF=1

       cli  用于设置IF=0

四、中断

1、8086CPU的中断向量表固定在:0000:0000到0000:03E8的1000个单元中一个表项占用两个字,高地址字存放段地址,低地址字存放偏移地址

2、8086CPU的中断过程:

   1)从中断信息中取得中断类型码                                                                     :取得中断类型码N

   2)标志寄存器的值入栈                                                                             :pushf

   3)设置标志寄存器的第8位TF和第9位IF的值为0                                                        :TF=0,IF=0(禁止其他可屏蔽中断)

   4)CS的内容入栈                                                                                   :push CS

   5)IP的内容入栈                                                                                   :push IP

   6)从内存地址为 中断类型码*4 和 中断类型码*4+2 的两个字单元中读取中断处理程序入口地址设置IP和CS   :IP=N*4 , CS=N*4+2

3、中断处理程序常规步骤:

   1)保存用到的寄存器

   2)处理中断

   3)恢复用到的寄存器

   4)用iret指令返回,iret指令用汇编语法描述为:

          pop IP

          pop CS

          popf

4、CPU执行int n指令,相当于引发一个N号中断的中断过程,参考2

5、BOIS和DOS中断例程的安装过程:

   1)开机后,CPU一加电,初始化CS=0FFFFH,IP=0,自动从FFFF:0单元开始执行程序。此处有一条跳转指令,CPU执行该指令后,转去执行

      BOIS中的硬件系统检测和初始化程序。

   2)初始化程序将建立BIOS所支持的中断向量,即将BIOS提供的中断例程的入口地址登记在中断向量表中,注意,对于BIOS所提供的中断例

      程,只需将入口地址登记在中断向量表中即可,因为它们是固化到ROM中的程序,一直在内存中存在。

   3)硬件检测和初始化完成后,调用int 19h进行操作系统的引导,从此将计算机交由操作系统控制。

   4)DOS启动后,除完成其他工作外,还将它所提供的中断例程装入内存,并建立相应的中断向量。

6、外中断,包括两类:

   1)可屏蔽中断:IF=1,响应中断,IF=0,不响应中断

      几乎所有的外设引发的中断,都是可屏蔽中断。

      sti  用于设置IF=1

      cli  用于设置IF=0

   2)不可屏蔽中断

      CPU必须响应,中断类型码固定为2,因此中断过程第一步,不需要取中断类型码了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息