【ARM】ARM汇编程序设计(四) 选择结构
发布日期:2021-06-29 20:47:54 浏览次数:2 分类:技术文章

本文共 3359 字,大约阅读时间需要 11 分钟。

00. 目录

文章目录

01. if 结构一

.section .rodata    .align 2.LC0:    .string "i > 10\n".LC1:    .string "i <= 10\n"    .section .text    .align 2    .global mainmain:    push {lr}    mov r2, #1    cmp r2, #10    ldrgt r0, =.LC0    ldrle r0, =.LC1        bl printf    mov r0, #0    pop {pc}

02. if 结构二

.section .rodata    .align 2.LC0:    .string "i > 10\n".LC1:    .string "i <= 10\n"    .section .text    .align 2    .global mainmain:    push {lr}    mov r2, #1    cmp r2, #10    bgt do1    b do2do1:    ldr r0, =.LC0    bl printf    b outdo2:    ldr r0, =.LC1    bl printfout:    mov r0, #0    pop {pc}

03. if 结构三

.section .rodata    .align 2.LC0:    .string "i > 10\n".LC1:    .string "i < 10\n".LC2:    .string "i == 10\n"    .section .text    .align 2    .global mainmain:    push {lr}    mov r2, #1    cmp r2, #10    bgt do1    blt do2    b do3do1:    ldr r0, =.LC0    bl printf    b outdo2:    ldr r0, =.LC1    bl printf    b outdo3:    ldr r0, =.LC2    bl printfout:    mov r0, #0    pop {pc}

04. if 结构四

if(i > 10)		...	else if(i + j > 10)		...	else if(j < 10)		...
.section .rodata    .align 2.LC0:    .string "i > 10\n".LC1:    .string "i + j > 10\n".LC2:    .string "j < 10\n"    .section .text    .align 2    .global mainmain:    push {lr}    mov r2, #100    mov r3, #2    cmp r2, #10    bgt do1        add r1, r2, r3    cmp r1, #10    bgt  do2    cmp r3, #10    blt do3    b outdo1:    ldr r0, =.LC0    bl printf    b outdo2:    ldr r0, =.LC1    bl printf    b outdo3:    ldr r0, =.LC2    bl printfout:    mov r0, #0    pop {pc}

05. if 结构五

.section .rodata    .align 2.LC0:    .string "i > 10 && i < 20\n"    .section .text    .align 2    .global mainmain:    push {lr}    mov r2, #15    cmp r2, #10    ble out    cmp r2, #20    blt do1    b outdo1:    ldr r0, =.LC0    bl printfout:    mov r0, #0    pop {pc}

06. switch结构

C语言代码

#include 
int main(void){
int i = 10; char ch = 'a'; switch(i) {
case 1: printf("val = %d \n", i); break; case 345: printf("val = %d \n", i); break; case 23: printf("val = %d \n", i); break; case 7: printf("val = %d \n", i); break; case 1234: printf("val = %d \n", i); break; case 17: printf("val = %d \n", i); break; case 10: printf("val = %d \n", i); break; } return 0;}

汇编语言代码

.section	.rodata	.align	2.LC0:	.ascii	"val = %d \012\000"	.text	.align	2	.global	mainmain:	stmfd	sp!, {fp, lr}	add	fp, sp, #4	sub	sp, sp, #8	mov	r3, #10	str	r3, [fp, #-8]	mov	r3, #97	strb	r3, [fp, #-9]	ldr	r3, [fp, #-8]	cmp	r3, #17	beq	.L6	cmp	r3, #17	bgt	.L10	cmp	r3, #7	beq	.L4	cmp	r3, #10	beq	.L5	cmp	r3, #1	beq	.L3	b	.L2.L10:	ldr	r2, .L11	cmp	r3, r2	beq	.L8	ldr	r2, .L11+4	cmp	r3, r2	beq	.L9	cmp	r3, #23	beq	.L7	b	.L2.L3:	ldr	r3, .L11+8	mov	r0, r3	ldr	r1, [fp, #-8]	bl	printf	b	.L2.L8:	ldr	r3, .L11+8	mov	r0, r3	ldr	r1, [fp, #-8]	bl	printf	b	.L2.L7:	ldr	r3, .L11+8	mov	r0, r3	ldr	r1, [fp, #-8]	bl	printf	b	.L2.L4:	ldr	r3, .L11+8	mov	r0, r3	ldr	r1, [fp, #-8]	bl	printf	b	.L2.L9:	ldr	r3, .L11+8	mov	r0, r3	ldr	r1, [fp, #-8]	bl	printf	b	.L2.L6:	ldr	r3, .L11+8	mov	r0, r3	ldr	r1, [fp, #-8]	bl	printf	b	.L2.L5:	ldr	r3, .L11+8	mov	r0, r3	ldr	r1, [fp, #-8]	bl	printf	mov	r0, r0	@ nop.L2:	mov	r3, #0	mov	r0, r3	sub	sp, fp, #4	ldmfd	sp!, {fp, pc}.L12:	.align	2.L11:	.word	345	.word	1234	.word	.LC0	.size	main, .-main	.ident	"GCC: (ctng-1.8.1-FA) 4.5.1"	.section	.note.GNU-stack,"",%progbits

07. 附录

转载地址:https://dengjin.blog.csdn.net/article/details/106902263 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:【ARM】ARM汇编程序设计(五) str和ldr
下一篇:【ARM】ARM汇编程序设计(三) 循环结构

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月30日 07时11分17秒