首页
社区
课程
招聘
[求助]关于一些基础知识
发表于: 2009-2-10 20:13 4093

[求助]关于一些基础知识

2009-2-10 20:13
4093
请问各位大侠:
(1)计算机启动后,显示器映射到内存是怎么实现的;还有其他像USB、网卡、声卡等会不会被映射为内存内容?它们的地址分配有什么特点?
(2)在C中用嵌入式汇编,用int 0x13在软盘里写入"Hello World!"(指针tmp)再用int 0x13的子程序读取刚写入的内容(指针ttmp),最后输出,得到Hello World!的输出;
但是当我分开执行时:先运行写入,退出程序;再运行读取,并输出,得到一堆乱码……用WinHex打开软盘看内容,并没找到"Hello World!"……这是为什么呢?
还有,为什么一定要连续用int 0x13写入并读取才能得到"Hello World!"的输出?

谢谢!!

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 2368
活跃值: (81)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
2
确实够基础...
不过我不会...
2009-2-10 21:00
0
雪    币: 158
活跃值: (43)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
看看王爽的汇编.
2009-2-10 21:34
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看了就会了?
2009-2-10 21:37
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
5
1.要从PC的体系结构说起。简单来说,INTEL的处理器存储器地址空间和IO地址空间是独立编址的,但是由于一些历史原因,存储器地址空间中某些段被特定的设备IO占去,从而形成了不连续、不一致的内存格局。比如,16色文本模式的VGA显示适配器(即显示卡)占用了存储器地址空间中0xb8000开始的0xFFFF字节,而256色图形模式的VGA占用地址0xA00000开始的地址空间。

这种所谓的“映射”是硬件译码逻辑实现的。

除显示卡外的其它设备,与显卡不同。

对于的PCI总线上的设备,根据PCI总线的规范说明,支持动态配置,并且可以编程选择IO映射方式或存储器映射方式。

对于老的ISA总线上的设备,不支持动态配置,设备采用IO方式还是存储器映射,当设备被安装后由硬件连接所决定。

像键盘、鼠标这样的外设,其硬件编程规范中涉及的寄存器较少,历史原因,直接使用IO方式,不采用存储器方式。而网卡这种有大量存储器的设备,有的驱动程序会使用存储器映射,有的驱动程序则用DMA与主存之间传输数据。

2.不是磁盘有坏道,就是你的程序不正确,才导致不能按预想工作。可能是没有处理好内嵌汇编,要调用int 0x13,可以不用内嵌汇编,试试int86()函数。
2009-2-10 23:22
0
雪    币: 240
活跃值: (26)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
谢谢书呆彭的回答
第一个问题完全明白了~
第二个问题,软盘应该不存在坏道,因为是在虚拟机器上运行……不过int86和int86x是执行软件中断或者映射为默认中断的,在没有操作系统的机器上运行这个好像和用int 0x13一样……

AH = 03
AL = number of sectors to write  (1-128 dec.)
CH = track/cylinder number  (0-1023 dec.)
CL = sector number  (1-17 dec., see below)
DH = head number  (0-15 dec.)
DL = drive number (0=A:, 1=2nd floppy, 80h=drive 0, 81h=drive 1)
ES:BX = pointer to buffer

AH = 02
AL = number of sectors to read        (1-128 dec.)
CH = track/cylinder number  (0-1023 dec., see below)
CL = sector number  (1-17 dec.)
DH = head number  (0-15 dec.)
DL = drive number (0=A:, 1=2nd floppy, 80h=drive 0, 81h=drive 1)
ES:BX = pointer to buffer

于是,我用TC:
#define RUNALL
char* tmp = "Hello World!";
char* tmp2;
#ifdef RUNALL
_AX = tmp;
_ES = _AX;
_AX = 0x0301;
_CX = 1;
_DX = 0;
_BX = 0;
asm int 0x13
#endif
_AX = tmp2;
_ES = _AX;
_AX = 0x0201;
_CX = 1;
_DX = 0;
_BX = 0;
asm int 0x13
printf(tmp2);
有#define RUNALL就正常(但正常情况下用winhex打开软盘文件还是找不到hello world),没有反之…………

再次感谢以上帮助我的人,谢谢!
2009-2-11 11:04
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
有没有那个Dp的书啊?
2009-2-11 11:26
0
雪    币: 240
活跃值: (26)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
什么DP???
2009-2-11 11:35
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
9
当然一样了,不一样就不能用它 替代了。

但是用C函数的方式去调用,比内嵌汇编更安全。内嵌汇编必须处理好与其它C代码之间的协调问题,寄存器保存、状态保存等,而用C函数,则不会出现由此引起的错误。
2009-2-11 12:40
0
雪    币: 240
活跃值: (26)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
原来如此……
改了还是运行不正确……
不过还是谢谢书呆彭~

还是回去再啃啃那本linux内核源码吧……
2009-2-11 16:00
0
游客
登录 | 注册 方可回帖
返回
//