C交叉编译器中的分段内存模型



我在8086实际模式下做一些工作。我习惯于在组装中进行此操作,但想尝试C编译器。在我看来,编译器认为所有细分寄存器都具有相同的值。就我而言,事实并非如此; SS是0x4c0 ,而 ds = es = CS = 0x800

因此,在编译时,以下内容会产生代码,而不会涉及ss<> ds的事实。

[来源:这里]

uint8 ch;
void main()
{
    uint8 hexchars[] = {'0','1','2','3','4','5','6','7','8','9','A','B',
                        'C','D','E','F'};
    uint8 i = 0;
    ch = hexchars[i];
}

编译时,作业会产生:[完整来源:此处]

// ch = hexchars[i];
00000156  8A46FF            mov al,[bp-0x1]        ; 'i' is at [BP - 0x1]
00000159  30E4              xor ah,ah
0000015B  89C7              mov di,ax
0000015D  89EE              mov si,bp
0000015F  89FB              mov bx,di
00000161  8A40EF            mov al,[bx+si-0x11      ; 'hexchars[0] is at [BP - 0x11]
00000164  A28401            mov [0x184],al          ; 'ch' is at location 0x184

由于未明确提及SS,因此DS将由汇编程序假设。

如上所述,在我的情况下 ss <> ds ,因此,Al现在有一个来自错误的地址的值。

mov al, ds :[bx si -0x11]<> mov al, ss :[BX SI -0x11]

编译器我尝试了

1。GCC版本6.2.0(Sourcery Codebench Lite 2016.11-64(

ia16-elf-gcc -Wall main.c -o main.com -T main.ld

链接文件如下:

OUTPUT_FORMAT(binary)
SECTIONS
{
    . = 0x0;
    .text :
    {
        *(.text);
    }
    .data :
    {
        *(.data);
        *(.bss);
        *(.rodata);
    }
    _heap = ALIGN(4);
    /DISCARD/ : 
    {
         *(.eh_frame)
    }
}

2。Bruce的C编译器 [BCC在此处使用的全源]

bcc -ansi -0 -W -c main.c -o main.o
ld86 -d main.o -o main.com -T000

更新:尝试了Smallerc。在这里再次假设SS = DS。

3。较小的c [源在这里]

    smlrc -seg16 -Wall main.c main.s
    nasm -f bin main.s -o main.com

在两个编译器中,结果或多或少是相同的。从stack 读取时,没有编译器明确指定SS。问题是有一种方法可以通知编译器的约束,我在做错了什么。

您是否尝试过Watcom或Borland编译器?沃特科姆(Watcom(将其扔到篱笆上/开放式套房之前。他们有16位的多模型编译器。我不知道Borlands的状态;但是,如果您可以找到图像,则可以在QEMU下比在真实机器上运行的速度更快地运行它。

他们支持多个内存模型;您可能想要的是 compact :16位代码指针,32位数据指针。这里有一个参考:什么....

即使您完成了此操作,取决于您尝试做的事情,最终也可能会得到这些奇怪的东西,称为细分修复程序,这些内容允许在1MB地址空间内进行有限的程序搬迁。这些变老了。

为了使生活更轻松,您可以使用微小的模型(生成真实图像(;并使所有外部数据由明确的遥远指针引用。这是一个怪异的黑客,您可以在其中得到:

const char far const * const far *p;

不是在开玩笑。80年代和90年代看到C和C 之间的赛马,以创建最多的程序员敌对语法。显然,C 赢了,但ISO-C委员会拒绝扔毛巾,每隔几年使世界变得更加疯狂。

一些建议:将机器翻转为32位模式,并使用一些理智的工具。

相关内容

  • 没有找到相关文章

最新更新