汇编学习笔记

来源:互联网 发布:淘宝宝贝规格图片尺寸 编辑:程序博客网 时间:2024/05/19 02:44

数制基础
   常用二进制(B/b结尾)、十进制(D/d结尾)、十六进制(H/h结尾)。

数据组织
   位
     计算机中最小的单位,一个二进制位。
   字节
     字节是80806/8088CPU可寻址的最小数据单位,一个字节是8位。一个字节中位的编号从右到左依次是0-7。
   字
     通常,一个16位,一个字中的编号从右到左依次是0-15。
     第0位叫做最低有效位,第15位叫做最高有效位。0-7叫做低位字节,8-15叫做高位字节。
   双字
     通常,一个32位。一个双字中的编号从右到左依次是0-31.
     第0位叫做最低有效位,第31位叫做最高有效位。0-7叫做低字,8-15叫做高字。

数的编码
   我们把计算机中表示的二进制数据代码成为机器数,它约定了数据的符号和数据的格式。而机器数代表的实际数值称为真值。
   机器数的编码可分为定点数和浮点数两种。定点数又可分为定点整数和定点小数两种。

   定点小数表示的是纯小数。在定点小数的机器数编码格式中,规定小数点的位置固定在最高数据位之前,符号位之后,小数点的位置在整个运算过程中是固定不变的。在定点机器中,小数点的位置一经约定,即固定不变,不需要专门的代码指定小数点的位置。
   对于一个n+1位的定点二进制小数x=x0x1.....xn其中x0表示符号位,为0则x为正,为1则x为负。
   x所能表示的范围-(1-2^(-n))<=x<=(1-2^(-n))

   定点整数的机器数编码方法中,规定小数点固定放在最低数据位的右边。对于一个n+1位的定点二进制整数x=x0x1.....xn其中xn表示符号位,为0则x为正,为1则x为负。
   x所能表示的范围-(2^n-1)<=x<=-2^n-1
   
   定点小数编码
       原码表示法
       原码用最高位表示数的符号位,又叫符号-绝对值表示法。
       IF x>0 then
          x = +0.x1x2....xn
          [x]原 = 0.x1x2......xn = x
       IF x<0 then
          x = -0.x1x2.....xn
          [x]原 = 1.x1x2......xn
          [x]原 = 1+0.x1x2......xn
          [x]原 = 1-(-0.x1x2.....xn)
                = 1 - x
       IF x=0 then
          [+0]原 = 0.00......0
          [-0]原 = 1.00......0

                 x  当0<=x<1                           
       [x]原 = {  
                 1-x 当-1<x<=0

       原码表示法简单、直观与真值转换方便。缺点是加减运算不方便。

定点小数表示
       补码表示法
       一般说:任意一个数x的补码,等于该数加上其模数。模数m为一个正整数,则
           [x]补 = m+x (mod m)
       IF x>0 then
         [x]补 = x + m = x (mod m)
       IF x<0 then
         [x]补 = x + m = m - |x| (mod m)
       IF x=0 then
         [+0]补 = [-0]补 = 0.0000

       对任意一个n+1位的二进制小数x=x0x1......xn期中x0为符号位,其补码为
                  x   当0<=x<=1-2^(-n)
        [x]补 = {
                  2-x 当-1<=x<=0 (mod 2)

       关于定点二进制小数补码模数m=2的说明:
       [x]补max = 0.1111111...111
      
       补码具有以下性质
         1.[+0]补 = [-0]补 = 0.0000  
         2.定点小数的补码中,可表示-1,这是其他编码中做不到的
         3.负数的补码求法中,用2减去x的绝对值,可以看做是用1111减去x的绝对值,然后末位加1。因而负数求补码的方法,可用x逐位求反,末位加1得到。
         4.关于补码的符号位:
           x>=0, [x]补=x>=0,此时x0=0
           x<=0, [x]补=2+x>=1,此时x0=1
         5.已知[x]补=x0x1...........xn,求x的真值
         根据补码的定义,可综合写成[x]补=2x0+x,期中x0为符号位,x为该数的真值,对于正负数均成立。
            x = [x]补 - 2x0
              = x0.x1x2.........xn-2x0
              =-x0+0.x1x2.........xn
              =-(x0-0.x1x2........xn)

         6.补码的符号扩展及右移规则
         已知[x]补=x0.x1x2.......xn,求[x/2]补
         由性质5可知:
           x = -x0 + 0.x1x2.....xn
             = -x0 + x1*2^(-1) + x2*2^(-2)......xn*2^(-n)
           x/2 = -x0*2^(-1) + x1*2^(-2)...............xn*2^(-n-1)
               = -x0+x0*2^(-1) + x1*2^(-2)...............xn*2^(-n-1)
               = -x0 + 0.x0x1x2...........xn
           [x/2]补 = 2x0 + x/2 = x0.x0x1x2....xn
         
         
      反码
        反码与补码类似,正数的反码是其本身;负数的反码,只需每位求反即可。
                  x    当0<=x<1
        [x]反 = {
                  (2-2^(-n))+x 当-1<x<=0
        可以把反码看做以(2-2^(-n))为模的补码。因此在反码的运算中当最高位产生进位2时,不能随便扔掉,还必须在最低位加1(2^(-n))才可。
        另外反码表示中
         [+0]反 = 0.0000.......0
         [-0]反 = 1.1111.......1
        零的表示不唯一这也是反码的不便之处,但常常用反码作为补码的跳板。
        
定点整数编码
       x = xnxn-1..........x0
       xn为符号位
       原码
       设x=xnxn-1..........x0
                   x  当0<=x<=2^n-1
         [x]原 = {
                   2^n-x 当-(2^n-1)<=x<=0

       [+0]原 = 000000000.....0
       [-0]原 = 100000000.....0
      补码
                  x   当 0<=x<=2^n-1
        [x]补 = {
                  2^(N+1)+x    当-2^n<=x<=0 (mod 2^(n+1))
      各种性质和定点小数补码性质类似。
      [+0]补 = [-0]补 = 00000.........000
      10000......0 的真值为 -2^n
      
      反码
                x   当 0<=x<=2^n-1
     [x]反 = {
                (2^(n+1)-1) + x    当 -(2^n-1)<x<=0

      移码
       [x]移 = 2^n + x,-2^n<=x<=2^n-1
      当x为正数时只要将最高位(符号位)加1即可
      当x为负数时 [x]移 = 2^n - |x|

      例:求x = (±6)D = (±110)B的移码
      [(+110)B]移 = 2^3+0110 = 1110
      [(-110)B]移 = 2^3-110 = 0010
      
      移码的特点是比较数的大小方便。

浮点数编码

     浮点数表示

     一部分表示数的有效值,称为尾数M(mantissa),一部分表示该数小数点的位置,称为阶码E(exponent)。

     一般计算机中规定阶码E为定点整数,尾数M为定点小数。阶码在浮点运算中只作加减运算,通常采用补码或移码表示。尾数要做加减运算和乘除运算,通常采用补码和原码表示。

     浮点数中阶码和尾数的关系,用下式表示

      x = MxREx
        其中x是一个浮点数,Mx是其尾数,用定点二进制小数表示;Ex是其阶码,用定点二进制整数表示;R是阶的低,可以用2、8或16,通常取2,阶的底与尾数Mx的进位制的基数相同。若阶的底R=2,则Mx为二进制数。一个机器中所有的浮点数阶的底都相同,因此R不表现出来。

     规格化数

     在浮点数的表示中,一个浮点数可以有多种表示方式,所以提出了规格化的概念。规定尾数最高位数据位不为零,为有效数据。这样要求|Mx|>=R-1。当R=2时,| Mx |>=0.5对于用源码表示的尾数,要求尾数的最高位为1;对于补码表示的尾数,要求数据最高位与尾数符号不同,即Mx = 0.1x…….x.,或Mx=1.0x……..x。

     机器零

     当一个浮点数,其尾数Mx  = 0 不管阶码取何值,都把该浮点数看做零,或者阶码小于其阶码最小值,叫做机器零。此时要求把浮点数的阶码和尾数都清零。

     浮点数溢出

     当一个数的阶码大于机器数的最大阶码时,称为上溢;转溢出处理。当下溢时,视为机器零。

     IEEE浮点数格式

     IEEE标准规定浮点数的字长有3种:32位短实数,64位长实数和80位临时实数。因为尾数已经采用规格化方法表示,其最高位一定是有效数据位,因此可节省1位,这样表示的尾数有效位数可以再增加1位。规格户尾数最高数据位称隐藏位。

 

20位物理地址的计算方法
    物理地址 = 段地址*16+偏移地址

通用寄存器
    做16位使用,可以用AH、AL做8位寄存器使用。
    AX称为累加器。它是算术运算的主要寄存器。所有的I/O指令都使用这个寄存器与外部设备传送信息。
    BX称为基址寄存器。常用来存放存储器地址。
    CX称为计数寄存器。在移位指令、循环指令和串处理指令中,CX用来保存计算值。
    DX称为数据寄存器。一般在做双字长运算时,讲DX和AX组合在一起存放一个双字长数,DX用来存放高位字。某些I/O操作,DX可用来存放端口地址。

变址寄存器
    变址寄存器包括源变址寄存器SI和目的变址寄存器DI。SI和DI可以像通用寄存器一样在运算过程中存放操作数,但它们只能以字(16位)为单位使用。 SI和DI一般与数据段寄存器DS联用,用来确定数据段中某个存储单元的地址。在串处理指令中,SI和DS联用,DI和ES联用,分别达到在数据段和附加 段中寻址的目的。

指针寄存器
    BP寄存器
    BP寄存器为基址指针寄存器。它可以像通用寄存器一样在运算过程中存放操作数,但只能以字为单位使用。BP可以与SS寄存器联用,确定堆栈段中的某个存储单元的地址。它可以作为堆栈区中的一个基地址,访问堆栈中的信息。
    SP寄存器
    SP寄存器为堆栈指针寄存器。它可以像通用寄存器一样在运算过程中存放操作数,但只能以字为单位使用。SP可以和SS联寄存器用,确定堆栈段中的某个存储单元的地址。SP用来指示栈顶的偏移地址。
    IP寄存器
    IP寄存器为指令指针寄存器。IP用来存放代码段中指令的偏移地址。在程序运行中,IP始终指向下一条指令的首地址,且与CS寄存器一起确定这条指令的物 理地址。IP内容的修改是自动完成的,即控制器取得一条执行的指令时马上修改IP的内容。因此IP寄存器用户程序是不能使用的。IP的内容在执行控制转移 指令、子程序调用指令和返回指令时讲被修改。

段寄存器
    CS寄存器
    CS寄存器用于存放当前执行的程序代码的所在段的段地址。CS的值乘以16(左移4位)再加上IP寄存器的值便可以确定下一条指令的存放地址。
    DS寄存器
    DS寄存器存当前数据段的段地址。
    ES寄存器
    ES寄存器用于存放附加段的段地址。ES通常是串处理中用来指定目的串所在段的段地址,此时DI寄存器存放目的串在段内的偏移地址。
    SS寄存器用于存放堆栈段的段地址。
   
标志寄存器PSW
   标志寄存器PSW是一个16为的寄存器。它反映了CPU运算的状态特征并且存放某些控制标志。8086使用了16位中的9位,包括6个状态标志位和3个控制标志位。
   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
   CF进位标志位:当执行一个加法(减法)运算时,最高位产生进位(或借位)时,CF为1,否则为0。
   ZF零标志:若当前的运算结果为零,则ZF为1,否则为0。
   SF符号标志位:该标志位与运算结果的最高位相同。即运算结果为负,则SF为1,否则为0。
   OF溢出标志位:若运算结果超出机器能够表示的范围称为溢出,此时OF为1,否则为0。判断是否溢出的方法是:进行二进制运算时,最高位的进位值与次高位的进位值进行异或运算,若运算结果为1则表示溢出OF=1,否则OF=0
   PF奇偶标志:当运算结果的最低8位中含1的个数为偶数则PF=1否则PF=0
   AF辅助进位标志:一个加法(减法)运算结果的低4位向高4位有进位(或借位)时则AF=1否则AF=0  
   另外还有三个控制标志位用来控制CPU的操作,可以由程序进行置位和复位。
   TF跟踪标志:该标志位为方面程序调试而设置。若TF=1,8086/8088CPU处于单步工作方式,即在每条指令执行结束后,产生中断。
   IF中断标志位:该标志位用来控制CPU是否响应可屏蔽中断。若IF=1则允许中断,否则禁止中断。
   DF方向标志:该标志位用来控制串处理指令的处理方向。若DF=1则串处理过程中地址自动递减,否则自动递增。

 

汇编环境
    MASM.exe    汇编编译程序
    LINK.exe    连接程序
    LIB.exe     过程库管理程序

    EDIT.exe    DOS下的文本编辑,这个随便吧。。本人推荐notepad或者Emacs
    DEBUG.exe   16位的指令调试器
   
    .OBJ文件
    生成的目标文件
    .LST
    列表文件同时列出源程序和机器语言程序清单。
    .CRF
    交叉文件。可用来生成交叉引用表REF。
MASM的使用
    MASM [filename]
   
    .MAP
    连接映像文件。连接映像文件是连接程序的列表文件。
    .LIB
    库文件。
LINK的使用
    LINK [filename]


DEBUG的使用
   可以
    debug filename
   也可以使用NAME和LOAD导入需要调试的程序
    -n filename
    -l
    -
   
查看反汇编的结果
    -u
    可以用-u来确定程序运行停止的地址,即断点地址。
    若程序未完,再次使用u命令继续显示。
    -u 偏移量
   
启动程序运行
    -g 偏移量
   
查看数据段内容
    -d 偏移量

单步跟踪
    -t
    执行一条指令后停下来,显示所有寄存器的内容及标志位的值

退出
    -q

 

查看帮助信息

    -h

原创粉丝点击