如何编译此汇编代码?

时间:2015-03-10 20:36:10

标签: c gcc assembly

我在维基百科(意大利语)页面上找到了关于"汇编"有一些描述行:

...示例程序" Hello world"在汇编Intel x86中使用Intel语法(使用对操作系统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但我必须修改语法。

1 个答案:

答案 0 :(得分:2)

这两个片段都是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命令行不会这样做。