【C语言转ARM汇编】汇编语言hword、byte如何输出负数

举报
IM汤姆凯特 发表于 2022/04/19 17:06:56 2022/04/19
【摘要】 汇编语言输出负数,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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。