. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->自由讨论区
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  麻烦看一下下面的代码,为什么输出文件会这么大?  [待解决] 回复[ 4次 ]   点击[ 215次 ]  
kenvi
[帖 主]   [ 发表时间:2011-11-17 20:14 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-10-19 22:02
第一个文件
==========================pm.inc==============================
; 描述符类型
DA_32                EQU        4000h        ; 32 位段

DA_DPL0                EQU          00h        ; DPL = 0
DA_DPL1                EQU          20h        ; DPL = 1
DA_DPL2                EQU          40h        ; DPL = 2
DA_DPL3                EQU          60h        ; DPL = 3

; 存储段描述符类型
DA_DR                EQU        90h        ; 存在的只读数据段类型值
DA_DRW                EQU        92h        ; 存在的可读写数据段属性值
DA_DRWA                EQU        93h        ; 存在的已访问可读写数据段类型值
DA_C                EQU        98h        ; 存在的只执行代码段属性值
DA_CR                EQU        9Ah        ; 存在的可执行可读代码段属性值
DA_CCO                EQU        9Ch        ; 存在的只执行一致代码段属性值
DA_CCOR                EQU        9Eh        ; 存在的可执行可读一致代码段属性值

; 系统段描述符类型
DA_LDT                EQU          82h        ; 局部描述符表段类型值
DA_TaskGate        EQU          85h        ; 任务门类型值
DA_386TSS        EQU          89h        ; 可用 386 任务状态段类型值
DA_386CGate        EQU          8Ch        ; 386 调用门类型值
DA_386IGate        EQU          8Eh        ; 386 中断门类型值
DA_386TGate        EQU          8Fh        ; 386 陷阱门类型值


SA_RPL0                EQU        0        ; ┓
SA_RPL1                EQU        1        ; ┣ RPL
SA_RPL2                EQU        2        ; ┃
SA_RPL3                EQU        3        ; ┛

SA_TIG                EQU        0        ; ┓TI
SA_TIL                EQU        4        ; ┛
;----------------------------------------------------------------------------



; 宏 ------------------------------------------------------------------------------------------------------
;
; 描述符
; usage: Descriptor Base, Limit, Attr
;        Base:  dd
;        Limit: dd (low 20 bits available)
;        Attr:  dw (lower 4 bits of higher byte are always 0)
%macro Descriptor 3
        dw        %2 & 0FFFFh                                ; 段界限1
        dw        %1 & 0FFFFh                                ; 段基址1
        db        (%1 >> 16) & 0FFh                        ; 段基址2
        dw        ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh)        ; 属性1 + 段界限2 + 属性2
        db        (%1 >> 24) & 0FFh                        ; 段基址3
%endmacro ; 共 8 字节
;
; 门
; usage: Gate Selector, Offset, DCount, Attr
;        Selector:  dw
;        Offset:    dd
;        DCount:    db
;        Attr:      db
%macro Gate 4
        dw        (%2 & 0FFFFh)                                ; 偏移1
        dw        %1                                        ; 选择子
        dw        (%3 & 1Fh) | ((%4 << 8) & 0FF00h)        ; 属性
        dw        ((%2 >> 16) & 0FFFFh)                        ; 偏移2
%endmacro ; 共 8 字节


第二个文件

; ==========================================
; pmtest1.asm
; 编译方法:nasm pmtest1.asm -o pmtest1.bin
; ==========================================

%include        "pm.inc"        ; 常量, 宏, 以及一些说明

org        07c00h
        jmp        LABEL_BEGIN

[SECTION .gdt]
; GDT
;                              段基址,       段界限     , 属性
LABEL_GDT:           Descriptor       0,                0, 0           ; 空描述符
LABEL_DESC_CODE32: Descriptor       0, SegCode32Len - 1, DA_C + DA_32; 非一致代码段
LABEL_DESC_VIDEO:  Descriptor 0B8000h,           0ffffh, DA_DRW             ; 显存首地址
; GDT 结束

