标签: gnu-assembler

.comm是什么意思?

我刚刚翻译了这个程序,

#include <stdio.h>

int dam[1000][1000];


int main (int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用gcc生产组装,

    .cstring
LC0:
    .ascii "Hello, World!\0"
    .text
.globl _main
_main:
    pushl   %ebp
    movl    %esp, %ebp
    pushl   %ebx
    subl    $20, %esp
    call    L3
"L00000000001$pb":
L3:
    popl    %ebx
    leal    LC0-"L00000000001$pb"(%ebx), %eax
    movl    %eax, (%esp)
    call    L_puts$stub
    movl    $0, %eax
    addl    $20, %esp
    popl    %ebx
    leave
    ret
.comm _dam,1000000,5
    .section __IMPORT,__jump_table,symbol_stubs,self_modifying_code+pure_instructions,5
L_puts$stub:
    .indirect_symbol _puts
    hlt ; hlt ; hlt ; …
Run Code Online (Sandbox Code Playgroud)

x86 assembly gcc gnu-assembler

10
推荐指数
2
解决办法
1万
查看次数

如何在Linux上安装和使用GAS(GNU编译器)?

我正在使用Ubuntu,我正在为Linux寻找汇编编译器,我发现了GAS.

我正在尝试安装并运行它,但我不能.

linux ubuntu assembly gnu-assembler

10
推荐指数
2
解决办法
2万
查看次数

如何将C对象文件与汇编语言对象文件链接?

我无法链接2个目标文件,其中一个是从汇编语言源文件生成的,另一个是从C源文件生成的.

C源代码:

//main2.c
extern int strlength(char *);
int main(){
    char * test = "hello";
    int num = strlength(test);
    return num;
}
Run Code Online (Sandbox Code Playgroud)

汇编源代码:

#strlength.s
.include "Linux32.s"

.section .text
.globl strlength
.type strlength, @function
strlength:
 pushl %ebp
 movl %esp, %ebp
 movl $0, %ecx
 movl 8(%ebp), %edx
read_next_byte:
 movb (%edx), %al
 cmpb $END_OF_FILE, %al
 jle end
 incl %edx
 incl %ecx
 jmp read_next_byte
end:
 movl %ecx, %eax
 popl %ebp
 ret
Run Code Online (Sandbox Code Playgroud)

当我使用'gcc'编译和运行时,如下所示:

gcc main2.c strlength.s -m32 -o test
./test
echo $?
Run Code Online (Sandbox Code Playgroud)

我得到5这是正确的.但是,当我单独编译/汇编然后链接'ld'时,如下所示:

as strlength.s --32 …
Run Code Online (Sandbox Code Playgroud)

c linux assembly gnu-assembler ld

10
推荐指数
1
解决办法
9298
查看次数

为什么GCC会为减法发出"lea"而不是"sub"?

我正在看一些通过反汇编一些C程序生成的程序集,我对我经常重复看到的单个优化感到困惑.

当我没有对GCC编译器进行优化时使用subl减法指令,但是当我确实打开了优化(-O3准确地说)时,编译器使用leal指令而不是减法,例如:

没有优化:

83 e8 01     subl $0x1, %eax 
Run Code Online (Sandbox Code Playgroud)

优化

8d 6f ff     leal -0x1(%edi), %ebp 
Run Code Online (Sandbox Code Playgroud)

这两条指令都是3个字节长,所以我没有在这里看到优化.有人可以帮助我并尝试解释编译器的选择吗?

任何帮助,将不胜感激.

x86 assembly gcc gnu-assembler compiler-optimization

10
推荐指数
2
解决办法
1699
查看次数

如何让GNU汇编程序使用斜杠/注释?

这确实是我的一个愚蠢的特质,但我不能忍受GNU AS用来插入评论的方式.我太熟悉Sun方式(在大多数UNIX汇编程序中使用的方法),它使用简单的斜杠"/"来注释掉代码直到行尾.

你知道如何实现我的小心血来潮吗?

assembly comments gnu gnu-assembler

10
推荐指数
3
解决办法
1万
查看次数

`movl(%eax),%eax`中的括号是什么意思?

我已经google了足够的但无法弄清楚括号的()含义.另外,我看到一些语法movl 8(%ebp), %eax

有人可以给我一些很好的参考吗?我无法在Google的前20名搜索结果中找到任何结果.

x86 assembly gnu gnu-assembler att

9
推荐指数
2
解决办法
2万
查看次数

为什么从AT&T切换到Intel语法使本教程使用GAS进行段错误?

我正在浏览http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html上的一些教程,以熟悉x86/x64.本教程代码使用提供的代码编译和运行,没有打嗝,该代码使用AT&T语法:

.global main
.text
main:                               # This is called by C library's startup code
    mov     $message, %rdi          # First integer (or pointer) parameter in %edi
    call    puts                    # puts("Hello, World")
    ret                             # Return to C library code
message:
    .asciz "Hello, World"           # asciz puts a 0x00 byte at the end
Run Code Online (Sandbox Code Playgroud)

但是,当我将此代码转换为Intel语法时,我收到"分段错误"错误.

.intel_syntax noprefix
.global main
.text
main:                               # This is called by C library's startup code
    mov     rdi, message            # First integer (or pointer) parameter in %edi
    call …
Run Code Online (Sandbox Code Playgroud)

x86 assembly intel gnu-assembler att

9
推荐指数
1
解决办法
1844
查看次数

ARM 汇编中的立即值是否需要哈希?

我一直在阅读 gcc 生成的一些不同的arm汇编代码,并且遇到了一些我在规范中找不到的东西。

movw    r0, #39784
movt    r0, 1
Run Code Online (Sandbox Code Playgroud)

显然,第一个是将值 39784 移动到底部 16 位或 r0,但 movt 的操作数“1”很奇怪,因为它前面没有哈希,而且我的印象是立即值需要哈希。在某些情况下它是可选的吗?或者我错过了一些神奇的东西?

assembly gcc arm gnu-assembler

9
推荐指数
2
解决办法
2851
查看次数

图1b和1f在GNU程序集中

我正在分析一个linux异常代码.顺便说一句,我无法理解gnu汇编语法.

    svc_preempt:
    mov r8, lr
1:  bl  preempt_schedule_irq        @ irq en/disable is done inside
    ldr r0, [tsk, #TI_FLAGS]        @ get new tasks TI_FLAGS
    tst r0, #_TIF_NEED_RESCHED
    moveq   pc, r8              @ go again
    b   1b
Run Code Online (Sandbox Code Playgroud)

在这段代码中,我可以看到"b 1b",但我无法在任何地方找到"1b"标签.

和,

#ifdef CONFIG_NEON
    adr r6, .LCneon_thumb_opcodes
    b   2f
#endif
call_fpe:
#ifdef CONFIG_NEON
    adr r6, .LCneon_arm_opcodes
2:
    ldr r7, [r6], #4            @ mask value
    cmp r7, #0              @ end mask?
    beq 1f
    and r8, r0, r7
    ldr r7, [r6], #4            @ opcode bits matching in …
Run Code Online (Sandbox Code Playgroud)

gnu gnu-assembler

9
推荐指数
1
解决办法
3603
查看次数

GCC装配优化 - 为什么这些相同?

我正在尝试学习装配如何在初级阶段工作,所以我一直在玩gcc汇编的-S输出.我写了一个简单的程序,定义了两个字节并返回它们的总和.整个计划如下:

int main(void) {
  char A = 5;
  char B = 10;
  return A + B;
}
Run Code Online (Sandbox Code Playgroud)

当我编译它时没有使用以下优化:

gcc -O0 -S -c test.c
Run Code Online (Sandbox Code Playgroud)

我得到test.s,如下所示:

    .file   "test.c"
    .def    ___main;    .scl    2;  .type   32; .endef
    .text
    .globl  _main
    .def    _main;  .scl    2;  .type   32; .endef
_main:
LFB0:
    .cfi_startproc
    pushl   %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl    %esp, %ebp
    .cfi_def_cfa_register 5
    andl    $-16, %esp
    subl    $16, %esp
    call    ___main
    movb    $5, 15(%esp)
    movb    $10, 14(%esp)
    movsbl  15(%esp), %edx
    movsbl  14(%esp), %eax
    addl    %edx, …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc x86-64 gnu-assembler

9
推荐指数
2
解决办法
958
查看次数

标签 统计

gnu-assembler ×10

assembly ×9

gcc ×4

x86 ×4

gnu ×3

att ×2

c ×2

linux ×2

arm ×1

comments ×1

compiler-optimization ×1

intel ×1

ld ×1

ubuntu ×1

x86-64 ×1