• <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>
            隨筆-80  評(píng)論-24  文章-0  trackbacks-0
            其實(shí)一直就對(duì)匯編語言沒有搞透徹,昨天開始重新拾起操作系統(tǒng)來,重又回到了這個(gè)最原始的問題,為什么db、dw、equ等叫偽指令呢?偽指令到底是什么呢?
            今天在bochs重新試驗(yàn)了一把,終于搞明白了:
            首先稱db、dw、equ等為偽指令是因?yàn)樗鼈兪枪﹨R編器使用的,匯編器如果看到mov等指令,直接將其翻譯成mov對(duì)應(yīng)的機(jī)器代碼,這個(gè)機(jī)器代碼是供計(jì)算機(jī)識(shí)別mov的;但是當(dāng)匯編器看到db指令后,它不是將其翻譯成機(jī)器代碼,因?yàn)橛?jì)算機(jī)不識(shí)別db指令對(duì)應(yīng)的機(jī)器碼,db沒有對(duì)應(yīng)的機(jī)器碼,db指令是告訴匯編器我需要在當(dāng)前內(nèi)存位置寫入一個(gè)字節(jié)。這樣在用nasm編譯完這個(gè).asm文件生成純二進(jìn)制.bin文件后,在文件對(duì)應(yīng)的字節(jié)處就已經(jīng)有這個(gè)一字節(jié)的數(shù)據(jù)了。.bin文件加載進(jìn)內(nèi)存之后在內(nèi)存中的映像和文件中相同,只是放到了不同的內(nèi)存地址起始處。
            我們舉例說明更加清楚,假如有如下一段代碼:
            文件名:boot.asm

             1 org 0x7c00
             2 jmp begin
             3 
             4 data1 db 10
             5 data2 db 11
             6 data3 db 12
             7 data4 db 13
             8 
             9 begin:
            10 mov ax, cs
            11 mov ds, ax
            12 mov es, ax
            13 mov ss, ax
            14 jmp $
            15 
            16 times 510 - ($ - $$) db 0
            17 dw 0xaa55

            這段代碼是一段boot代碼,當(dāng)然它什么也不做,僅僅是為了解開我們的迷惑。
            下面我們就匯編它,然后用dd寫入虛擬軟盤a.img的第一扇區(qū),然后用bochs加載該軟盤:

            1 nasm boot.asm -o boot.bin
            2 dd if=boot.bin of=a.img bs=512 count=1 conv=notrunc

            我們把斷點(diǎn)設(shè)置在0x7c00處,因?yàn)檫@是我們的代碼入口處。然后反匯編內(nèi)存地址0x7c00~0x7cff之間的內(nèi)容:
            <bochs:1> b 0x7c00
            <bochs:2> c
            (0) Breakpoint 1, 0x00007c00 in ?? ()
            Next at t=12943104
            (0) [0x0000000000007c00] 0000:7c00 (unk. ctxt): jmp .+4 (0x00007c06)      ; eb04
            <bochs:3> u 0x7c00 0x7cff
            00007c00: (                    ): jmp .+4                   ; eb04
            00007c02: (                    ): or cl, byte ptr ss:[bp+di] ; 0a0b
            00007c04: (                    ): or al, 0x0d               ; 0c0d
            00007c06: (                    ): mov ax, cs                ; 8cc8
            00007c08: (                    ): mov ds, ax                ; 8ed8
            00007c0a: (                    ): mov es, ax                ; 8ec0
            00007c0c: (                    ): mov ss, ax                ; 8ed0
            00007c0e: (                    ): jmp .-2                   ; ebfe
            00007c10: (                    ): add byte ptr ds:[bx+si], al ; 0000
            00007c12: (                    ): add byte ptr ds:[bx+si], al ; 0000
            00007c14: (                    ): add byte ptr ds:[bx+si], al ; 0000
            00007c16: (                    ): add byte ptr ds:[bx+si], al ; 0000
            ......
            反匯編這段內(nèi)存之后我們發(fā)現(xiàn)0x0000fc02~0x00007c05這四字節(jié)恰好是我們用db命令寫入的四個(gè)字節(jié)(見紅色區(qū)域)。
            如果我們將四條db代碼放到j(luò)mp $下面的話我們會(huì)發(fā)現(xiàn)反匯編后0a0b 0c0d出現(xiàn)的位置也相應(yīng)的出現(xiàn)在0x00007c0c~0x00007c0f處。
            到此已經(jīng)很顯然,同樣,如果我們?cè)诖a里使用了equ等偽指令,反匯編二進(jìn)制代碼是不會(huì)看到equ的任何痕跡的,因?yàn)閑qu只有匯編器才識(shí)別,它類似于c語言中的宏定義?也不完全是,因?yàn)閰R編中有自己的宏定義;變量賦值?也不是,因?yàn)閏語言中變量定義需要占用內(nèi)存空間。
            posted on 2011-11-05 00:58 myjfm 閱讀(9777) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 操作系統(tǒng)
            国产成人综合久久精品红| 久久精品国产一区二区| 天天爽天天狠久久久综合麻豆| 亚洲v国产v天堂a无码久久| 国产精品乱码久久久久久软件| 中文国产成人精品久久不卡| 久久96国产精品久久久| 久久精品一区二区三区中文字幕 | 无码国内精品久久人妻麻豆按摩| 三级片免费观看久久| 精品久久久噜噜噜久久久| 久久久99精品成人片中文字幕| 99久久精品免费看国产一区二区三区 | 久久婷婷是五月综合色狠狠| 久久久久免费看成人影片| 亚洲另类欧美综合久久图片区| 久久精品黄AA片一区二区三区| 国内精品久久久久久不卡影院| 一本久久a久久精品亚洲| 久久久久九九精品影院| 久久狠狠色狠狠色综合| 久久精品国产亚洲AV影院| 久久国产精品免费一区| 久久天堂AV综合合色蜜桃网| 亚洲人成无码网站久久99热国产 | 亚洲一级Av无码毛片久久精品| 国产V亚洲V天堂无码久久久| 三级三级久久三级久久| 久久久久久噜噜精品免费直播| 国产91久久精品一区二区| 伊人久久大香线蕉av不变影院 | 久久久噜噜噜久久中文福利| 亚洲另类欧美综合久久图片区| 国产精品99久久久久久www| 中文字幕亚洲综合久久2| 国产精品一久久香蕉产线看| 18岁日韩内射颜射午夜久久成人| 国产成人精品久久综合| 国产真实乱对白精彩久久| 久久精品国产亚洲AV不卡| 久久99久久成人免费播放|