【问题标题】:How to compile this Assembly code?如何编译这个汇编代码?
【发布时间】:2015-05-12 11:23:54
【问题描述】:

我在*(意大利语)页面上找到了这些代码,其中包含一些描述行:

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

【问题讨论】:

  • 你不编译汇编代码,你用汇编器汇编它。你有 DOS 环境吗?
  • @Marco Favorito 由于汇编代码是与 MASM 兼容的汇编代码,那么看来您应该使用一些旧的 MS C++。
  • 这是用于古董 C 编译器的非常古老的 16 位 MS-DOS 代码。我不确定是哪一个,也许是 Turbo-C?除非你已经精通 C 并且对考古有强烈的兴趣,否则你就是在浪费时间。
  • @Vlad:这段代码可能早于 MS-C++
  • 不是第一个用于生成过时的 .com 可执行格式的 asm 代码吗?

标签: c gcc assembly


【解决方案1】:

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

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

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

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

【讨论】:

  • VIsual C / C++ 4.1 cd-rom 包括 16 位 Visual C / C++ 1.52,但不包括汇编程序。
  • 第二个片段会这样。 1.52 支持内联汇编。
  • 1) 这两种情况都是用 Intel x86 语法编写的,不是吗?这些语言的较新版本是哪些? 2) 我的目的是让“int 21h”在其他环境和更常用的汇编语言中工作:我需要一个 MS-DOS 模拟器或 MS-DOS 机器吗?以下 Windows 操作系统的版本适合这个吗? 3)从 C 源代码到汇编代码的可执行文件的步骤是什么,所以允许我用“int 21h”修改代码,最后生成一个可执行文件(可能工作)? (即“gcc prog.c -S ;gcc -o prog prog.s”)。我不能使用 UNIX GNU 标准,不是吗?
  • Int21h 是一个纯粹的 MS-DOS 功能。它既不适用于现代 Windows,也不适用于 Linux/Unix。 1) 是的。 C 和汇编仍然存在,但与操作系统交互的技术不同。 2) 你需要一个 MS-DOS 模拟器或机器。 3)你需要一个编译器/汇编器,看我的回答。
  • Windows 32 位版本中的dos 控制台窗口也支持16 个实模式MSDOS 程序,有点类似于虚拟机。它包括 debug.com,一个 16 位实模式调试器。如果您运行的是 64 位版本的 Windows,您可以创建一个 Virtual PC 并在其中“安装”MSDOS(传输文件有点混乱)。你也可以使用 DOSBOX。