我刚刚翻译了这个程序,
#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) 我正在使用Ubuntu,我正在为Linux寻找汇编编译器,我发现了GAS.
我正在尝试安装并运行它,但我不能.
我无法链接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程序生成的程序集,我对我经常重复看到的单个优化感到困惑.
当我没有对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个字节长,所以我没有在这里看到优化.有人可以帮助我并尝试解释编译器的选择吗?
任何帮助,将不胜感激.
这确实是我的一个愚蠢的特质,但我不能忍受GNU AS用来插入评论的方式.我太熟悉Sun方式(在大多数UNIX汇编程序中使用的方法),它使用简单的斜杠"/"来注释掉代码直到行尾.
你知道如何实现我的小心血来潮吗?
我已经google了足够的但无法弄清楚括号的()含义.另外,我看到一些语法movl 8(%ebp), %eax
有人可以给我一些很好的参考吗?我无法在Google的前20名搜索结果中找到任何结果.
我正在浏览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) 我一直在阅读 gcc 生成的一些不同的arm汇编代码,并且遇到了一些我在规范中找不到的东西。
movw r0, #39784
movt r0, 1
Run Code Online (Sandbox Code Playgroud)
显然,第一个是将值 39784 移动到底部 16 位或 r0,但 movt 的操作数“1”很奇怪,因为它前面没有哈希,而且我的印象是立即值需要哈希。在某些情况下它是可选的吗?或者我错过了一些神奇的东西?
我正在分析一个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) 我正在尝试学习装配如何在初级阶段工作,所以我一直在玩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)