GdtLen                equ        $ - LABEL_GDT        ; GDT长度
GdtPtr                dw        GdtLen - 1        ; GDT界限
                dd        0                ; GDT基地址

; GDT 选择子
SelectorCode32                equ        LABEL_DESC_CODE32        - LABEL_GDT
SelectorVideo                equ        LABEL_DESC_VIDEO        - LABEL_GDT
; END of [SECTION .gdt]

[SECTION .s16]
[BITS        16]
LABEL_BEGIN:
        mov        ax, cs
        mov        ds, ax
        mov        es, ax
        mov        ss, ax
        mov        sp, 0100h

        ; 初始化 32 位代码段描述符
        xor        eax, eax
        mov        ax, cs
        shl        eax, 4
        add        eax, LABEL_SEG_CODE32
        mov        word [LABEL_DESC_CODE32 + 2], ax
        shr        eax, 16
        mov        byte [LABEL_DESC_CODE32 + 4], al
        mov        byte [LABEL_DESC_CODE32 + 7], ah

        ; 为加载 GDTR 作准备
        xor        eax, eax
        mov        ax, ds
        shl        eax, 4
        add        eax, LABEL_GDT                ; eax <- gdt 基地址
        mov        dword [GdtPtr + 2], eax        ; [GdtPtr + 2] <- gdt 基地址

        ; 加载 GDTR
        lgdt        [GdtPtr]

        ; 关中断
        cli

        ; 打开地址线A20
        in        al, 92h
        or        al, 00000010b
        out        92h, al

        ; 准备切换到保护模式
        mov        eax, cr0
        or        eax, 1
        mov        cr0, eax

        ; 真正进入保护模式
        jmp        dword SelectorCode32:0        ; 执行这一句会把 SelectorCode32 装入 cs,
                                        ; 并跳转到 Code32Selector:0  处
; END of [SECTION .s16]


[SECTION .s32]; 32 位代码段. 由实模式跳入.
[BITS        32]

LABEL_SEG_CODE32:
        mov        ax, SelectorVideo
        mov        gs, ax                        ; 视频段选择子(目的)

        mov        edi, (80 * 11 + 79) * 2        ; 屏幕第 11 行, 第 79 列。
        mov        ah, 0Ch                        ; 0000: 黑底    1100: 红字
        mov        al, 'P'
        mov        [gs:edi], ax

        ; 到此停止
        jmp        $

SegCode32Len        equ        $ - LABEL_SEG_CODE32
; END of [SECTION .s32]
times 510-($-$$) db 0
dw 0xaa55

===========================================================================
请问,我用nams pmtest1.asm -o pmtest1.bin,生成的二进制文件有640字节?
我的环境:
1、系统 Ubuntu 11.10,32位系统,内核3.0.0-13-generic
2、编译器 NASM version 2.07 compiled on Nov  4 2011

这个问题纠结我好长时间了,麻烦哪位同学给解答一下。
kenvi
[第1楼]   [ 回复时间:2011-11-18 20:46 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-10-19 22:02
顶起,求解释~~
tomato
[第2楼]   [ 回复时间:2011-11-19 13:43 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
这是32位的汇编吧?很想帮你解决,但是,有些力不从心。为什么纠结输出文件的大小?640个字节,很大?大概应该是多大?你可以改动一下你的程序,是不是都是这么大?有没有你认为正常的情况?多调试测试几种方法,找到问题的所在。
kenvi
[第3楼]   [ 回复时间:2011-11-20 14:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-10-19 22:02
回复:[第2楼]
------------------
times 510-($-$$) db 0
dw 0xaa55 
这里进行了限制,大小是512字节,但是如果去掉这两行,就只有100多字节。
kenvi
[第4楼]   [ 回复时间:2011-11-20 14:23 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2008-10-19 22:02
继续顶起,求高手
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved