我应该为Intel 8086 DOS程序集使用什么代码框架?

Str*_*tfw 8 x86 assembly dos x86-16

在学习了英特尔8080结构后,我现在正在尝试学习英特尔8086以及这里的程序如何布局.就目前而言,即使查看基本示例也是非常令人生畏的,更糟糕​​的是,我无法区分两种编写8086代码的方法,我偶然发现了.也就是说,有时候我会看到:

.model small
.stack 100h
.code

start:

mov dl, ‘a’ ; store ascii code of ‘a’ in dl
mov ah, 2h ; ms-dos character output function
int 21h ; displays character in dl register
mov ax, 4c00h ; return to ms-dos
int 21h

end start
Run Code Online (Sandbox Code Playgroud)

虽然我也发现:

Progr           segment
                assume  cs:Progr, ds:dataSeg, ss:stackSeg

start:          mov     ax,dataSeg
                mov     ds,ax
                mov     ax,stackSeg
                mov     ss,ax
                mov     sp,offset top


            mov     ah,4ch
            mov     al,0
            int     21h
Progr           ends

dataSeg            segment

dataSeg            ends

stackSeg          segment
                dw    100h dup(0)
top     Label word
stackSeg          ends

end start
Run Code Online (Sandbox Code Playgroud)

显然,我知道这两者做了很多不同的事情,但令我感到困惑的是一般语法有多么不同.在后者中我们有一些"段假设",而在前者中它只是.model,.stack和.code(有时.data,来自我发现的).有什么区别吗?我可以选择哪一种更适合我吗?前者看起来更容易理解和更清楚,但我可以使用它而不是后者吗?

mir*_*los 3

这在很大程度上取决于您的目标操作系统(或 BIOS 或裸机)、您的目标可执行格式以及您使用的汇编程序。

\n\n

您发布的第一个示例适用于 MS-DOS .COM 程序,第二个示例适用于 MS-DOS .EXE 程序,我假设两者都使用 Microsoft\xc2\xae 汇编程序。

\n\n

如果您想使用 GNU 汇编器(例如在 MirBSD 或 GNU/Linux 上)来针对 i8086 MS-DOS .COM 程序,您可以使用以下命令:

\n\n
        .intel_syntax noprefix\n        .code16\n        .text\n\n        .globl  _start\n_start: mov     ah,9\n        mov     dx,offset msg\n        int     0x21\n        /* exit(0); \xe2\x86\x90 this is a comment */\n        mov     ax,0x4C00\n        int     0x21\n\nmsg:    .ascii  "Hello, World!\\r\\n$"\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用以下命令编译此文件 ( hw.S):

\n\n
$ gcc -c -o hw.o hw.S\n$ ld -nostdlib -Ttext 0x0100 -N -e _start -Bstatic --oformat=binary -o hw.com hw.o\n
Run Code Online (Sandbox Code Playgroud)\n\n

我在 MirBSD/i386 下的 DOSBOX 中测试了结果,并在 hexdump 中查看它\xe2\x80\x99s 是否正确。

\n\n

与其他解决方案相反,您不在汇编文件中定义源 (org),而是在链接器 (ld) 命令行上定义,如下所示。

\n\n

我\xe2\x80\x99ve 还得到了一个针对原始 x86 BIOS 的示例,以及另一个(用于阻止列表的引导扇区)另一个(用于 *.tar 档案的引导扇区),以防您\xe2\x80\x99 感兴趣;但它们需要不同的来源,并且即使它们仅使用 16 位模式,它们也需要 i386 CPU。

\n\n

你可以\xe2\x80\x99t那样做*.EXE文件。

\n\n

ELKS 也是一个有趣的 i8086 目标,但我还没有用它做太多事情。请确保您获得的 GNU 版本足够新以了解该.intel_syntax noprefix模式。

\n