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.