• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            小默

            ASM - 段定義偽指令

              段定義偽指令是表示一個(gè)段開(kāi)始和結(jié)束的命令,80x86有兩種段定義的方式:完整段定義和簡(jiǎn)化段定義,分別使用不同的段定義偽指令來(lái)表示各種段。

             4.2.1.1 完整的段定義偽指令

              完整段定義偽指令的格式如下:

              段名 SEGMENT
                .
                .
                .
              段名 ENDS

              段名由用戶命名。對(duì)于數(shù)據(jù)段、附加段和堆棧段來(lái)說(shuō),段內(nèi)一般是存儲(chǔ)單元的定義、分配等偽指令語(yǔ)句;對(duì)于代碼段中則主要是指令及偽指令語(yǔ)句。

              定義了段還必須說(shuō)明哪個(gè)段是代碼段,哪個(gè)段是數(shù)據(jù)段。ASSUME偽指令就是建立段和段寄存器關(guān)系的偽指令,其格式為:

              ASSUME 段寄存器名: 段名,…

              段寄存器名必須是CS、DS、ES和SS中的一個(gè),而段名必須是由SEGMENT定義的段名。

             
            ·定位類型:說(shuō)明段的起始邊界值(物理地址)。
              
              ·組合類型:說(shuō)明程序連接時(shí)的段組合方法。

              ·類別:在單引號(hào)中給出連接時(shí)組成段組的類型名。連接程序可把相同類別的段的位置靠在一起。

            例4.1

              ; * * * * * * * * * * * * * * * * * * * * * * *
              data_seg1 segment        ; 定義數(shù)據(jù)段
                        .
                        .
                        .
              data_seg1 ends
              ; * * * * * * * * * * * * * * * * * * * * * * *
              data_seg2 segment        ; 定義附加段
                        .
                        .
                        .
              data_seg2 ends
              ; * * * * * * * * * * * * * * * * * * * * * * *
              code_seg segment         ; 定義代碼段

               assume cs:code_seg, ds:data_seg1, es:data_seg2

              start:              ; 程序執(zhí)行的起始地址
              ; set DS register to current data segment
                 mov   ax, data_seg1   ; 數(shù)據(jù)段地址
                 mov   ds, ax       ; 存入DS寄存器

              ; set ES register to current extra segment
                 mov   ax, data_seg2   ; 附加段地址
                 mov   es, ax       ; 存入ES寄存器
                        .
                        .
                        .
               code_seg ends          ; 代碼段結(jié)束
              ; * * * * * * * * * * * * * * * * * * * * * * * * * *
                 end   start

              由于ASSUME偽指令只是指定某個(gè)段分配給哪一個(gè)段寄存器,它并不能把段地址裝入段寄存器中,所以在代碼段中,還必須把段地址裝入相應(yīng)的段寄存器中:

              MOV    AX,DATA_SEG1    ; 數(shù)據(jù)段地址
              MOV    DS,AX        ; 存入DS寄存器
              MOV    AX,DATA_SEG2    ; 附加段地址
              MOV    ES,AX        ; 存入ES寄存器

              如果程序中還定義了堆棧段STACK_SEG,也需要把段地址裝入SS中:
              MOV    AX,STACK_SEG    ; 堆棧段地址
              MOV    SS,AX        ; 存入ES寄存器

              注意,在程序中不需要用指令裝入代碼段的段地址,因?yàn)樵诔绦虺跏蓟瘯r(shí),裝入程序已將代碼段的段地址裝入CS寄存器了。

              為了對(duì)段定義作進(jìn)一步地控制,SEGMENT偽指令還可以增加類型及屬性的說(shuō)明,其格式如下:

              段名   SEGMENT  [定位類型][組合類型]['類別']
                         .
                        .
                        .
              段名   ENDS

              [ ]中的內(nèi)容是可選的,一般情況下,這些說(shuō)明可以不用。但是,如果需要用連接程序把本程序與其他程序模塊相連接時(shí),就需要提供類型和屬性的說(shuō)明。

            表4.2.1 ·定位類型:說(shuō)明段的起始邊界值(物理地址)。
            定位類型
            說(shuō) 明
            BYTE
            段可以從任何地址邊界開(kāi)始
            WORD
            段從字邊界開(kāi)始,即段的起始邊界值為偶數(shù)
            DWORD
            段從雙字的邊界開(kāi)始,即段的起始邊界值為4的倍數(shù)
            PARA
            段從小段邊界開(kāi)始,即段的起始邊界值為16 (或10H) 的倍數(shù)
            PAGE
            段從頁(yè)邊界開(kāi)始,即段的起始邊界值為256 (或100H) 的倍數(shù)

              注意:
              定位類型的缺省項(xiàng)是PARA,即在未指定定位類型的情況下,則連接程序默認(rèn)為PARA。BYTE和WORD用于把其它段(通常是數(shù)據(jù)段)連入一個(gè)段時(shí)使用;DWORD一般用于運(yùn)行在80386及后繼機(jī)型上的程序。
            表4.2.2 ·組合類型:說(shuō)明程序連接時(shí)的段組合方法。
            組合類型
            說(shuō) 明
            PRIVATE
            該段為私有段,連接時(shí)將不與其它模塊中的同名段合并
            PUBLIC
            該段連接時(shí)將與其它同名段連接在一起,連接次序由連接命令指定
            COMMON
            該段在連接時(shí)與其它同名段有相同的起始地址,所以會(huì)產(chǎn)生覆蓋
            AT 表達(dá)式
            段地址=表達(dá)式的值,其值必為16位但AT不能用來(lái)指定代碼段
            MEMORY
            與PUBLIC同義
            STACK
            將多個(gè)同名堆棧段連接在一起,SP設(shè)置在第一個(gè)堆棧段的開(kāi)始

              注意:組合類型的缺省項(xiàng)是PRIVATE。

            例4.2 在連接之前已定義兩個(gè)目標(biāo)模塊如下:

              模塊1   SSEG  SEGMENT  PARA  STACK
                   DSEG1 SEGMENT  PARA  PUBLIC 'Data'
                   DSEG2 SEGMENT  PARA
                   CSEG  SEGMENT  PARA 'Code'

              模塊2   DSEG1 SEGMENT  PARA PUBLIC 'Data'
                   DSEG2 SEGMENT  PARA
                   CSEG  SEGMENT  PARA 'Code'

              以上兩個(gè)模塊分別匯編后產(chǎn)生 .OBJ 文件,經(jīng)連接程序連接后產(chǎn)生的 .EXE模塊如下:

              模塊1   CSEG  SEGMENT  PARA 'Code'
              模塊2   CSEG  SEGMENT  PARA 'Code'
              模塊1+2  DSEG1 SEGMENT  PARA PUBLIC 'Data'
              模塊1   DSEG2 SEGMENT  PARA
              模塊2   DSEG2 SEGMENT  PARA
              模塊1   SSEG  SEGMENT  PARA STACK

            ------------------------------------------------------
            4.2.1.2 存儲(chǔ)模型與簡(jiǎn)化段定義偽指令

              較新版本的匯編程序(MASM5.0與MASM6.0)除支持完整段定義偽指令外,還提供了一種新的簡(jiǎn)單易用的存儲(chǔ)模型和簡(jiǎn)化的段定義偽指令。

              
            1. 存儲(chǔ)模型偽指令
              存儲(chǔ)模型的作用是什么呢?存儲(chǔ)模型決定一個(gè)程序的規(guī)模,也確定進(jìn)行子程序調(diào)用、指令轉(zhuǎn)移和數(shù)據(jù)訪問(wèn)的缺省屬性(NEAR或FAR)。當(dāng)使用簡(jiǎn)化段定義的源程序格式時(shí),在段定義語(yǔ)句之前必須有存儲(chǔ)模型 .MODEL語(yǔ)句,說(shuō)明在存儲(chǔ)器中應(yīng)如何安放各個(gè)段。

              MODEL偽指令的常用格式如下:
            .  .MODEL 存儲(chǔ)模型
            表4.2.3 MASM 5.0和MASM 6.0支持的存儲(chǔ)模型:
            存儲(chǔ)模型
            功 能
            適用操作系統(tǒng)
            Tiny (微型) 所有數(shù)據(jù)和代碼都放在一個(gè)段內(nèi),其訪問(wèn)都為NEAR型,整個(gè)程序≤64K,并會(huì)產(chǎn)生.COM文件。 MS-DOS
            Small (小型) 所有代碼在一個(gè)64KB的段內(nèi),所有數(shù)據(jù)在另一個(gè)64KB的段內(nèi)(包括數(shù)據(jù)段,堆棧段和附加段)。 MS-DOS
            Windows
            Medium (中型) 所有代碼>64K時(shí)可放在多個(gè)代碼段中,轉(zhuǎn)移或調(diào)用可為FAR型。所有數(shù)據(jù)限在一個(gè)段內(nèi),DS可保持不變。 MS-DOS
            Windows
            Compact(緊湊型) 所有代碼限在一個(gè)段內(nèi),轉(zhuǎn)移或調(diào)用可為NEAR型。數(shù)據(jù)>64K時(shí),可放在多個(gè)段中。 MS-DOS
            Windows
            Large (大型) 允許代碼段和數(shù)據(jù)段都可超過(guò)64K,被放置在有多個(gè)段內(nèi),所以數(shù)據(jù)和代碼都是遠(yuǎn)訪問(wèn)。 MS-DOS
            Windows
            Huge (巨型) 單個(gè)數(shù)據(jù)項(xiàng)可以超過(guò)64K,其它同Large模型 MS-DOS
            Windows
            Flat (平展型) 所有代碼和數(shù)據(jù)放置在一個(gè)段中,但段地址是32位的,所以整個(gè)程序可為4GB。MASM 6.0支持該模型。 OS/2
            WindowsNT

              注意:Small 模型是一般應(yīng)用程序最常用的一種模型,因?yàn)橹挥幸粋€(gè)代碼段和一個(gè)數(shù)據(jù)段,所以數(shù)據(jù)和代碼都是近訪問(wèn)的。這種模型的數(shù)據(jù)段是指數(shù)據(jù)段、堆棧段和附加段的總和。

              在DOS下用匯編語(yǔ)言編程時(shí),可根據(jù)程序的不同特點(diǎn)選擇前6種模型,一般可以選用SMALL模型。另外,TINY模型將產(chǎn)生COM程序,其他模型產(chǎn)生EXE程序。FLAT模型只能運(yùn)行在32位x86 CPU上,DOS下不允許使用這種模型。當(dāng)與高級(jí)語(yǔ)言混合編程時(shí),兩者的存儲(chǔ)模型應(yīng)當(dāng)一致。


              2. 簡(jiǎn)化的段偽指令
              簡(jiǎn)化的段定義語(yǔ)句書(shū)寫(xiě)簡(jiǎn)短,語(yǔ)句.CODE、.DATA和.STACK分別表示代碼數(shù)據(jù)段和堆棧段的開(kāi)始,一個(gè)段的開(kāi)始自動(dòng)結(jié)束前面一個(gè)段。采用簡(jiǎn)化段指令之前必須有存儲(chǔ)模型語(yǔ)句.MODEL。
            表4.2.4 簡(jiǎn)化段偽指令的格式如下表:

            簡(jiǎn)化段偽指令
            功 能
            注釋
            .CODE [段名] 創(chuàng)建一個(gè)代碼段 段名為可選項(xiàng),如不給出段名,則采用默認(rèn)段名。對(duì)于多個(gè)代碼段的模型,則應(yīng)為每個(gè)代碼段指定段名。
            .DATA 創(chuàng)建一個(gè)數(shù)據(jù)段 段名是:_DATA
            .DATA? 創(chuàng)建無(wú)初值變量的數(shù)據(jù)段 段名是:_BSS
            .FARDATA [段名] 建立有初值的遠(yuǎn)調(diào)用數(shù)據(jù)段 可指定段名,如不指定,則將以FAR_DATA命名。
            .FARDATA? [段名] 建立無(wú)初值的遠(yuǎn)調(diào)用數(shù)據(jù)段 可指定段名,如不指定,則將以FAR_BSS命名。
            .CONST 建立只讀的常量數(shù)據(jù)段 段名是:CONST
            .STACK [大小] 創(chuàng)建一個(gè)堆棧段并指定堆棧段大小 段名是:stack。如不指定堆棧段大小,則缺省值為1KB


              3.與簡(jiǎn)化段定義有關(guān)的預(yù)定義符號(hào)
              匯編程序給出了與簡(jiǎn)化段定義有關(guān)的一組預(yù)定義符號(hào),它們可在程序中出現(xiàn),并由匯編程序識(shí)別使用。有關(guān)的預(yù)定義符號(hào)如下:
              (1)@code 由.CODE 偽指令定義的段名或段組名。
              (2)@data 由.DATA 偽指令定義的段名,或由 .DATA 、.DATA?、
                .CONST和 .STACK所定義的段組名。
              (3)@stack 堆棧段的段名或段組名。

              下面的舉例說(shuō)明預(yù)定義符號(hào)的使用方法。在完整的段定義情況下,在程序的一開(kāi)始,需要用段名裝入數(shù)據(jù)段寄存器,如例4.1中的
                   mov   ax,data_seg1
                   mov   ds,ax
              若用簡(jiǎn)化段定義,則數(shù)據(jù)段只用.data來(lái)定義,而并未給出段名,此時(shí)可用
                   mov   ax,@data
                   mov   ds,ax
              這里預(yù)定義符號(hào)@data就給出了數(shù)據(jù)段的段名。


              4.簡(jiǎn)化段定義舉例

            例4.3
               
            .MODEL   SMALL
               .STACK   100H    ; 定義堆棧段及其大小
               .DATA         ; 定義數(shù)據(jù)段
                   .
                   .
                   .
               .CODE         ; 定義代碼段
             START:           ; 起始執(zhí)行地址標(biāo)號(hào)
               MOV     AX, @DATA ; 數(shù)據(jù)段地址
               MOV     DS, AX   ; 存入數(shù)據(jù)段寄存器
                   .
                   .
                   .
               MOV    AX, 4C00H
               INT    21H
               END    START    ; 程序結(jié)束


              從例4.3可以看出,簡(jiǎn)化段定義比完整的段定義簡(jiǎn)單得多。但由于完整的段定義可以全面地說(shuō)明段的各種類型與屬性,因此在很多情況下仍需使用它。


            posted on 2009-12-25 13:29 小默 閱讀(2524) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Language

            導(dǎo)航

            統(tǒng)計(jì)

            留言簿(13)

            隨筆分類(287)

            隨筆檔案(289)

            漏洞

            搜索

            積分與排名

            最新評(píng)論

            閱讀排行榜

            久久91精品综合国产首页| 久久无码国产专区精品| 国内精品久久久久影院一蜜桃| 久久综合视频网| 久久综合久久综合九色| 日韩欧美亚洲国产精品字幕久久久 | 久久久久这里只有精品| 久久国产色AV免费看| 婷婷久久五月天| 国产精品久久精品| 久久无码中文字幕东京热| 精品综合久久久久久97超人| 久久天天躁狠狠躁夜夜躁2O2O| 久久影院久久香蕉国产线看观看| 久久强奷乱码老熟女网站| 久久免费视频一区| 久久国产精品99精品国产| 久久久这里只有精品加勒比| 国产高潮国产高潮久久久91| 91精品观看91久久久久久| 四虎国产精品免费久久5151| 久久99热这里只有精品66| 久久精品国产亚洲Aⅴ香蕉| 国产巨作麻豆欧美亚洲综合久久| 777午夜精品久久av蜜臀| 无遮挡粉嫩小泬久久久久久久| 99久久综合国产精品免费| 国产精品永久久久久久久久久| 久久中文字幕一区二区| 丰满少妇高潮惨叫久久久| 精品乱码久久久久久久| 色综合久久久久久久久五月| 国产亚洲美女精品久久久2020| 狠狠色综合网站久久久久久久高清| 色婷婷狠狠久久综合五月| 亚洲欧美一区二区三区久久| 久久综合九色欧美综合狠狠| 午夜精品久久影院蜜桃| 91麻豆国产精品91久久久| 久久亚洲sm情趣捆绑调教| 亚洲欧美日韩久久精品第一区|