Gcc really knows how to output a NASM assembly

So, I have a simple C program that goes through the arguments passed to main and 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 the assembly in NASM format. I was looking at the output in a .asm file and noticed that the syntax is TASM. Below is the make file and the output from gcc. Am I doing something wrong or does this not mean that gcc does not output the 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 

Errors on the command line:

 [ 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 made me believe that this is the TASM syntax - this is the information posted at this link: http://rs1.szif.hu/~tomcat/win32/intro.txt

TASM encoders usually have problems with Vocabulary, as the "ptr" keyword, commonly used in TASM, is missing.

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, it simply means:

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

NASM allows you to use these keywords in many places and, thus, gives you a lot of control over the generated operation codes unilaterally, for Example All of them are valid:

push dword 123 jmp [ds: word 1234]; they both determine the offset size jmp [ds: dword 1234]; for tricky code when the interface is 32bit and; 16-bit segments

he can get quite hairy, but it's important to remember that you can have all the control you need when you want it.

+3
source share
1 answer

Intel Syntax means Intel Syntax, not NASM Syntax. MASM and TASM syntax is based on Intel syntax, NASM syntax is inspired by Intel syntax, but it is different.

Which gcc outputs represent gas syntax using Intel syntax for individual instructions (Assembler directives, tags, etc. use gas-specific syntax)

+7
source

Source: https://habr.com/ru/post/1241892/


All Articles