龙芯下汇编语言编程(2)

【龙芯1c库】龙芯1c上c语言写的函数调用汇编语言写的函数 封装龙芯1c上常见外设接口,便于在裸机程序或实时操作系统中使用,类似于STM32库,正在不断添加中。Git地址是https://gitee.com/caogos/OpenLoongsonLib1c封装龙芯1c库难免会涉及到汇编程序,本文以c语言main()函数中调用一个用汇编实现的禁止中断的函数。源码如下test_entry.S#define v0 $2 /* return v... 阅读详情

作者: comcat 发表日期: 2007-03-23 20:11   http://comcat.blog.openrays.org/blog.php?do=showone&tid=314

 

1. 判断的实现

看这条C语句的汇编实现:

if(i == j)
f = g + h;
else
f = g - h;

------------------------------------------------------------

bne $15, $16, Else # i!=j,则跳转到Else

add $17, $18, $19 # f=g+h

j Exit # 无条件跳转

Else:
sub $17, $18, $19 # f=g-h

Exit:


2. 小于判断的实现

if(i >= j)
f = g + h;
else
f = g - h;

--------------------------------------------------

slt $9, $15, $16 # i<j则$9=1,否则$9=0
bne $9, $0, Else # $9!=0,则跳转到Else
# 上面两条指令实现了“小于则转移”

add $17, $18, $19 # f=g+h
j Exit # 无条件跳转

Else:
sub $17, $18, $19 # f=g-h

Exit:


另一种实现为:

sub $9, $15, $16 # $9=i-j
bltz $9, Else # $9小于0,则跳转到Else
# 上面两条指令实现了“小于则转移”

add $17, $18, $19 # f=g+h
j Exit # 无条件跳转

Else:
sub $17, $18, $19 # f=g-h

Exit:


3. 更多判断的实现

sub t0, s0, s1 # t0 = s0 - s1 -------- [1]

bgez t0, Else # t0大于等于0,则跳转到Else
#上面两条指令实现了大于等于则转移

bgtz t0, Else # t0大于0,则跳转到Else;与[1]联用,实现大于则跳转

blez t0, Else # t0小于等于0,则跳转到Else;与[1]联用,实现小于等于则跳转
bltz t0, Else # t0小于0,则跳转到Else;与[1]联用,实现小于则跳转
Else:
......

加上前面的 bne, beq 相等和不等的跳转指令,可以实现所有的逻辑判断。



4. 循环的实现

while(s==k)
f = g + h;

----------------------------------

loop:
add t1, s3, s3 # t1 = 2*i
add t1, t1, t1 # t1 = 4*i

add t1, t1, s6 # s的地址置于t1
lw t0, 0(t1) # t0 = s

bne t0, s5, Exit # s != k,则停止循环
add s3, s3, s4 # i = i+j
j loop # 跳至loop
Exit:


5. 完整的例子

.text
.globl main
.ent main
main:
.frame $fp, 32, $31 # 帧指针为$fp,帧大小32,返回寄存器$31
.mask 0xc0000000,-4 # $31, $30保存于28($sp),0xc0000000为需保存之寄存器位图
.set noreorder # 关闭汇编器自动填充延迟槽
.cpload $25 # 汇编伪操作,告诉汇编器根据$25寄存器正确设置gp
.set nomacro

addiu $sp, -32 # 栈空间分配32字节
sw $ra, 24($sp) # 保存返回地址
sw $fp, 20($sp) # 保存帧指针
move $fp, $sp # 帧指针就绪
.cprestore 8 # 汇编器伪操作,保存gp于8($fp)

# 预留传参数的栈空间;printf会直接对栈上预留给参数的空间直接操作
# 会覆盖掉8($fp)处的gp,造成调用失败。
addiu $sp, $sp, -20


li $18, 0x3 # 循环次数为3

lui $8, %hi(msg2) # %hi() 求地址的高16位, %lo()求低16位
addiu $17, $8, %lo(msg2) # $17 中为字符串首地址


loop:
move $4, $17 # printf之第一个参数

lw $25, %got(printf)($28) # 获取printf函数地址
jalr $25 # 调用printf
nop

lw $28, 8($fp) # 从栈回复gp,因为进入printf后gp被改写

addiu $18, $18, -1
bne $18, $0, loop # 不等于0,跳转到前面的loop
nop

move $sp, $fp # 栈指针复位
lw $ra, 24($sp) # 返回地址恢复
lw $fp, 20($sp) # 原帧指针恢复
addu $sp, 32 # 回收栈空间

