汇编,打印寄存器的值

1)

.LC0:
	.string	"%d\n"
	.section	.text.startup,"ax",@progbits
	.p2align 4,,15
	.globl	main
	.type	main, @function

2)把$5变成相应的寄存器就行。


	movl	$5, %esi
	leaq	.LC0(%rip), %rdi
	call	printf@PLT

3)

	.file	"b6.array.c"
	.text
	.section	.rodata.str1.1,"aMS",@progbits,1
.LC0:
	.string	"%d\n"
	.section	.text.startup,"ax",@progbits
	.p2align 4,,15
	.globl	main
	.type	main, @function
main:
.LFB23:
	.cfi_startproc
	pushq	%r13
	.cfi_def_cfa_offset 16
	.cfi_offset 13, -16
	pushq	%r12
	.cfi_def_cfa_offset 24
	.cfi_offset 12, -24
	movl	$1116, %edi
	pushq	%rbp
	.cfi_def_cfa_offset 32
	.cfi_offset 6, -32
	pushq	%rbx
	.cfi_def_cfa_offset 40
	.cfi_offset 3, -40
	movl	$1717986919, %ebp # 啥意思?
	
	subq	$424, %rsp # 堆栈指针

	movl	%eax, %esi
	leaq	.LC0(%rip), %rdi
	call	printf@PLT

	.cfi_def_cfa_offset 464
	movq	%rsp, %rbx
	movq	%fs:40, %rax
	

	movq	%rax, 408(%rsp)
	xorl	%eax, %eax
	
	movl	%eax, %esi
	leaq	.LC0(%rip), %rdi
	call	printf@PLT

	leaq	400(%rbx), %r12 # 100个,4*100
	movq	%rbx, %r13 # 此时r13-r12=400, 即100个数组
	call	srand@PLT

	movl	$5, %esi
	leaq	.LC0(%rip), %rdi
	call	printf@PLT

	.p2align 4,,10
	.p2align 3
.L2:
	xorl	%eax, %eax
	addq	$4, %r13 # r13是i*4的值,相当于i
	call	rand@PLT # 可能保存在eax中,
	movl	%eax, %ecx # CX:计数暂存器
	
	movl	%eax, %esi
	leaq	.LC0(%rip), %rdi
	call	printf@PLT

	imull	%ebp # 单操作数格式将乘积存放在 AX、DX:AX 或 EDX:EAX 中:
	movl	%ecx, %eax
	sarl	$31, %eax # sarl k,D . D = D >> k . 算数右移
	sarl	$2,  %edx # 
	subl	%eax, %edx
	leal	(%rdx,%rdx,4), %eax
	addl	%eax, %eax
	subl	%eax, %ecx # 
	movl	%ecx, -4(%r13) # r13=arr[]
	cmpq	%r12, %r13 # r12代表100,
	jne	.L2
	pxor	%xmm0, %xmm0
	.p2align 4,,10
	.p2align 3
.L3:
	paddd	(%rbx), %xmm0
	addq	$16, %rbx
	cmpq	%rbx, %r13
	jne	.L3
	movdqa	%xmm0, %xmm1
	movq	408(%rsp), %rax
	xorq	%fs:40, %rax
	psrldq	$8, %xmm1
	paddd	%xmm1, %xmm0
	movdqa	%xmm0, %xmm1
	psrldq	$4, %xmm1
	jne	.L10
	addq	$424, %rsp
	.cfi_remember_state
	.cfi_def_cfa_offset 40
	paddd	%xmm1, %xmm0
	leaq	.LC0(%rip), %rsi
	popq	%rbx
	.cfi_def_cfa_offset 32
	popq	%rbp
	.cfi_def_cfa_offset 24
	popq	%r12
	.cfi_def_cfa_offset 16
	popq	%r13
	.cfi_def_cfa_offset 8
	movd	%xmm0, %edx
	movl	$1, %edi
	xorl	%eax, %eax
	jmp	__printf_chk@PLT
.L10:
	.cfi_restore_state
	call	__stack_chk_fail@PLT
	.cfi_endproc
.LFE23:
	.size	main, .-main
	.ident	"GCC: (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0"
	.section	.note.GNU-stack,"",@progbits

你可能感兴趣的:(汇编)