大家好,今天给大家上传一个,ARM汇编中的一个题,
编写汇编语言程序,从键盘上输入两个有符号数的32位数赋给内存变量a、b,
按照下面格式输出。
a=✘✘✘✘ b=✘✘✘✘
自己根据《从键盘上输入两个数,求和然后输出》这个例子改写的,代码如下
// add.s
.data
fmt: .asciz "n sum=%dn" //定义一个以空结尾的字符串
fmt1: .asciz "%d %d" //同上
a: .word 0 //定义变量a
b: .word 0 //定义变量b
.text
.globl main
main: stmfd sp!,{lr} //把返回地址推到堆栈上
ldr r0,=fmt1 //加载指向格式化字符串的指针(取两个数到内存中)
ldr r1,=a //将变量a存入r1中
ldr r2,=b //将变量b存入r2中
bl scanf //scanf("%d %d",&a,&b)
ldr r1,=a//从内存中读取数据
ldr r1,[r1]
ldr r2,=b
ldr r2,[r2]
add r1,r2 //运算然后输出
ldr r0,=fmt
mov r2,r1
bl printf
mov r0, #0 //move return code into r0
ldmfd sp!,{lr} //从堆栈弹出返回地址
mov pc, lr //return to Linux
.end //结束汇程序
这里面数据段中改变的是.data 中fmt: .asciz "n sum=%dn"这一句话,然后就是去掉
add r1,r2(将两数相加),然后就是改变mov r2,r1,然后换要添加一句话,总之,一共修改4点。
正确的程序如下:
.data
fmt: .asciz "n a=%d b=%dn"//输出两个数a=,b=
fmt1: .asciz "%d %d" //键盘上输入两个数
a: .word 0 //定义变量a
b: .word 0 //定义变量b
.text
.globl main
main: stmfd sp!,{lr} //把返回地址推到堆栈上
ldr r0,=fmt1 //加载指向格式化字符串的指针(取两个数到内存中)
ldr r1,=a //将变量a存入r1中
ldr r2,=b //将变量b存入r2中
bl scanf //scanf("%d %d",&a,&b)
ldr r1,=a//从内存中读取数据
ldr r1,[r1]
ldr r2,=b
ldr r2,[r2]
ldr r0,=fmt
mov r3,r1
mov r3,r2
bl printf
mov r0, #0 //move return code into r0
ldmfd sp!,{lr} //从堆栈弹出返回地址
mov pc, lr //return to Linux
.end
好了,小伙伴们自己看看,其实有时候可以模仿其它程序,我也是一个ARM汇编的初学者,拜拜,今天就到这里,这是小作者的第一次创作,感谢大家的支持,最后,有什么疑问,私信评论都可以哦,我会尽我所能为大家回答。