move $2,$0 # 返回值为0
jr $31 # 返回
nop
.end main

.rdata
msg2:
.asciiz "Hello Baby!\n"

从零开始:在龙芯3A5000上动手写你的第一个LoongArch汇编程序 本文详细介绍了如何在龙芯3A5000平台上编写、编译和运行第一个LoongArch汇编程序。从环境准备、工具链配置到Hello World程序编写,再到编译链接和调试,逐步引导开发者掌握LoongArch指令集的基础知识,为深入理解国产CPU架构提供实践指导。 阅读详情

相关推荐

龙芯2K1000实战开发-配置及编译

当 pmon 被编译时,以这两个文件为基础把相应的 *.c 文 件编译成 *.o 文件,这两个文件的主要区别是:Targets/LS2K/conf/files.LS2K 依赖于不 同的龙芯 CPU,CPU 不同该文件的内容就可能不同;本文主要分享了PMON的配置及编译过程。工具链: http://ftp.loongnix.org/embedd/ls3a/toolchain/gcc-4.4-gnu.tar.gz。解压:sudo tar -zxvf gcc-4.4-gnu.tar.gz -C /

whm128的博客 1584

《自己动手写CPU》8.转移指令

自己动手写CPU 第八章

m0_71078397的博客 1817

龙芯架构及编程详解

龙芯架构采用的是指令集体系结构(ISA)的MIPS架构。MIPS(Microprocessor without Interlocked Pipelined Stages)是一种经典的RISC(Reduced Instruction Set Computer)架构,它以简化指令集和高效执行为特点。编程龙芯架构可以使用汇编语言和高级编程语言,如MIPS汇编语言和C语言。龙芯(Loongson)是中国自主研发的一种处理器架构,它是由中国科学院计算技术研究所(ICT)与中兴通讯股份有限公司(ZTE)合作开发的。

DevWizard的博客 1338

《自己动手写CPU》--第八章-阅读笔记

本章将为OpenMIPS处理器添加转移指令,转移指令包括跳转、分支两种,区别在于前者是绝对转移,后者是相对转移,但实现的方法是相似的。 8.1延迟槽 在实现转移指令之前,先介绍一下延迟槽的概念。第5章已经介绍了流水线中存在的三种相关:数据相关、结构相关、控制相关。其中控制相关是指流水线中的转移指令或者其他需要改写PC的指令造成的相关。这些指令改写了PC的值,所以导致后面已经进入流水线的几条指令无效,比如:如果转移指令在流水线的执行阶段进行转移条件判断,在发生转移时,会导致当前处于取指、译码阶段的指令无效

code_master2020的博客 1676

龙芯2K1000实战开发-PMON开发上

其中最重要的是 loongson3_clksetting.S 和 loongson3_ddr2_config.S 两个文 件,loongson3_clksetting.S 设置了 cpu 和 ddr 的频率,loongson3_ddr2_config.S 对 ddr 进行了初始化,并获得内存大小,作为参数,在调用 initmip。

whm128的博客 1763

龙芯2K1000实战开发-PMON开发下

函数名称叫 init_fs()或者 init_xxxfs ()。百度百科的词条中,这样解释Bootloader:“Bootloader是嵌入式系统在加电后执行的第一段代码,在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装载到内存中然后跳转到操作系统所在的空间,启动操作系统运行”。PMON 的启动可以分为三个阶段: 首先是 start(汇编阶段),该阶段主要完成的是 cpu 本身需要相关的初始化,如寄 存器初始化、TLB 初始化、频率的初始化、内存初始化、程序地址段跳转。

whm128的博客 991

汇编中的call和ret指令

call和ret指令都是转移指令,它们都修改偏移地址或同时修改段地址和偏移地址。ret指令用栈中的数据,修改偏移地址,从而实现近转移。call可以通过位移和目的地址进行转移。下面来通过汇编代码学习一下call和ret指令的配合使用。 下面来看一下程序刚加载时栈的情况,对应16个00 程序对应的...

1万+

Jetson nano/nx使用麒麟arm版向日葵实现远程控制

Jetson nano/nx使用麒麟arm版向日葵实现远程控制1、安装向日葵软件2、运行Sunlogin Client3、向日葵闪退问题4、重启系统5、重启后黑屏问题 特别提醒: 本博客的第3步切换桌面管理环境到lightdm,存在重启后开机黑屏的风险,我在自己的nano/nx上都没有问题,但帮一个同学的nx配置时,切换到lightdm,重启开机却出现了黑屏,所以执行第3步的话要有心理准备,黑屏解决方法见第5步,特此提醒。

