c - 如何编译这个汇编代码?

标签 c gcc assembly

我在维基百科(意大利语)关于“程序集”的页面上找到了这些代码,其中包含一些描述行:

...示例程序“Hello world”,使用 Intel 语法汇编 Intel x86(使用对操作系统 DOS 的调用)。与 Assembly UNIX GNU 版本不兼容:

   MODEL SMALL
    STACK 100H
    .DATA
        HW      DB      "hello, world", 13, 10, '$'
    .CODE
    .STARTUP
        MOV AX, @data
        MOV DS, AX
        MOV DX, OFFSET HW
        MOV AH, 09H
        INT 21H
        MOV AX, 4C00H
        INT 21H
    END

...

...用 C-asm(使用 Intel x86 程序集)编写的代码示例,显示接收到的二进制数据中的数字作为输入,如下所示:

#include <stdio.h>
#include <iostream.h>
#include <conio.h>
int main() 
{
    int a;

    /* Acquisizione del valore numerico */
    printf("Inserisci un valore compreso tra -32768 e 32768: "); 
    scanf("%d", &a); 

    /* Visualizzazione del messaggio di risposta */
    printf("Il valore corrispondente in binario è: "); 

    /* Keyword per delimitare le sezioni di codice Assembly */
    asm 
    { 
        /* Visualizzazione della stringa di bit corrispondente */
        MOV BX,WORD PTR a
        MOV CX,00Ah
    }

    /* Etichetta esterna */
    Ciclo: 
        asm
        {
            /* Estrazione di un bit */
            MOV DL,00H
            RCL BX,1   /* Il valore del bit viene posto nel flag di carry */
            ADC DL,'0' /* Determino il carattere da visualizzare */
            MOV AH,02H /* Visualizzazione */
            INT 21h
            Loop Ciclo
        } 
    return 0;
}

编译这些代码的编译器或命令是什么?我尝试使用 gcc,但我必须修改语法。

最佳答案

这两个片段都是 MS-DOS 程序集。

第一个片段可以用 FASM 构建。 FASM 可以针对 MS-DOS。

对于第二个,您需要一个非常旧的 Microsoft C 编译器,例如 Quick C 2.x 或 MSC 6.x。 Microsoft C 的最新版本能够发出 Visual C++ 1.54 IIRC 附带的 16 位代码。所有这些编译器都已长期停产。

要执行其中任何一个,您需要一台 MS-DOS 机器或一个模拟器,例如 DOSBox。 Windows 命令行不行。

关于c - 如何编译这个汇编代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28973613/

相关文章:

c - 使用 malloc 从 main 打印在函数中创建的字符串数组时出现问题

CAN 总线确认错误

c - 从函数 c 返回多个值

c - GCC 计算 goto 和堆栈指针的值

c - 手动运行gcc的步骤,编译,汇编,链接

c - windows linux bash 上的 GCC

c - C头文件如何导入win32api函数?

c++ - 在 Windows 10 c++ x64 上从内存执行代码?

assembly - 了解 bset 和 bclr

c - GCC:为什么 const 数据填充在我的函数内部而不是开头?