新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > ]“hello world”字符串輸出的簡單匯編

        ]“hello world”字符串輸出的簡單匯編

        作者: 時間:2016-11-25 來源:網絡 收藏
        hello world這個程序是每們語言入門級新手的必經之路,下面就其匯編形式給出簡短的源代碼

        和粗略注釋。關于21號中斷的作用可自行網上查閱。希望能給同學們帶來幫助。

        本文引用地址:http://www.104case.com/article/201611/321425.htm

        ;作用:hello world! 字符串的輸出

        ;寄存器關聯:代碼段code與代碼段寄存器CS關聯,
        ;數據段data與數據段寄存器DS關聯。
        assume CS:code,DS:data;注意:assume是偽指令,在掃描編譯時不翻譯

        ;data數據段定義
        data segment
        string db Hello world!,$;切忌串結束符$
        data ends

        ;代碼段定義
        code segment

        ;程序開始
        start:
        mov ax,data ;將數據段段地址裝入AX寄存器
        mov ds,ax;將數據段段地址通過通用寄存器AX裝入DS
        mov dx,offset string;將串的段內地址裝入DX
        mov ah,09h;調用DOS的09H號功能,傳入參數DS:DX=串地址,$結束字符串

        int 21h
        mov ah,4ch;調用DOS的4CH號功能,帶返回碼結束,返回碼存在于AL
        int 21h
        code ends;代碼段定義結束
        end start;程序結束

        hello world的反匯編分析:

        反匯編結果如下:

        -u
        0C32:0000 B8310C MOV AX,0C31
        0C32:0003 8ED8 MOV DS,AX
        0C32:0005 BA0000 MOV DX,0000
        0C32:0008 B409 MOV AH,09
        0C32:000A CD21 INT 21
        0C32:000C B44C MOV AH,4C
        0C32:000E CD21 INT 21
        0C32:0010 0426 ADD AL,26
        0C32:0012 807F0403 CMP BYTE PTR [BX+04],03
        0C32:0016 7507 JNZ 001F
        0C32:0018 26 ES:
        0C32:0019 807F0A00 CMP BYTE PTR [BX+0A],00
        0C32:001D 7437 JZ 0056
        0C32:001F A15827 MOV AX,[2758]

        單步如下:

        -t

        AX=0C31 BX=0000 CX=0020 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
        DS=0C21 ES=0C21 SS=0C31 CS=0C32 IP=0003 NV UP EI PL NZ NA PO NC
        0C32:0003 8ED8 MOV DS,AX

        由反匯編代碼可以知道,數據段的段地址由OS分配得到0C31,送入AX

        代碼端段地址為0C32,由CS鎖存。

        堆棧段地址與數據段地址一樣,但是SP和IP有相同的起始值,所以可能會引來一些問題。

        繼續單步:

        -t

        AX=0C31 BX=0000 CX=0020 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
        DS=0C31 ES=0C21 SS=0C31 CS=0C32 IP=0005 NV UP EI PL NZ NA PO NC
        0C32:0005 BA0000 MOV DX,0000

        AX的值已經送入DS。可以看出,一般段內地址起始值都為0.

        單步:

        0C32:0005 BA0000 MOV DX,0000
        -t

        AX=0C31 BX=0000 CX=0020 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
        DS=0C31 ES=0C21 SS=0C31 CS=0C32 IP=0008 NV UP EI PL NZ NA PO NC
        0C32:0008 B409 MOV AH,09

        DX的值重新置為0.

        單步:

        AX=0931 BX=0000 CX=0020 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
        DS=0C31 ES=0C21 SS=0C31 CS=0C32 IP=000A NV UP EI PL NZ NA PO NC
        0C32:000A CD21 INT 21

        09送入AX的高八位

        單步:

        AX=0931 BX=0000 CX=0020 DX=0000 SP=FFFA BP=0000 SI=0000 DI=0000
        DS=0C31 ES=0C21 SS=0C31 CS=00A7 IP=107CNV UP DI PL NZ NA PO NC
        00A7:107C 90 NOP

        引發21號中斷,程序跳轉

        下面的都是一些中斷功能,介于同學們還沒有學習到,所以反匯編暫時分析到這兒。

        最后看一下內存的儲存情況:

        -d 0c31:0
        0C31:0000 48 65 6C 6C 6F 20 77 6F-72 6C 64 21 24 00 00 00 Hello world!$...
        0C31:0010 B8 31 0C 8E D8 BA 00 00-B4 09 CD 21 B4 4C CD 21 .1.........!.L.!
        0C31:0020 04 26 80 7F 04 03 75 07-26 80 7F 0A 00 74 37 A1 .&....u.&....t7.
        0C31:0030 58 27 39 06 36 22 72 14-BE 36 22 8B 1C FF 04 2B X9.6"r..6"....+
        0C31:0040 D8 D1 E3 D1 E3 8B 36 04-06 EB 10 90 BE 36 22 8B ......6......6".
        0C31:0050 1C FF 04 D1 E3 D1 E3 8B-36 92 12 8B 46 08 8B 56 ........6...F..V
        0C31:0060 0A 89 00 89 50 02 5E 5D-C3 90 55 8B EC 83 EC 18 ....P.^]..U.....
        0C31:0070 57 56 8B 5E 04 8B 07 8B-57 02 89 46 F8 89 56 FA WV.^....W..F..V.

        可以看出,我們的程序是成功的。




        評論


        技術專區

        關閉
        主站蜘蛛池模板: 五莲县| 博兴县| 东乡族自治县| 房山区| 龙里县| 瓮安县| 阜宁县| 蕲春县| 东明县| 封开县| 璧山县| 铜川市| 南溪县| 越西县| 陆川县| 潮州市| 于都县| 铁岭县| 蒲城县| 陆河县| 阳城县| 汪清县| 隆子县| 伊川县| 平谷区| 获嘉县| 阿勒泰市| 盈江县| 万全县| 嘉禾县| 囊谦县| 山西省| 临澧县| 黔南| 朝阳市| 舒兰市| 绍兴县| 嵊州市| 寿光市| 萝北县| 武安市|