胡乱学点东西 2万+

xtensa构架(指令篇)学习(五)--条件分支指令

Xtensa 汇编中的条件分支指令。 这些指令包括 bltui、bbci、bbsi、beq、bne、bge、blt、bgeu、bltu、bany、bnone、ball、bnall、bbc 和 bbs等

MHD0815的博客 2066

利用Matlab高效处理Comsol仿真数据的可视化技巧

本文详细介绍了如何将Comsol仿真数据高效导入Matlab并进行专业可视化与后处理。核心内容包括正确的数据导出格式设置、三维矩阵重构方法、二维截面与三维体渲染技巧,以及基于Matlab的定量分析与批处理自动化流程,帮助工程师和科研人员深度挖掘仿真数据价值,提升工作效率。

weixin_29065791的博客 362

TI DSP从COFF切换到EABI输出格式的5个关键修改点(TMS320F280025实测)

本文基于TMS320F280025实测,详细解析了TI DSP从COFF切换到EABI输出格式的5个关键修改点。核心差异在于EABI遵循ELF标准,涉及链接器优化、RAM数据共享、工具链升级、double数据类型位宽变化及链接器命令文件重构。迁移时需使用.retain指令防止关键数据被优化,利用NOINIT段保护共享RAM,并更新hex2000等工具,以确保BootLoader与应用程序稳定运行。

weixin_29189381的博客 266

32位mips指令说明

空指令(1条) nop指令 逻辑运算指令(8条) and、or、xor、nor指令 当功能码是6b100100时,表示是and指令,逻辑“与”运算。 指令用法为:and rd,rs,rt。 指令作用为:rd ← rs AND rt,将地址为rs的通用寄存器的值与...

qq_39559641的博客 8万+

SOME/IP协议详解「1.1·面向服务与面向信号」

面向信号和面向服务的区别,和举例子

雪云飞星的博客 5654

《 汇编语言编程基础 基于 LoongArch 》读书与实践笔记

好记性不如烂笔头,在此记录与分享一下《 汇编语言编程基础 基于 LoongArch 》读书与实践笔记。如文中出现错误,欢迎在评论区留言讨论,我会尽快修改更新 :-)

loongsoner的工作学习博客 4844

【人工智能之深度学习】23. 推荐系统升级实战:LightGCN重构协同过滤全流程(Amazon-Beauty数据集+完整代码)

摘要:传统协同过滤(如矩阵分解)在电商推荐中存在三大痛点:忽略用户-物品高阶关联、交互数据稀疏导致冷启动、特征工程依赖人工设计。本文基于Amazon-Beauty数据集(含20万+用户交互),用LightGCN图神经网络重构推荐系统:1)构建用户-物品二部图,通过3层图卷积捕捉“用户→物品→用户”的多跳关联;2)采用BPR负采样损失优化嵌入学习,缓解数据稀疏;3)端到端输出用户/物品嵌入,无需人工特征。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1493

AUTOSAR EcuM模块介绍

AUTOSAR EcuM概述 AUTOSAR EcuM全称是Autosar ECU State Manager,位于Autosar BSW中System Service模块中,是一个独立于硬件的模块。 其主要作用是管理ECU上下电启动的状态,具体为: 初始化启动操作系统所需要的BSW(Basic Software)模块 为睡眠阶段和随后的唤醒完成微控制器的配置准备 管理ECU上的所有唤醒事件(EcuM通过唤醒验证协议验证已发生的唤醒,区分真实的唤醒事件,防止误唤醒) EcuM支持的特性列表 EcuM具有

酒无忧的博客 2995

龙芯汇编语言编程(1)

当前版本: 0.1完成日期: 2007-3-22作者: Dajie Tan 1. Hello World从经典的Hello World开始:   .text                          #表示将后面的代码编译后置于目标文件的.text段   .globl    main                #声明main为全局变量。该变量名会

四度空间 4139

UDS诊断服务基础详解之二19服务

本文主要介绍UDS统一诊断服务的19 01服务,包含状态位和故障码的解析以及19 01服务的具体说明

车载网络小D的博客 1万+

龙芯下汇编语言编程(Hello world)

