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,来自我发现的).有什么区别吗?我可以选择哪一种更适合我吗?前者看起来更容易理解和更清楚,但我可以使用它而不是后者吗?
这在很大程度上取决于您的目标操作系统(或 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$"\nRun Code Online (Sandbox Code Playgroud)\n\n使用以下命令编译此文件 ( hw.S):
$ gcc -c -o hw.o hw.S\n$ ld -nostdlib -Ttext 0x0100 -N -e _start -Bstatic --oformat=binary -o hw.com hw.o\nRun 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\nELKS 也是一个有趣的 i8086 目标,但我还没有用它做太多事情。请确保您获得的 GNU 版本足够新以了解该.intel_syntax noprefix模式。
| 归档时间: |
|
| 查看次数: |
1474 次 |
| 最近记录: |