【C语言转ARM汇编】汇编语言hword、byte如何输出负数
【摘要】 汇编语言输出负数,hword和byte转换成word,C语言转汇编的方法
@[toc]
问题描述
在练习汇编语言输出两个负数时,使用 .hword和 .byte类型定义输出时会出现高位填充现象如下图:
整型输出直接是一串无关数串,十六进制输出低位正确高位填充,没有得到我们想看到的-100和-2。
怎么进行数据类型转换呢,来解决这一问题?
C语言我们熟,我们可以用C语言转换成汇编语言然后分析比对
写一个实现相同功能的C代码:
#include<stdio.h>
int main(){
short a= -100;
char b= -2;
printf("%5d %5d",a,b);
return 0;
}
先编译,保证能编译成功没有出错,输出的结果是我们想要的
这时我们就可以把C语言转换成汇编,然后参考C语言内部是怎么把他们转换成功的
C语言转换成汇编语言:
arm-linux-gnueabi-gcc -E byte.c -o byte.i
arm-linux-gnueabi-gcc -S byte.i -o bytec.s
C语言转换后的语言与我们写的汇编语言进行比较,发现它在载入地址的时候使用了【ldrsh 和 ldrsb】使得转换成功
修改我们写的代码,然后观察结果发现问题解决了!
思考总结
1)在写汇编语言时,当我们出现问题解决不了,可以先写出我们熟悉的C语言代码,然后转换成汇编语言供我们参考分析。
在这个问题中,其实定义的时候可以直接用 .int 类型或 .word类型就不会出现问题,如下图
将C代码也改成int类型,转换成汇编语言会发现少了类型转换的步骤
2)因此我们可以得出这样一个结论:时间和空间不可兼得,我们在写汇编时,可以用16位的hword类型或8位的type类型定义合适的数据,也就是用时间来换取空间。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)