> 文档中心 > 汇编语言hword、byte如何输出负数,C语言转汇编

汇编语言hword、byte如何输出负数,C语言转汇编


问题描述

在练习汇编语言输出两个负数时,使用 .hword和 .byte类型定义输出时会出现高位填充现象如下图:

在这里插入图片描述

整型输出直接是一串无关数串,十六进制输出低位正确高位填充,没有得到我们想看到的-100和-2。

怎么进行数据类型转换呢,来解决这一问题?

C语言我们熟,我们可以用C语言转换成汇编语言然后分析比对

写一个实现相同功能的C代码:

#includeint main(){    short a= -100;    char  b= -2;    printf("%5d %5d",a,b);    return 0;}

先编译,保证能编译成功没有出错,输出的结果是我们想要的

汇编语言hword、byte如何输出负数,C语言转汇编

这时我们就可以把C语言转换成汇编,然后参考C语言内部是怎么把他们转换成功的

C语言转换成汇编语言:(需要先安装交叉编译工具)

arm-linux-gnueabi-gcc -E byte.c -o byte.iarm-linux-gnueabi-gcc -S byte.i -o bytec.s

C语言转换后的语言与我们写的汇编语言进行比较,发现它在载入地址的时候使用了【ldrsh 和 ldrsb】使得转换成功

在这里插入图片描述

修改我们写的代码,然后观察结果发现问题解决了!

在这里插入图片描述

思考总结

1)在写汇编语言时,当我们出现问题解决不了,可以先写出我们熟悉的C语言代码,然后转换成汇编语言供我们参考分析。

在这个问题中,其实定义的时候可以直接用 .int 类型或 .word类型就不会出现问题,如下图

在这里插入图片描述

将C代码也改成int类型,转换成汇编语言会发现少了类型转换的步骤

2)因此我们可以得出这样一个结论:时间和空间不可兼得,我们在写汇编时,可以用16位的hword类型或8位的type类型定义合适的数据,也就是用时间来换取空间。