原文网址:http://comcat.blog.openrays.org/blog-htm-do-showone-tid-310.html 1. Hello World 从经典的Hello World开始:   .text                   #表示将后面的代码编译后置于目标文件的.text段   .globl     main

junmuzi的专栏 1992

手把手教你学 AI芯片 SOC软件开发专栏简介

在AI芯片(如NPU、GPU加速器)爆发式增长的今天,软件栈开发已成为AI应用落地的核心瓶颈。无论是模型推理加速、低延迟部署,还是能效优化,都依赖于对芯片底层软件的深度掌握。然而,许多开发者困于“只会调用API,不懂驱动实现”的困境,导致性能瓶颈难以突破。本专栏《手把手教你学 AI芯片 SOC软件开发》专为AI工程师、嵌入式开发者及系统架构师打造,从零基础切入,系统拆解AI芯片SOC(System on Chip)的完整软件栈,覆盖Runtime(运行时)

MHD0815的博客 170

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

龙芯软件开发(2)--汇编资料

要开发龙芯,那么要先学习一下它的汇编。而它的汇编跟MIPS的相似,这样的话,就只能拿MIPS32的先来学习了。下面就是一些资料的连接。 MIPS Assembly Language Programminghttp://www.eecs.harvard.edu/~ellard/Courses/cs50-asm.pdfMIPS Assembly Language Programmer’s ...

anjichan4261的博客 402

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

龙芯下汇编语言编程(1)

作者: comcat 发表日期: 2007-03-22 11:20           http://comcat.blog.openrays.org/blog.php?do=showone&tid=310   1. Hello World 从经典的Hello World开始: .text #表示将后面的代码编译后置于目标文件的.text段 .globl main #声明mai

LonlyGod的专栏 1674

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

汇编语言:从硬件的视角看编程

机器指令,可以视为编程中的“结绳记事”方式,而汇编语言则类似于古老的“甲骨文”。通过汇编器(Assembler)的转换,汇编语言的源代码能够被翻译成二进制指令,供计算机执行。

sldwan的博客 957

[嵌入式系统-5]:龙芯1B 开发学习套件 -2- LoongIDE 集成开发环境集成开发环境的安装步骤

LoongIDE(龙芯开发工具集成环境)是一款专门用于龙芯计算机开发的集成开发环境(IDE)。龙芯是中国自主研发的高性能处理器架构,LoongIDE是为支持龙芯开发者进行软件开发而开发的工具。LoongIDE提供了一系列工具和功能,旨在简化和加快龙芯平台上的应用程序开发过程。它提供了代码编辑器、编译器、调试器性能分析工具和软件包管理器等功能,以支持全面的软件开发工作流程。LoongIDE提供了一个集成的文本编辑器,支持多种编程语言,如C/C++、汇编语言等,以便开发者编写和编辑源代码。

文火冰糖(王文兵)的博客 5168

arm平台下的反汇编pdf_当好开源生态建设排头兵——龙芯平台移植容器热迁移工具CRIU纪实...

点击关注“蓝字”探知芯片世界摘 要龙芯在信息化推广中,用户需要在龙芯平台上移植一些社区开源软件,用来支撑应用系统。龙芯长期建设开源软件工程师团队,完成社区开源软件在龙芯平台上的移植工作。容器热迁移工具CRIU是云平台中广泛使用的工具,经过龙芯工程师的努力,克服汇编语言、动态编译与链接、内核级调试等众多技术难点,最终成功完成移植。本项目移植一共添加和修改代码7655行,其中汇编语言代码20...

weixin_39625747的博客 380

[嵌入式系统-4]:龙芯1B 开发学习套件-1-开发版硬件介绍

龙芯 1B 开发学习套件学习过程与步骤:(1)龙芯 1B 开发版 (本文)-》(2)SOC 龙芯1B芯片手册 =》(3)LS232 MIP32 CPU内核 =》(4)MIP32汇编语言 =》(5)龙芯 1 系列芯片的IDE集成开发环境 =》(6)裸机启动 =》(7)裸机应用程序 =》(8)轻量级实时嵌入式操作系统 =》(9)驱动程序 =》(10)应用程序龙芯 1B 芯片是龙芯中科技术股份有限公司研发的 SoC 芯片,具有完全意义上的自主知识产权。该芯片使用LS232 内核。

文火冰糖(王文兵)的博客 3971
上一篇: MIPS GCC 嵌入式汇编(龙芯适用)
下一篇: 龙芯版 memcpy 的实现
LonlyGod
博客等级 码龄15年 32粉丝 1原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值