Действительно ли gcc знает, как вывести сборку NASM



Итак, у меня есть простая программа на C, которая циклически перебирает args, передаваемые в main, а затем возвращает:



#include <stdio.h>

int main(int argc, char *argv[])
{
int i;
for(i = 0; i < argc; ++i) {
fprintf(stdout, "%sn", argv[i]);
}
return 0;
}


Я хотел посмотреть, как gcc записывает сборку в формате NASM. Я осматривал выход в поле .ASM файл и заметил, что синтаксис был TASM. Ниже представлен файл и выход из Персидского залива. Я делаю что-то не так или gcc не выводит истинный синтаксис NASM?



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


И



    .file   "main.c"
.intel_syntax noprefix
.section .rodata
.LC0:
.string "%sn"
.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


Ошибки в командной строке:



[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


К чему я веду поверьте, что это синтаксис TASM была информация, размещенная по этой ссылке:
http://rs1.szif.hu/~tomcat/win32/intro.txt




Кодеры TASM обычно испытывают лексические трудности с NASM, потому что это
не хватает ключевого слова "ptr", широко используемого в TASM.



TASM использует это:



Mov al, байт ptr [ds: si] или mov ax, слово ptr [ds: si] или mov eax,
dword ptr [ds: si]



Для NASM это просто переводится в:



Mov al, байт [ds: si] или mov ax, word [ds: si] или mov eax, dword
[ds: si]



NASM позволяет эти ключевые слова размера во многих местах, и таким образом дает вам
много контроля над генерируемыми опкодами в unifrom пути, для
пример все это допустимо:



Нажмите dword 123 jmp [ds: word 1234] ; они оба определяют размер
смещения jmp [ds: dword 1234]; для хитрого кода, когда
сопряжение 32 бит и
; 16бит сегментов



Он может стать довольно волосатым, но главное, что нужно помнить-это ты.
может иметь весь контроль, который вам нужен, когда вы этого хотите.


729   1  

1 ответ:

Синтаксис Intel означает синтаксис Intel, а не синтаксис NASM. Синтаксисы MASM и TASM основаны на синтаксисе Intel, синтаксис NASM получает вдохновение от синтаксиса Intel, но он отличается.

То, что выводит gcc, на самом деле является синтаксисом gas, использующим синтаксис Intel для отдельных инструкций (директивы ассемблера, метки и др. использовать специфичный для газа синтаксис)

Comments

    Ничего не найдено.