本文介绍了gcc是否真的知道如何输出NASM程序集的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

  #include  

.H>

int main(int argc,char * argv [])
{
int i;
for(i = 0; i fprintf(stdout,%s\,argv [i]);
}
返回0;
}

我想知道gcc如何以NASM格式写出程序集。我正在查看.asm文件中的输出,并注意到语法是TASM。以下是make文件和gcc的输出。我做错了什么或是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

AND

  .filemain.c
.intel_syntax noprefix
.section .rodata
.LC0:
.string%s\\\

.text
.globl main
.type main,@function
main:
push ebp
mov ebp,esp
和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
.identGCC:(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:错误:尝试在任何非本地标签之前定义本地标签
main.asm:1:错误:解析器:预期的指令
main.asm :2:错误:尝试在任何非本地标签之前定义本地标签
main.asm:2:错误:解析器:预期的指令
main.asm:3:错误:尝试定义本地任何非本地标签之前的标签
main.asm:3:error:parser:inst ruction expected
main.asm:4:错误:尝试在任何非本地标签之前定义本地标签
main.asm:5:错误:尝试在任何非本地标签之前定义本地标签
main.asm:5:error:解析器:预期的指令
main.asm:6:错误:尝试在任何非本地标签之前定义本地标签
main.asm:7:错误:尝试在任何非本地标签之前定义本地标签
main.asm:7:错误:解析器:预期的指令
main.asm:8:错误:尝试在任何非本地标签之前定义本地标签非本地标签
main.asm:8:错误:解析器:预期的指令
main.asm:14:错误:逗号,冒号或行尾预期
main.asm:17:错误:逗号,冒号或行结尾预期
main.asm:19:错误:逗号,冒号或行尾预期
main.asm:20:错误:逗号,冒号或行结束符
main.asm:21:错误:逗号,冒号或行结尾预期
main.asm:22:错误:逗号,冒号或行尾预期
main.asm:23:错误:逗号,冒号或行尾预期
main.asm:24:错误:逗号,冒号或行结尾预期
main.asm:25:错误:逗号,冒号或行结尾预期
main.asm:27:错误:逗号,冒号或行结尾预期
main.asm:29:错误:逗号,冒号或行结尾预期
main.asm:30:错误:逗号,冒号或行尾预期
main.asm:35:错误:解析器:预期的指令
main.asm:36:错误:解析器:预期的指令
main.asm:37:错误:解析器:预期的指令
make:*** [main.o]错误1

让我相信这是TASM语法是发布在此链接的信息:

解决方案

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)

这篇关于gcc是否真的知道如何输出NASM程序集的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

07-31 18:57