gcc-masm=英特尔为我提供小写助记符

gcc-masm=英特尔为我提供小写助记符,gcc,assembly,gnu-assembler,x86,Gcc,Assembly,Gnu Assembler,X86,用 gcc -masm=intel basic.c -o basic.asm 生成的程序集如下所示: .cfi_startproc push rbp .cfi_def_cfa_offset 16 .cfi_offset 6, -16 mov rbp, rsp /I expected mov to be MOV .cfi_def_cfa_register 6 mov QWORD PTR [rbp-8], OFFSET FLAT:.LC0

gcc -masm=intel basic.c -o basic.asm
生成的程序集如下所示:

.cfi_startproc
    push    rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    mov rbp, rsp /I expected mov to be MOV
    .cfi_def_cfa_register 6
    mov QWORD PTR [rbp-8], OFFSET FLAT:.LC0
    mov eax, 0
    pop rbp /I expected pop to POP
    .cfi_def_cfa 7, 8
    ret
    .cfi_endproc
我在英特尔X86_64计算机上,在《英特尔软件开发人员手册》中,我知道助记符都是大写的(这意味着他们建议使用它)。

gcc是否有提供大写助记符的选项?

FYI,要去除gcc asm输出中的“噪音”(
.cfi
指令、未使用的标签等),请参阅。戴上你的密码就行了


在《英特尔软件开发人员手册》中,助记符都是大写的(这意味着他们建议使用它?)

我认为他们使用全大写作为代码格式的替代,因此他们可以毫无疑问地编写“”之类的内容(因为“按位and运算”也是一个有效的英语短语)。他们本可以“执行按位
操作”,但他们没有

他们在助记符和注册名中使用所有大写字母并不意味着这是正确的编码方式。英特尔的教程/文章通常包含大量asm代码()。在清单1中,他们使用小写助记符并为所有内容注册名称,我认为他们这样做是为了突出显示它,因为这是他们教给您的新指令。他们还在显示助记符映射到哪个指令的字段中使用小写助记符(编译器优化可以选择不同的INSN…)

助记符和寄存器名称不区分大小写。大多数人喜欢小写。好的样式还包括将操作数缩进到一致的列,注释也是如此,这样代码就不会显得杂乱无章。而且代码的缩进总是比标签多,所以您可以快速看到标签(分支目标)。例如,这一点说明了我认为合理的好风格

; optimized for code-size, not speed
slow_small_addler32:
    xor     eax,eax         ; scratch reg for loading bytes
    cdq                     ; edx: high=0
    lea     edi, [rdx+1]    ; edi: low=1
    ;jrcxz  .end            ; We don't handle len=0.  unlike rep, loop only checks rcx after decrementing
.byteloop:
    lodsb                   ; upper 24b of eax stays zeroed (no partial-register stall on Intel P6/SnB-family CPUs, thanks to the xor-zeroing)
    add     edi, eax        ; low += zero_extend(buf[i])
    add     edx, edi        ; high += low
    loop   .byteloop      ; only use LOOP for small code-size, not speed
.end:
    ;; exit when ecx = 0, eax = last byte of buf
    ;; lodsb at this point would load the terminating 0 byte, conveniently leaving eax=0
 ... more code
另请参见此链接,链接自TagWiki


gcc有没有一个选项可以让我使用大写助记符

不可以。如果您愿意,您可以升级指令助记符并使用
sed
或其他方法注册名称。(但您必须小心不要咀嚼符号名称,因为它们区分大小写)


脚本中的模式匹配可能对这一点很有用,但我没有太多关注js源代码。

这只是风格问题;我所知道的x86汇编程序中没有一个在助记符方面是区分大小写的,我使用的大多数“当前”调试器(gdb、VC++、WinDbg)都使用小写助记符。就我个人而言,我觉得小写更可读。@MatteoItalia我明白了,谢谢好的注释:)Supercol:)解释得很好&谢谢链接。。相信我,我已经考虑过写一个小的sed脚本来将助记符转换成大写