2020-2021-1 20212824《Linux内核原理与分析》第五周作业

2020-2021-1 20212824《Linux内核原理与分析》第五周作业,第1张

2020-2021-1 20212824《Linux内核原理与分析》第五周作业 前置知识 系统调用

指令级别

参数传值顺序

EBX,EXC,EDX,ESI,EDI,EBP

系统调用 time系统调用

time_asm.c

#include
#include

int main(){
	time_t tt;
	struct tm *t;
	asm volatile(
		"mov $0,%%ebxnt"
		"mov $0xd,%%eaxnt"
		"int 0x80nt"
		"mov %%eax,%0nt"
		:"=m"(tt)
	);
	t = localtime(&tt);
	printf("time:%d:%d:%d:%d:%d:%d:n",t->tm_year+1900,t->tm_mon,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);
	return 0;
}

这个代码有个地方好像是错的
t->tm_mda===>t->tm_mday

rename 系统调用

rename.c

#include
int main(){
	int ret;//承接系统返回值
	char *oldname="hello.c";
	char *newname="newhello.c";
	ret = rename(oldname,newname);
	if(ret == 0)
		printf("Rename ok");
	else
		printf("Rename failed");
	
	return 0;
}



rename_asm.c

#include
int main(){
	int ret;
	char *oldname="hello.c";
	char *newname="newhello.c";
	asm volatile(
		"movl %2,%%ecxnt" //newname是第二个值,所以赋给ecx 
		"movl %1,%%ebxnt" //oldname 是第一个值,所以赋给ebx
		"movl $0x26,%%eaxnt" //rename的系统调用号是38
		:"=a"(ret)
		:"b"(oldname),"c"(newname)
	);
	if(ret ==0 )
		printf("Rename ok!");
	else
		printf("Rename failed");
		return 0;
}


syscall.c

#include
#include
int main(){
	int ret;
	char *oldname="hello.c";
	char *newname="newhello.c";
	ret = syscall(SYS_reanme,oldname,newname);
		if(ret ==0 )
		printf("Rename ok!");
	else
		printf("Rename failed");
		return 0;
遇到问题


估计是因为 实验楼的环境是64位,所以会出错
加上这个,应该就行gcc rename_asm.c -o rename_asm -m32

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/4666257.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-06
下一篇 2022-11-06

发表评论

登录后才能评论

评论列表(0条)

保存