问题描述
在练习汇编语言输出两个负数时,使用 .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类型定义合适的数据,也就是用时间来换取空间。