程序集程序运行并立即崩溃而不打印Hello World消息

时间:2014-12-15 19:47:44

标签: windows assembly x86 nasm ld

好吧基本上我只是编写一个C程序来构建我的目标文件,然后分别使用nasm和ld从它们创建可执行文件

我编写的程序对nasm和ld进行了正确的调用,但是我使用-f win32 / win64编译好(我在64位Windows 7机器上)或者使用其他选项失败,但这很好。 。 对?如果程序编译并创建它运行的exe并立即崩溃而不打印Hello World消息。我真的很喜欢参加集会。一些帮助 ?

section .text
    global _start   ;must be declared for linker (ld)
_start:             ;tells linker entry point
    mov edx,len     ;message length
    mov ecx,msg     ;message to write
    mov ebx,1       ;file descriptor (stdout)
    mov eax,4       ;system call number (sys_write)
    int 0x80        ;call kernel

    mov ah,00
    int 16h

    mov eax,1       ;system call number (sys_exit)
    int 0x80        ;call kernel

    section .data
    msg db 'Hello, world!', 0xa  ;our dear string
    len equ $ - msg     ;length of our dear string

我也碰巧有一个kali系统;我不认为我可以在不使用Wine的情况下为两个操作系统编译?

所以我的C程序运行得很好!我找不到任何代码组装的例子。嗯,我可以......但都失败了。有人有链接吗?

    #include <stdio.h>
    #include <stdlib.h>
    #include <CustomHeader_Small.h>
    void Assemble(void);
    void PrintMenu(void);
    void LoadOptions(void);
    void SaveOptions(void);
    char TempBuff[255];
    char Format[30];

void SaveOptions(void)
{
  FILE *Source = fopen("Settings.ini","w");
    if(Source)
    {
     printf("%s","Enter A Format Type ->");
     scanf("%s",Format);                    //Save Format
     fprintf(Source,"Format:%s",Format);
     fclose(Source);
     puts("Settings Updated!");
    LoadOptions();
    }
return;
}

void LoadOptions(void)
{
    FILE *Source = fopen("Settings.ini","r");
    if(Source)
    {
     char ch;
     int i;
     char Line[50];
     fscanf(Source,"%s",Line);
     CCopy(Line,CPos(Line,":",0)+1,CLen(Line),Format,0,1);
     free(Line);
    }
    else
    {
        Source = fopen("Settings.ini","w");
        fprintf(Source,"%s","Format:Win32");
        fclose(Source);
    }
    PrintMenu();
    LoadOptions();
    return;
}
void PrintMenu(void)
{
printf("%s","Menu:\n________\n1.) [C]reate A New Project.\n2.) [O]pen A Project.\n3.) [A]ssemble A Project.\n4.) [E]dit Settings\n");
printf("%s","5.) [Q]uit\n");
return;
}
void Assemble(void)
{
    char *File=malloc(256);
    printf("Note : Compiling In %s Mode\n",Format);
    printf("%s","Enter A Project Name -> ");
    scanf("%s",File);
    char *Command;
    int ch;
    while((ch=getchar())!='S')
    {
    Command=malloc(1024);
    strcpy(Command,"H:\\Users\\Grim\\AppData\\Local\\nasm\\nasm.exe -f ");
    strcat(Command,Format);
    strcat(Command," ");
    strcat(Command,File);
    strcat(Command,"\\");
    strcat(Command,File);
    strcat(Command,".asm ");
    strcat(Command,"-o ");
    strcat(Command,File);
    strcat(Command,"\\");
    strcat(Command,File);//This Creates The Object File Using Nasm ( Not Just Yet But Were Well On Our Way!
    strcat(Command,".o");

    system(Command); //Calls Nasm.

    free(Command);
    Command=malloc(1024);
    strcpy(Command,"H:\\MinGW\\bin\\ld.exe ");
    strcat(Command,File);
    strcat(Command,"\\");
    strcat(Command,File);
    strcat(Command,".o ");
    strcat(Command,"-o ");
    strcat(Command,File);//This Creates The Executable File Using Nasm ( Not Just Yet But Were Well On Our Way!
    strcat(Command,"\\");
    strcat(Command,File);
    strcat(Command,".exe");


    system(Command); //Calls Nasm.

    free(Command);
    puts("Press Enter To Compile Again But Enter An [S] Followed By Enter To [S]top.");
    }

    free(File);
    puts("NasmWrapper Assembly Done!");
    printf("%s","\n\n\n");
    PrintMenu();
    return;
}

int main()
{
    LoadOptions();
    char ch;
    while((ch = getchar())!='Q')
    {
    if(ch=='A') Assemble();
    if(ch=='E') SaveOptions();

    }
    return 0;
}

对C程序的任何评论都会很好:D感谢您解释如何使用[Code]的东西。

1 个答案:

答案 0 :(得分:1)

除了奇怪的int 16h *之外,您的汇编程序专门用于Linux(32位Linux,更准确)。 int 0x80是您调用其中一个Linux kernel system calls的方式。

Windows并没有这样做。取而代之的是call the Windows API or the C standard library

这种特定于操作系统的变体是使用更高级语言而不是汇编语言的好处之一。

如果你想玩汇编,我的建议是决定你想要从哪个操作系统开始,并专门使用它开始。查找一些教程(lots for LinuxWindows)并开始使用。一旦你让它适用于一个操作系统,请尝试另一个操作系统。

* int 16h从DOS调用BIOS。这在Linux中不起作用。