gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:44:30 28 4
gpt4 key购买 nike

在学习了 Intel 8080 结构之后,我现在正在尝试学习 Intel 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

虽然我还发现:
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

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

最佳答案

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

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

如果你想使用 GNU 汇编器(例如在 MirBSD 或 GNU/Linux 上)来定位 i8086 MS-DOS .COM 程序,你可以使用这个:

        .intel_syntax noprefix
.code16
.text

.globl _start
_start: mov ah,9
mov dx,offset msg
int 0x21
/* exit(0); ← this is a comment */
mov ax,0x4C00
int 0x21

msg: .ascii "Hello, World!\r\n$"

使用以下命令编译此文件 ( hw.S ):
$ gcc -c -o hw.o hw.S
$ ld -nostdlib -Ttext 0x0100 -N -e _start -Bstatic --oformat=binary -o hw.com hw.o

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

与其他解决方案相比,您没有在程序集文件中定义原点 (org),而是在链接器 (ld) 命令行中定义。

我也有 an example targetting raw x86 BIOSanother one (bootsector for blocklists)another one (bootsector for *.tar archives) ,如果你有兴趣;但是,它们需要不同的来源,并且即使它们仅使用 16 位模式,也需要 i386 CPU。

你不能那样做 *.EXE 文件。

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

关于assembly - 我应该为 Intel 8086 DOS 程序集使用什么代码框架?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20265256/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com