问一道面试题

Breeze 2004-06-27 08:14:45
用一个函数实现内存拷贝

void FAR memcopy(char *dest_ptr,char *src_ptr,int n)

实现n个字节的拷贝,系统在保护模式下运行,可4G寻址

不明白在保护模式下什么意思,那位兄弟能用代码实现一下啊,谢谢了
...全文
391 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
lin_1105 2004-07-01
  • 打赏
  • 举报
回复
hao
sdice 2004-07-01
  • 打赏
  • 举报
回复
你在VC6里写一段DEBUG版本的代码,F11跟进去看看吧,可以看到MSCRT的源代码.
xjp6688 2004-07-01
  • 打赏
  • 举报
回复
up
yin0731 2004-07-01
  • 打赏
  • 举报
回复
汇编里的吧!
pacman2000 2004-07-01
  • 打赏
  • 举报
回复
是可以,但是不够优化,速度慢。
csdn2010 2004-07-01
  • 打赏
  • 举报
回复
╭═══╮ ╭═══╮ ╭══════╮   
╰╮ ╭╯ ╰╮ ╭╯ ╰╮ ╭══╮╰╮  
 ║ ║   ║ ║   ║ ║  ╰╮╰╮ 
 ║ ║   ║ ║   ║ ║   ║ ║ 
 ║ ║   ║ ║   ║ ║   ║ ║ 
 ║ ║   ║ ║   ║ ║  ╭╯╭╯ 
 ║ ║   ║ ║   ║ ╰══╯╭╯  
 ║ ║   ║ ║   ║ ╭═══╯   
 ║ ║   ║ ║   ║ ║       
 ║ ║   ║ ║   ║ ║       
 ║ ║   ║ ║   ║ ║       
 ╰╮╰╮ ╭╯╭╯   ║ ║       
  ╰╮╰═╯╭╯   ╭╯ ╰╮      
   ╰═══╯    ╰═══╯
Justin2003 2004-07-01
  • 打赏
  • 举报
回复
xue....
qwertasdfg123 2004-07-01
  • 打赏
  • 举报
回复
也行
loushubin 2004-07-01
  • 打赏
  • 举报
回复
flyerlxg 2004-07-01
  • 打赏
  • 举报
回复
学习学习!
wangyamin 2004-07-01
  • 打赏
  • 举报
回复
1: 加上判断 size_t count 》=0;
2: 加上判断(int)dst + count<2^32 和 加上判断(int)src + count<2^32 ;
3 如果size_t 是无符号,还要注意考虑2 的判断中溢出的问题。

为了效率~最好用汇编~
Breeze 2004-06-30
  • 打赏
  • 举报
回复
那这样不行么,为什么要这么写呢

void FAR* memcopy(char *dst,char *src,size_t count)
{
void * ret = dst;

for(int i=0;i<n;i++)
*(char *)(dst+i)=*(char *)(src+i);

return(ret);
}

AgedBOY 2004-06-30
  • 打赏
  • 举报
回复
呵呵呵呵……
qwertasdfg123 2004-06-30
  • 打赏
  • 举报
回复
我们都是在保护模式编程的。
如果你做驱动的话,那么就要牵制到实模式、保护模式、x86模式。

返回ret是为了链式表达式。
ljux 2004-06-30
  • 打赏
  • 举报
回复
看不出这个保护模式的程序和一般程序有啥不同,不知道ret是干啥用di.我是菜鸟
jk01dingxian 2004-06-30
  • 打赏
  • 举报
回复
楼上答的非常正确,建议楼主搞本汇编的书看看。我们的课本书”IPM-PC汇编语言程序设计“还可以的。或者网上下一本电子书看看。
qwertasdfg123 2004-06-30
  • 打赏
  • 举报
回复
8086/8088的微机只有一种工作模式(即实模式)只能处理1M以下的地址(16位),这种地址被城为实地址。后来Intel为了突破1M的内存的限制,推出了386等芯片,增加了保护模式,在32位保护模式下,程序可以访问4G内存空间。但同时为了同以前的程序保持兼容,所以旧程序在实模式下运行,而32位程序可以运行在保护模式下,从而最大地发挥服务器的能力。DOS是运行在实模式的,而Windows 9x/NT都是运行在保护模式的。CPU有专门的保护模式指令。

void FAR* memcopy(char *dst,char *src,size_t count)
{
void * ret = dst;


while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}

return(ret);
}

hxblvc 2004-06-30
  • 打赏
  • 举报
回复
系统在保护模式下运行!

不明白,占个地,学习一下
peter9606 2004-06-30
  • 打赏
  • 举报
回复
今天已经第二次看到这个名词了
yux007 2004-06-30
  • 打赏
  • 举报
回复
关注

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