我正在处理汇编语言的作业...
有两个文件hello.c和world.asm,教授要求我们使用gcc和nasm编译这两个文件,并将目标代码链接在一起。
我可以在64位的ubuntu12.10下做,用原生的gcc和nasm。
但是当我通过cygwin 1.7在64位Win8上尝试同样的事情时(首先,我尝试使用gcc,但不知何故-m64选项不起作用,由于教授要求我们生成64位代码,我在谷歌上搜索并找到了一个名为mingw-w 64的包,其中包含一个编译器x86_64-w 64-mingw 32-gcc,我可以使用-m64),我可以将文件编译为mainhello.o和world.o并将它们链接到一个main.out文件,但不知何故,当我键入“./main.out”并等待“Hello world”时,什么也没有发生,没有输出,也没有错误消息。
新用户因此不能张贴图片,很抱歉,这里是在Cygwin shell中发生的事情的截图:
我只是一个新手,我知道我可以在ubuntu下完成任务,但我只是好奇这里发生了什么?
谢谢你们
hello.c
//Purpose: Demonstrate outputting integer data using the format specifiers of C.
//
//Compile this source file: gcc -c -Wall -m64 -o mainhello.o hello.c
//Link this object file with all other object files:
//gcc -m64 -o main.out mainhello.o world.o
//Execute in 64-bit protected mode: ./main.out
//
#include <stdio.h>
#include <stdint.h> //For C99 compatability
extern unsigned long int sayhello();
int main(int argc, char* argv[])
{unsigned long int result = -999;
printf("%s\n\n","The main C program will now call the X86-64 subprogram.");
result = sayhello();
printf("%s\n","The subprogram has returned control to main.");
printf("%s%lu\n","The return code is ",result);
printf("%s\n","Bye");
return result;
}
world.asm
;Purpose: Output the famous Hello World message.
;Assemble: nasm -f elf64 -l world.lis -o world.o world.asm
;===== Begin code area
extern printf ;This function will be linked into the executable by the linker
global sayhello
segment .data ;Place initialized data in this segment
welcome db "Hello World", 10, 0
specifierforstringdata db "%s", 10,
segment .bss
segment .text
sayhello:
;Output the famous message
mov qword rax, 0
mov rdi, specifierforstringdata
mov rsi, welcome
call printf
;Prepare to exit from this function
mov qword rax, 0
ret;
;===== End of function sayhello
1条答案
按热度按时间ibps3vxo1#
当与问题中的C Package 器链接在一起并在普通cmd窗口中运行时,它工作正常:
根据您的工具链,您可能需要从符号中移除前导下划线。