Does gcc really know how to output NASM Assembly

匿名 (未验证) 提交于 2019-12-03 02:22:01

问题:

So I have a simple C program that loops through the args passed to main then returns:

#include <stdio.h>  int main(int argc, char *argv[]) {     int i;     for(i = 0; i < argc; ++i) {         fprintf(stdout, "%s\n", argv[i]);     }     return 0; } 

I wanted to see how gcc wrote out the assembly in NASM format. I was looking over the output in the .asm file and noticed that the syntax was TASM. Below is the make file and the output from gcc. Am I doing something wrong or is it that gcc does not output true NASM syntax?

all: main  main: main.o         ld -o main main.o  main.o : main.c         gcc -S -masm=intel -o main.asm main.c         nasm -f elf -g -F stabs main.asm -l main.lst 

AND

    .file   "main.c"     .intel_syntax noprefix     .section    .rodata .LC0:     .string "%s\n"     .text .globl main     .type   main, @function main:     push    ebp     mov ebp, esp     and esp, -16     sub esp, 32     mov DWORD PTR [esp+28], 0     jmp .L2 .L3:     mov eax, DWORD PTR [esp+28]     sal eax, 2     add eax, DWORD PTR [ebp+12]     mov ecx, DWORD PTR [eax]     mov edx, OFFSET FLAT:.LC0     mov eax, DWORD PTR stdout     mov DWORD PTR [esp+8], ecx     mov DWORD PTR [esp+4], edx     mov DWORD PTR [esp], eax     call    fprintf     add DWORD PTR [esp+28], 1 .L2:     mov eax, DWORD PTR [esp+28]     cmp eax, DWORD PTR [ebp+8]     jl  .L3     mov eax, 0     leave     ret     .size   main, .-main     .ident  "GCC: (GNU) 4.5.1 20100924 (Red Hat 4.5.1-4)"     .section    .note.GNU-stack,"",@progbits 

The errors on the command line are:

[mehoggan@fedora sandbox-print_args]$ make gcc -S -masm=intel -o main.asm main.c nasm -f elf -g -F stabs main.asm -l main.lst main.asm:1: error: attempt to define a local label before any non-local labels main.asm:1: error: parser: instruction expected main.asm:2: error: attempt to define a local label before any non-local labels main.asm:2: error: parser: instruction expected main.asm:3: error: attempt to define a local label before any non-local labels main.asm:3: error: parser: instruction expected main.asm:4: error: attempt to define a local label before any non-local labels main.asm:5: error: attempt to define a local label before any non-local labels main.asm:5: error: parser: instruction expected main.asm:6: error: attempt to define a local label before any non-local labels main.asm:7: error: attempt to define a local label before any non-local labels main.asm:7: error: parser: instruction expected main.asm:8: error: attempt to define a local label before any non-local labels main.asm:8: error: parser: instruction expected main.asm:14: error: comma, colon or end of line expected main.asm:17: error: comma, colon or end of line expected main.asm:19: error: comma, colon or end of line expected main.asm:20: error: comma, colon or end of line expected main.asm:21: error: comma, colon or end of line expected main.asm:22: error: comma, colon or end of line expected main.asm:23: error: comma, colon or end of line expected main.asm:24: error: comma, colon or end of line expected main.asm:25: error: comma, colon or end of line expected main.asm:27: error: comma, colon or end of line expected main.asm:29: error: comma, colon or end of line expected main.asm:30: error: comma, colon or end of line expected main.asm:35: error: parser: instruction expected main.asm:36: error: parser: instruction expected main.asm:37: error: parser: instruction expected make: *** [main.o] Error 1 

What lead me to believe that this is TASM syntax was information posted at this link: http://rs1.szif.hu/~tomcat/win32/intro.txt

TASM coders usually have lexical difficulties with NASM because it lacks the "ptr" keyword used extensively in TASM.

TASM uses this:

mov al, byte ptr [ds:si] or mov ax, word ptr [ds:si] or mov eax, dword ptr [ds:si]

For NASM This simply translates into:

mov al, byte [ds:si] or mov ax, word [ds:si] or mov eax, dword [ds:si]

NASM allows these size keywords in many places, and thus gives you a lot of control over the generated opcodes in a unifrom way, for example These are all valid:

push dword 123 jmp [ds: word 1234] ; these both specify the size of the offset jmp [ds: dword 1234] ; for tricky code when interfacing 32bit and ; 16bit segments

it can get pretty hairy, but the important thing to remember is you can have all the control you need, when you want it.

回答1:

Intel syntax means Intel syntax, not NASM syntax. MASM and TASM syntaxes are based on Intel Syntax, NASM syntax gets inspiration from Intel syntax, but it is different.

What gcc outputs is actually gas syntax using Intel syntax for individual instructions, (Assembler directives, labels et al. use gas-specific syntax)



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!