汇编学习笔记(14) - 段定义(MASM)

完整的段定义

  格式

      段名 SEGMENT  [定位类型]  [组合类型]  ['类别']

        XXXXXXXXX

      段名 ENDS

  说明

      定位类型

          定位类型就是这个段的起始位置的对齐方式,有如下几种

          BYTE  没有对齐的要求,随便起始地址是哪里

          WORD  起始地址的最后位是0,即地址是 XXXX XXXX XXXX XXX0

          DWORD  起始地址的最后位是0,即地址是 XXXX XXXX XXXX XX00

          PARA   起始地址的最后位是0,即地址是 XXXX XXXX XXXX 0000

          PAGE     起始地址的最后位是0,即地址是 XXXX XXXX 0000 0000

      组合类型

          就是遇到名字和类型相同的段的时候他们直接怎么合并,有如下几种

          PUBLIC  直接按照顺序拼接在一起,总长度就是所有段加起来的长度

          COMMOM   这个就相当于C中的联合体 UNION, 互相重叠在一起,总长度就是最长的那个的长度

          STACK        表明这是一个堆栈段,和PUBLIC采用相同的规则,拼接起来     

      类别

          用 ' ' 包起来的一个自定义的字符串,相当于在段名的基础上加了个小标,只有段名和类别都一致才认为是一个段 

  举例

      CSEG   SEGMENT BYTE PUBLIC 'DATA'

        XXXXXXXXX

      CSEG   ENDS

 

  其他说明

      段组

         格式

           组名  GROUP  段名1, 段名2

         举例

            DS1S2  GROUP  DSG1, DSG2

         说明

           每个段寻址的时候都是使用段地址:偏移地址的方式寻址,如果存在多个段,那么在使用的时候就需要频繁的切换段地址 可能是DS寄存器,也可能是ES寄存器,这就很麻烦,使用段组就相当于给这些段起了个总的段地址, 所有段中的变量都可以使用这个总的段地址,

           同时原来的段地址也还是可以正常使用的,不有有一下两点注意

            1. ASSUME 的  DS必须设置为 组名

              ASSUM DS:DS1S2

            2. 取地址的时候必须使用如下格式

              OFFSET DS1S2 VAR1

简化的段定义

  前提

    需要使用 .MODEL [类型] 的方式来告知汇编器 程序的存储模型

    .MODEL SMALE    程序和数据都不超过64K

    .MODEL MEDIUM   数据小于64K 代码不一定

    .MODEL COMPACT  代码小于64K  数据数据不一定,但是单个数组肯定小于64K

    .MODEL LARGE    代码和数据都可能大于64K,但是单个数组肯定小于64K

    .MODEL HUGE    代码和数据都可能大于64K,而单个数组可能也大于64K

    

    .MODEL指令使用的时候相当于同时执行了如下伪指令

      DGROUP GROUP DATA,CONST,BSS,STACK

      ASSUME CS:_TEXT,DS:DGROUP,SS:DGROUP

  简化的段定义

    .CODE

        代码段的简化定义,遇到下一个段的定义或者遇到END表示该段结束

    .STACK [大小]

        堆栈段的简化定义,遇到下一个段的定义表示该段结束, 大小表明这个段有多大

    .DATA

        数据段的简化定义,遇到下一个段的定义表示该段结束

    .DATA?

        未初始化的数据段的简化定义,遇到下一个段的定义表示该段结束

    .CONST

        常数段的简化定义,遇到下一个段的定义表示该段结束

    .FARDATA [名字]

        其他自定义段的简化定义, 名字表示段的名称

 

   例子

           .MODEL SMALL

              .STACK  1024

           .DATA

       MESS:    DB 'HELLO',0DH,0AH

           .CODE

         START :  MOV AX, DGROUP

            MOV DX,AX

              MOV DX,OFFSET MESS

              MOV AH,9

              INT 21H

              MOV AX, 4C00H

             INT 21H

             ASSUME DS:@CODE ;可以手动重设段地址,简化的段名使用@符号引用

             END START      

 

函数的导出与引用

  说明

      汇编程序可以分别汇编多段程序,然后使用LINK程序将它们链接成一个完成程序,它们之后需要使用CALL来互相调用,那么在别写的时候就需要知道其他模块的函数,而本身给别人调用的时候也要告诉别人自己的函数名

  PUBLIC

      公开自己的函数或者变量

    格式

      PUBLIC  A,B,C

    说明

      A,B,C 可以是函数名,也可以是变量名

      

  EXTRN

      告诉汇编器,这些函数或者变量是在别的模块中定义的

    格式

      EXTREN  名称:类型

    举例

      EXTREN  PROC1:NEAR,PROC2:FAR

      EXTREN  VAR1:WORD,VAR2:BYTE

    说明

      由于链接的时候很能确定两段代码时候能在同一个段中,所以 函数的声明最好永远是使用FAR调用的

    程序例子

      模块1

            .MODEL SMALL

            PUBLIC VAR1,VAR2

            PUBLIC DELAY

            .DATA

         VAR1  DW ?

         VAR2  DB  ?

         VAR3  DB  5 DUP (0)

              .CODE

        DELAY  PROC

        LAB1:    RET

        DELAY ENDP

           END

      模块2

        

            .MODEL SMALL

            EXTRN VAR1:WORD,VAR2:BYTE

            EXTRN DELAY:FAR

              .CODE

        START:   MOV AX, VAR1

            MOV AL, VAR2

            CALL FAR PTR DELAY

        END       SATRT

  

posted @ 2020-02-05 22:13  蹦蹦骑士  阅读(2870)  评论(0编辑  收藏  举报