汇编操作显存

nature_he 2010-06-07 10:52:55
自己在学操作系统;
碰到一句汇编语言
mov edi, (80 * 10 + 0) *2 ; 注释:屏幕第十行,第0列
我想问下上面的计算式的数字都代表什么,如何和显存对应的
...全文
175 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
大熊猫侯佩 2010-06-08
  • 打赏
  • 举报
回复
blog节选:

b. 使用类似于bios中断字符显示的规则,一个字符占一个word,

低位为字符的ascii码,高位为显示属性。我这里显示闪烁的

红色字体所以属性为 84h。与bios中断不同的是,我们是直接

写视频缓冲,其物理地址为 0b8000h 。我写了一个显示

函数,包含两个参数:第一个是字符串地址,第二个是显示的

位置。为了美观,我将2行字符串显示在屏幕的倒数最后两行

上:


Screen_W equ 50h
Screen_H equ 19h ;1ch
Show_Pos_Line0 equ (Screen_W * (Screen_H - 2) + 5) * 2
Show_Pos_Line1 equ (Screen_W * (Screen_H - 1) + 5) * 2


函数内容如下:


;*************************************************************************
_DisplayString proc _lpstr,_pos
local pa:qword
local lpvmem:dword

;mov dword ptr [pa+1],Video_Addr
;mov dword ptr [pa+5],0

mov dword ptr [pa],Video_Addr
mov dword ptr [pa+4],0

push 0 ;MmNonCached
push 8000h ;NumberOfBytes
;push dword ptr [pa+5]
;push dword ptr [pa+1]
push dword ptr [pa+4]
push dword ptr [pa]
call MmMapIoSpace

mov lpvmem,eax
mov esi,_lpstr
mov edi,lpvmem
add edi,_pos
mov bh,84h ;char show_attribute

.while TRUE
.if byte ptr [esi] != 0
mov bl,byte ptr [esi]
mov word ptr [edi],bx
inc esi
inc edi
inc edi
.else
.break
.endif
.endw

invoke MmUnmapIoSpace,lpvmem,8000h

ret

_DisplayString endp


最后不要忘了用MmUnmapIoSpace取消映射。

完整文章可以参考我blog中原创的: 和DriverStudio"过不去"之加强版
link : http://blog.csdn.net/mydo/archive/2007/09/18/1790125.aspx


2010-06-07
  • 打赏
  • 举报
回复
每行 80 个字符,一个字符对应两个字节。
前言 从Windows出现开始,汇编语言似乎在慢慢地销声匿迹,但本书可以让人放弃这个观点,其实在Win32环境下,汇编语言依然强大。 Why——为什么选择Win32汇编 选择Win32汇编的理由是什么呢? 在DOS时代,学习汇编就是学习系统底层编程的代名词,仅要成为一名入门级的汇编程序员,就需要学习从CPU结构、CPU工作方式、各种硬件的编程方法到DOS工作方式等范围很广的知识。随着Windows时代的到来,Windows像一堵巨大的墙,把我们和计算机的硬件隔离开。对于DOS的汇编程序员来说,就像在一夜之间,我们发现自己曾经学过的几乎所有的东西都被Windows封装到内核中去了,由于保护模式的存在,我们又无法像在DOS下那样闯入系统内核为所欲为。在Windows下用任何语言编程都必须遵循Windows的规范,汇编也不例外,也就是说,汇编不再是一种“有特权”的语言。面对汹涌而来的Visual C++,Visual Basic,PowerBuilder和Java等各个领域的猛将,从DOS时代“为所欲为”的“系统警察”岗位下岗,在其他领域又没有一技之长,汇编语言似乎失去了生存的意义,有很多人在DOS转向Windows的时候放弃了汇编语言。 但是经过短暂的失落,摆正了自己在系统中的位置,我们发现从“系统警察”转换到遵循Windows规范的“好市民”后,汇编语言又慢慢地在这个世界流行起来了。毕竟,不能为所欲为也可以有好的一面,我们可以不必再考虑一些老大难的问题,如程序运行时会面对什么样的显示卡,如何驱动不同的打印机,内存不够了如何用磁盘交换,等等。我们也可以在了解更少硬件知识的情况下就可以掌握Win32的汇编编程。而且,我们惊喜地发现,做了“好市民”以后,我们反而拥有了和其他语言同样的权利——为了做图形和界面等方面的功能,汇编程序员在DOS时代连做梦都在羡慕C语言庞大的函数库,而现在,Windows为我们提供了比这还要多得多的函数,以至于其他大部分语言可以做出来的功能,汇编都可以做,而其他语言做不到的功能,汇编照样可以做!所以这就是理由之一:Win32汇编可以当做一种功能强大的开发语言使用,使用它完全可以开发出大型的软件来。 正因为Win32汇编看上去不再那样低级,于是有读者曾经提出:Win32汇编讲的都是用API来写程序,和高级语言差不多,以前在DOS下使用的中断什么的都不能用,所以没有什么新奇的了。还有读者认为本书只不过是MSDN的汇编版本而已。言下之意就是:学汇编就是为了了解高级语言底下一层的功能,但现在Win32汇编却使用和C++等语言相同的API接口,既然和高级语言处于同一个级别,我们为什么还要去和机器指令打交道呢,还不如去学Visual C++方便。 但是我们可以这样问一问自己: 问:在DOS汇编中我们为什么用中断功能? 答:为了使用DOS内核提供的功能。 问:在DOS中我们常常自己用操作I/O端口的方法读写硬盘或操作显卡吗? 答:不,我们用系统提供的int 13h和int 10h。 …… 同样,在Win32汇编里使用API也是为了使用Windows内核提供的功能。只不过使用的方式不再是中断方式而已,这不是Win32汇编语言“高级化”了,而是高级语言因为使用Windows的API接口而“低级化”了,其代价就是无法移植到其他系统,用Visual C++写的程序是无法移植到其他操作系统平台上的,只有和平台无关的ANSI C++等才能算是真正意义上的高级语言。 其实,任何汇编语言都是和操作系统密切相关的,不管是DOS汇编、Win32汇编,还是Linux汇编,都是基于特定的操作系统的,如果一定要绕过操作系统,那么就不会有DOS汇编和Win32汇编的区别了,但是这样的话我们不是在学汇编,而是在自己开发操作系统。高级语言在不同的操作系统上看起来都差不多,但作为一种低级语言,不同操作系统上的汇编就是不同的世界。所以,既然Windows和DOS是两个完全不同的操作系统,我们就必须抛弃DOS汇编中的大部分概念从头开始学习Win32汇编。这就是理由之二:Win32汇编是Windows环境下一种全新的编程语言。 Win32环境下的很多高级语言,如Visual C++和Visual Basic等,一如既往地对实现的细节进行了或深或浅的封装,就连最能表现Windows特征的部分,如消息循环和多线程的处理等内容也都被隐藏封装,使我们在使用它们进行可视化编程的同时,无法全面了解Win32程序运行的具体方式。在学习Win32汇编以后,这些隐藏在高级语言后面的细节就暴露出来了。 由于封装的关系,各种高级语言或多或少存在某种“缺陷”,比如VB不支持指针,结果很多需要使用指针的API用起来就很不方便,像多线程一类的特征在VB中就无法实现,PowerBuilder也是如此;C语言已经是最灵活的高级语言了,但还是无法在代码级别处理某些需求;而汇编语言见到的是一个最真实的操作系统,它可以用最灵活的方式使用各种系统功能,第13章中有关进程隐藏的内容就是最好的写照。所以理由之三就是:使用Win32汇编语言是了解操作系统运行细节的最佳方式。 最后的理由根本不是理由,而是必然的选择,当我们在Windows环境下进行加密解密、逆向工程,还有病毒、木马等有害代码的分析和防治工作时,Win32汇编是唯一的选择。在任何讨论这方面内容的书籍中,汇编代码的篇幅总是很大的。因此,要想深入了解这些内容的前提就是深入汇编编程。 How——如何学习Win32汇编 以往的汇编书籍往往把重点放在硬件结构和指令上,讲述了一大堆电路框图和指令列表,把大家搞得晕晕乎乎后,再举出一些重量级的例子,不是一些像数组、矩阵计算一类的复杂运算,就是开始图形模式画图,以至于大家看完以后就再也找不到北了!实际上,这些例子不是太难了,而是太枯燥了。有人说,学汇编就像考大学,千军万马过独木桥,太多的人中途放弃了,只有少数人坚持到最后。 笔者认为:学习汇编应该在轻松的环境下进行,在学习中使用的例子不一定太复杂,但一定要有吸引力。用汇编写复杂的运算程序固然会比C更有效率,但同样的事在C中用一个表达式就全部搞定了,从这里开始学汇编,给人的感觉就像从复杂的公式开始学算术,要知道,加法还没有学会呢!而对于高级语言封装起来的系统功能,用汇编解释起来就非常直接,非常自然,也更容易懂。以笔者自己学汇编的过程来说,那时候是1990年,刚好是中国第一次病毒大流行,大家的计算机上都是那个病毒的开山鼻祖——乒乓病毒,在流行DOS的时期,看着在屏幕上蹦的小球,心中就有一个问题:如何编出这样一个玩意来呢?要知道DOS是单任务的,而那个球在别的程序运行的时候照样蹦!这用当时流行的FORTRAN、C等课程中学到的任何知识都无法解释,因为这些课程中不可能有TSR、中断、引导区等内容。带着这样一个疑问学习汇编,在分析乒乓病毒的过程中啃一条条不懂的指令,病毒分析完了,汇编课也学完了,而且反过来看那些复杂的计算程序都是那么顺理成章,不攻自破了。实际上,从一些实用的系统功能开始学习汇编远比学矩阵计算容易理解。 正如最经典的C程序就是那个“Hello,World!”一样,这个程序的有名并不是因为它用高深复杂的语句放倒了一大批人,而是它以最简单易懂的方式让人们走入C语言的大门。对于Win32汇编也是如此,从最简单的例子开始总是没错的,笔者建议读者跟随本书中从简到繁的例子,努力做到理解并灵活引用这些例子中的各种功能,正如“熟读唐诗三百首,不会写诗也会吟”,最后能够熟练地使用Win32汇编来解决各种编程需求就是最大的胜利。 另外,正如前面讲到的,汇编语言的学习必须和操作系统紧密结合。经过简单的调查,笔者发现很多高校使用的汇编教程还是停留在清华91版《IBM-PC汇编语言程序设计》之类的教材上,虽然这些教材中基础知识部分永远不会过时,但涉及操作系统的部分还是停留在DOS阶段。随着DOS操作系统的悄然引退,继续把精力花在上面是一种浪费,因为任何语言都必须有应用的平台,否则课程学完之后会尴尬地发现没有地方可以应用。笔者认为,在《IBM-PC汇编语言程序设计》之类传统教材中的基础部分学习完毕以后,重点就应该转向Win32汇编,以及保护模式方面的知识。 关于本书的内容 本书尝试从编写应用程序的角度,从“Hello,World”这个简单的例子开始到编写多线程、注册表和网络通信等复杂的程序,通过70多个从简单到复杂的例子,逐步深入Win32汇编编程的方方面面。笔者从事汇编编程已经有十几年的历史了,从8086时代的DOS汇编编程开始到当前的Win32汇编编程,从一个初学者到现在能利用Win32汇编来解决大部分编程需求,中间也经过了很长时间的摸索和大量的挫折,所以笔者很清楚初学者在哪些地方会遇到问题,但是涉及Win32汇编的书籍却实在太少了。正是因为如此,笔者决心把本书的目标定为:能让读者入门并在最后能熟练掌握Win32汇编编程,而不是那种深入系统奥秘一类的书籍。 从这个目标出发,本书的选材中尽量去掉已经有其他书籍详细讨论的部分,因为要一本书涉及全部方面是不现实的。内容全面就必然不精,内容深刻就必须围绕一个中心点,所以本书的内容并不详细讨论一般汇编教材的基础部分,如处理器结构和保护模式等,也不准备涉及Windows驱动程序、COM编程或者其他能够冠以“密技”头衔的内容。本书主要的内容将放在32位宏汇编对比DOS汇编所不同的部分,以及Win32应用程序的汇编实现上。不求全面,只求精也!(说句老实话,也不敢对自己不精通的地方妄加评论,以免破坏自己的良好形象。
一、程序功能: 1)重新启动计算机 2)引导现有操作系统 3)重启时进入时钟显示界面 4)修改CMOS时钟 二、运行步骤: 1)命令提示窗口输入“cmd”,将asm源文件放入当前目录下,将软驱放入软盘,运行masm、link,将代码写入软盘。 2)将电脑设置为从软驱启动,插入写入代码的软盘,重启电脑。此时会进入界面,界面显示为 1、reset pc 2、start system 3、clock 4、set clock 三、本程序涉及的一些问题 1、将启动代码写入软盘0面0道1扇区 2、读取\写入CMOS数据 3、重新启动计算机 4、引导现有操作系统 5、编写int 9键盘中断 6、带有一定格式的字符的动态显示\颜色改变\待修改项的闪烁效果 7、BCD码和ASCII码的转换 8、键盘缓冲区的情趣 9、对显存的直接操作 此外,寄存器的合理使用、编写中断程序时中断现场的保存与恢复及其在内存地址中的合理安排、数据在内存中的位置及其读取/写入、子程序在内存中地址的合理安排以防代码被覆盖、屏幕刷新、修改日期数据时对数据输入范围的判断、如何显示界面、与用户的互动等都是一些注意的细节。 四、注意: 1、运行后软盘0面0道1扇区会写入启动代码,如果直接在微软操作系统下读取,会出现“软盘尚未格式化”的提示,此时属正常情况,请勿格式化; 2、将电脑设置为优先从软驱启动; 3、选项4会真实修改系统时间,如果输入数据超出系统允许范围会导致进入不了现有操作系统,此时可进入安全模式下改回原来的系统时间。 五、感想 这个程序耗时两周,自己独立完成,收获良多,对汇编语言及计算机硬件有了更多的了解。编写代码期间出现很多问题,印象最深刻的是由于子程序的内存地址没有安排合理导致代码覆盖,思考良久才发现并解决。汇编语言在界面的显示及美化、与用户的有效互动、算法编写及可读性等方面与高级语言相比差距很大,当面对较多的变量时,如何有效使用有限的寄存器也是需要慎重考虑的问题。汇编语言除了效率高之外,可以直接对计算机硬件操作,这是高级语言无法相比的。
Menuet 是英国一位软件工程师 Ville Mikael Turjanmaa 利用业余时间开发的,完全由 x86汇编语言于 2000年写成的一款32位操作系统。经过大量的修改与完善后, Menuet OS目前已经成为一个用功能完善的操作系统,目前的版本号是 0.74。Ver 0.75 正在开发中。 MenuetOS 并不是一个类Unix操作系统,它完全由 Asm语言编写的系统。Menuet 不基于当前任何一款流行的操作系统而运作,主要是为在开发过程中避免复杂的编程及各种不可预料的 Bug。 尽管Menuet是完全用 32位汇编写成的,但它的系统程序构架并不完全是为汇编语言而保留,它的接口实际上可用于任何程序设计语言。尽管如此,系统开发的目的还是为更简化 Asm程序设计而设计,系统下 GUI编程尤其体现这一点。 Menuet OS 的特点: 多任务,多线程 图形用户界面,可以达到 16bit color,1280x1024 dpi 程序开发比 Windows 和 Linux 之类的系统更容易 IDE环境:自带应用程序及内核编辑编译工具 完全开放的源代码(GPL) TCP/IP 协议栈、PPP 及 局域网络 HTTP/MP3/Mail 服务器,3D迷宫 自由的界面,窗口可换“皮肤” 仅一张 1.44M 软盘可以装下! Menuet OS 对硬件的要求 : CPU : 386 或更高 显示: 支持 VESA 2.0的显卡(推荐使用)或支持 VESA 1.2 的显卡,至少 1M显存。VGA/EGA 显示器。(注:目前的显卡都支持 VESA 3.0,同时也向下兼容) 声卡: 兼容 SB(Sound blaster) 16声效卡 硬盘: LBA 模式 FAT32文件系统 网络: Realtech 8029/8139 芯片组网卡 鼠标: PS/2 或 COM 或 USB /*别相信这个,我的USB鼠标就用不了*/ 内存: 至少32M
MenuetOS是一个为x86(IBM兼容)计算机开发的业余操作系统,它是一款完全由汇编语言(32位)写成的迷你操作系统,因此它更小、更快,并且系统本身用应用程序占用很少的系统资源。   项目最初是芬兰人 Ville Turjanmaa(赫尔辛基大学) 利用业余时间开发完成。现在世界各地都有 MenuetOS 的开发者,他们正在不断完善这个操作系统。    这个项目目前由 Jarek Pelczar(jarekp3[@]wp[.]pl) 接管。项目的中文版由本站站长 E-mean X. 开发。   MenuetOS 并不像现在流行的 Linux 及其它如 FreeBSD、Minix 一样是一个类 Unix 的操作系统,它完全由32位汇编语言编写的系统。Menuet 及其应用程序不基于当前任何一款流行的操作系统而运作,主要是为在开发过程中避免复杂的编程及各种不可预料的 Bug。   尽管Menuet是完全用 32位汇编写成的,但它的系统程序构架并不完全是为汇编语言而保留,它的接口实际上可用于任何程序设计语言。尽管如此,系统开发的目的还是为更简化 Asm程序设计而设计,系统下 GUI编程尤其体现这一点。 ·Menuet OS 的特点   - 多任务,多线程  - 图形用户界面,可以达到 32bit color,1280x1024 分辨率  - 程序开发比 Windows 和 Linux 之类的系统更容易  - IDE环境:自带应用程序及内核编辑编译工具  - 完全开放的源代码(GPL)  - TCP/IP 协议栈、PPP 及 局域网络  - HTTP,MP3,Mail 服务器,3D迷宫  - irc, http, nntp 及 tftp客户端  - 自由的界面,窗口可换“皮肤”  - 仅一张 1.44M 软盘可以装下! ·Menuet OS 对硬件的基本要求  CPU : 386 或与之相兼容的 CPU 显示: 支持 VESA 2.0(建议使用) 或 VESA 1.2 的显卡,VGA/EGA 显示器。 声卡: Creative SB(Sound blaster) 16或兼容声效卡 硬盘: ATA LBA 模式 FAT32文件系统 网络: Realtech 8029/8139, Intel 8255x, 3com, PCNET32 Ethernet PCI cards PPP dialup 鼠标: PS/2 或 COM 内存: 至少32M

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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