文档详情

C 语言宏 + 内联汇编实现 MIPS 系统调用.docx

发布:2025-05-17约2.19千字共4页下载文档
文本预览下载声明

C语言宏+内联汇编实现MIPS系统调用

#definesys_open(pth,fg)({\

registerint_ID___asm__($2)=13,_FG___asm__($5)=fg;\

registerchar*_PTH___asm__($4)=pth;\

__asm__volatile(syscall\

:=r(_ID_):r(_ID_),r(_PTH_),r(_FG_));\

_ID_;})

#definesys_print_string(str){\

registerint_ID___asm__($2)=4;\

registerchar*_STR___asm__($4)=str;\

__asm__volatile(syscall\

::r(_ID_),r(_STR_));}

#definesys_print_int(i){\

registerint_ID___asm__($2)=1,_I___asm__($4)=i;\

__asm__volatile(syscall::r(_ID_),r(_I_));}

#definesys_read_int()({\

registerint_ID___asm__($2)=5;\

__asm__volatile(syscall\

:=r(_ID_):r(_ID_));\

_ID_;})

#definesys_read(fd,buf,len)({\

registerint_ID___asm__($2)=14,_FD___asm__($4)=fd,_LEN___asm__($6)=len;\

registerchar*_BUF___asm__($5)=buf;\

__asm__volatile(syscall\

:=r(_ID_):r(_ID_),r(_FD_),r(_BUF_),r(_LEN_));\

_ID_;})

#definesys_close(fd){\

registerint_ID___asm__($2)=16,_FD___asm__($4)=fd;\

__asm__volatile(syscall::r(_ID_),r(_FD_));}

#definesys_exit(){\

registerint_ID___asm__($2)=10;\

__asm__volatile(syscall::r(_ID_));}

老师推荐用在线平台编译测试,其实本地用mips-linux-gnu-gcc交叉编译也行。将以上宏定义存为头文件mips-syscall.h,然后在代码中引用,进行简单的测试:

#includemips-syscall.h

voidmain(){

sys_print_string(Inputanumber:

intn=sys_read_int();

sys_print_string(Thenumberis

sys_print_int(n);

sys_exit();

由于SPIM/MARS仿真器的执行入口和一般程序不太一样,而且需要调用exit来结束程序,所以以上代码的驻韩数写法比较怪。

本地交叉编译,编译器mips-linux-gnu-gcc12.3.0,编译参数-O2-S-om.s,去掉不相关字段:

.data

$LC0:

.asciiInputanumber:\000

$LC1:

.asciiThenumberis\000

.text

main:

lw$4,%got($LC0)($28)

li$2,4#0x4

addiu$4,$4,%lo($LC0)

syscall

li$2,5#0x5

syscall

lw$4,%got($LC1)($28)

move$3,$2

li$2,4#0x4

addiu$4,$4,%lo($LC1)

syscall

li$2,1#0x1

move$4,$3

显示全部
相似文档