匯編學習筆記(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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM