| 标题 |
作者 |
阅读数 |
发布时间 |
|
|
linuxkaka |
620 |
2007-8-5 |
|
3.7电源 LDO(Low Dropout)属于DC/DC变换器中的降压变换器,它具有低成本、低噪声、低功耗等突出优点,另外它所需要的外围器件也很少,通常只有 1~2 个旁路电容。 在电路板上我们分别用两个LDO来实现5V向3.3V(存储接口电平)和1.8V(ARM内核电平)的转换。up监控电路采用MAX708芯片,提供上电、掉电以及降压情况下的复位输出及低电平有效的人工复位输出:3.8其它 SN74LVTH62245A提供总线驱动和缓冲能力:S3C2410A集成LCD液晶显示器控制电路,外部引出接口:触摸屏有电阻式、电容式等,其本质是一种将手指在屏幕上的触点位置转化为电信号的传感器。手指触到屏幕,引起触点位置电阻或电容的变化,再通过检测这一 电性变化,从而获得手指的坐标位置。通过S3C2410A集成的AD功能,完成电信号向屏幕坐标的转化,触摸屏接口如下:键盘则直接利用CPU的可编程I/O口,若连接 mxn键盘,则需要m+n个可编程I/O口,由软件实现键盘扫描,识别按键:3.9整体架构 下图呈现了ARM处理器及外围电路的整体设计框架:4.小结 本章讲解了基于S3C2410A ARM处理器电路板硬件设计的基本组成,为后续各章提供了总体性的准备工作。
>> 阅读全文
|
|
linuxkaka |
766 |
2007-8-5 |
|
BootLoader指系统启动后,在操作系统内核运行之前运行的一段小程序。通过BootLoader,我们可以初始化硬件设备、建立内存空间的映 射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。通常,BootLoader是严重地依赖于硬件而实现 的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的 BootLoader 几乎是不可能的。尽管如此,我们仍然可以对BootLoader归纳出一些通用的概念来,以指导用户特定的BootLoader设计与实现。 BootLoader 的实现依赖于CPU的体系结构,因此大多数 BootLoader 都分为stage1 和stage2 两大部分。依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在 stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的。而stage2 则通常用C 语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。 BootLoader 的 stage1 通常包括以下步骤: ·硬件设备初始化; ·为加载Boot Loader的stage2准备 RAM 空间; ·拷贝Boot Loader的stage2 到RAM空间中; ·设置好堆栈; ·跳转到 stage2 的 C 入口点。 Boot Loader的stage2通...
>> 阅读全文
|
|
linuxkaka |
593 |
2007-8-5 |
|
(1)内核初始化:Linux内核的入口点是start_kernel()函数。它初始化内核的其他部分,包括捕获,IRQ通道,调度,设备驱动,标定延迟循环,最重要的是能够fork"init"进程,以启动整个多任务环境。 我们可以在init中加上一些特定的内容。 (2)设备驱动:设备驱动占据了Linux内核很大部分。同其他操作系统一样,设备驱动为它们所控制的硬件设备和操作系统提供接口。 本文第四章将单独讲解驱动程序的编写方法。 (3)文件系统:Linux最重要的特性之一就是对多种文件系统的支持。这种特性使得Linux很容易地同其他操作系统共存。文件系统的概念使得用户能 够查看存储设备上的文件和路径而无须考虑实际物理设备的文件系统类型。Linux透明的支持许多不同的文件系统,将各种安装的文件和文件系统以一个完整的 虚拟文件系统的形式呈现给用户。 我们可以在K9S1208 NAND FLASH上移植cramfs、jfss2、yaffs等FLASH文件系统。 3. init进程 在init函数中"加料",可以使得Linux启动的时候做点什么,例如广州友善之臂公司的demo板在其中加入了公司信息:static int init(void * unused){lock_kernel();do_basic_setup();prepare_namespace();/** Ok,...
>> 阅读全文
|
|
linuxkaka |
757 |
2007-8-5 |
|
设备驱动程序是操作系统内核和机器硬件之间的接口,它为应用程序屏蔽硬件的细节,一般来说,Linux的设备驱动程序需要完成如下功能: ·设备初始化、释放; ·提供各类设备服务; ·负责内核和设备之间的数据交换; ·检测和处理设备工作过程中出现的错误。 Linux下的设备驱动程序被组织为一组完成不同任务的函数的集合,通过这些函数使得Windows的设备操作犹如文件一般。在应用程序看来,硬件设备 只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作,如open ()、close ()、read ()、write () 等。 Linux主要将设备分为二类:字符设备和块设备。字符设备是指设备发送和接收数据以字符的形式进行;而块设备则以整个数据缓冲区的形式进行。在对字符 设备发出读/写请求时,实际的硬件I/O一般就紧接着发生了;而块设备则不然,它利用一块系统内存作缓冲区,当用户进程对设备请求能满足用户的要求,就返 回请求的数据,如果不能,就调用请求函数来进行实际的I/O操作。块设备主要针对磁盘等慢速设备。 1.内存分配 由于Linux驱动程序在内核中运行,因此在设备驱动程序需要申请/释放内存时,不能使用用户级的malloc/f...
>> 阅读全文
|
|
linuxkaka |
389 |
2007-8-5 |
|
内容简介:============================Linux下的设备驱动程序被组织为一组完成不同任务的函数的集合,通过这些函数使得Windows的设备操作犹如文件一般.在应用程序看来,硬件设备 只是一个设备文件,应用程序可以象操作普通文件一样对硬件设备进行操作,如open ()、close ()、read ()、write () 等。设备驱动程序是操作系统内核和机器硬件之间的接口,它为应用程序屏蔽硬件的细节,一般来说,Linux的设备驱动程序需要完成如下功能:设备初始化、释放; ·提供各类设备服务; ·负责内核和设备之间的数据交换; ·检测和处理设备工作过程中出现的错误。============================ 3.字符设备驱动 我们必须为字符设备提供一个初始化函数,该函数用来完成对所控设备的初始化工作,并调用register_chrdev() 函数注册字符设备。假设有一字符设备"exampledev",则其init 函数为:void exampledev_init(void){if (register_chrdev(MAJOR_NUM, " exampledev ", &exampledev_fops))TRACE_TXT("Device exampledev driver registered error");elseTRACE_TXT("Device exampledev driver registered successfully...
>> 阅读全文
|
| 标题 |
作者 |
阅读数 |
发布时间 |
|
|
webenson |
1196 |
2007-9-17 |
|
ARM9S3C2410微处理器与Linux的结合越来越紧密,逐渐在嵌入式领域得到广范的应用。目前,在便携式消费类电子产品、无线设备、汽车、网络、存储产品等都可以看到S3C2410与Linux相结合的身影。 S3C2410微处理器是一款由Samsung公司为手持终端设计的低价格、低功耗、高性能,基于ARM920T核的微处理器。它带有内存管理单元(MMU),采用0.18mm工艺和AMBA新型总线结构,主频可达203MHz。同时,它支持Thumb 16位压缩指令集,从而能以较小的存储空间获得32位的系统性能。 在众多嵌入式操作系统中,Linux目前发展最快、应用最为广泛[1]。性能优良、源码开放的Linux具有体积小、内核可裁减、网络功能完善、可移植性强等诸多优点,非常适合作为嵌入式操作系统。一个最基本的Linux操作系统应该包括:引导程序、内核与根文件系统三部分。 与Linux2.4内核相比,2.6内核吸收了最新的技术,在性能、可测量性、器件支持和可用性方面有了大幅度提高;支持更多的体系结构、处理器、总线、接口和设备;标准化了内部接口;简化了扩展或添加新设备的步骤等。 本文着重介绍如何制作一个基于linux-2.6.19内核的小型Linux操作系统,并将它移植到S3C2410开放板上。内容包括交叉编译环境的建立,引导程序...
>> 阅读全文
|
|
webenson |
805 |
2007-9-2 |
|
本文通过整理之前研发的一个项目(ARM7TDMI + uCLinux),分析内核启动过程及需要修改的文件,以供内核移植者参考。整理过程中也同时参考了众多网友的帖子,在此谢过。由于整理过程匆忙,难免错误及讲解的不够清楚之处,请各位网友指正,这里提前谢过。本文分以下部分进行介绍: 1. Bootloader及内核解压 2. 内核启动方式介绍 3. 内核启动地址的确定 4. arch/armnommu/kernel/head-armv.S分析 5. start_kernel()函数分析 1. Bootloader及内核解压 Bootloader将内核加载到内存中,设定一些寄存器,然后将控制权交由内核,该过程中,关闭MMU功能。通常,内核都是以压缩的方式存放,如zImage,这里有两种解压方法: 使用内核自解压程序。 arch/arm/boot/compressed/head.S或arch/arm/boot/compressed/head-xxxxx.S arch/arm/boot/compressed/misc.c 在Bootloader中增加解压功能。 使用该方法时内核不需要带有自解压功能,而使用Bootloader中的解压程序代替内核自解压程序。其工作过程与内核自解压过程相似:Bootloader把压缩方式的内核解压到内存中,然后跳转到内核入口处开始执行。 2. 几种内核启动方式介绍 XIP (EXECUTE IN PLACE) 是指直接从存放代码的位置上启动运行。 2.1 ...
>> 阅读全文
|
|
webenson |
3214 |
2007-9-2 |
|
Linux暴风雨般地占领了嵌入式系统市场。根据工业分析家分析,大约1/3到1/2的新的32位和64位嵌入式系统设计采用了Linux。嵌入式 Linux 已经在很多应用领域显示出优势,比如SOHO家庭网络和成像/多功能外设,并在以下几方面具备巨大的跨越式发展前景:(NAS/SAN)存储,家庭数字娱乐(HDTV/PVR/DVR/STB)和手持设备/无线设备,特别是数字移动电话。 新的嵌入式Linux应用不会象掌握在智慧和工艺之神-罗神手中那样,会突然从开发者的头脑中爆发出来。大量的项目必须采用数千行的,甚至数百万行的过去的现成代码。成百上千的嵌入式项目已经成功地将其它平台的现成代码移植到Linux之上,比如Wind River VxWorks 和 pSOS, VRTX, Nucleus 和其它RTOS ,这些移植工作现在仍然有价值和现实意义。 到目前为止,大多数的关于移植旧的RTOS应用到嵌入式Linux的文献,已经在关注RTOS 接口(API),任务,调度模式和怎样将他们映射到相应的用户空间去。 在嵌入式程序的密集I/O空间中,同样重要的是,将RTOS的应用硬件接口代码向具有更加规范化模式的Linux设备启动程序的移植。 本文将纵览几种常用的内存映射I/O方法,它们经常出现于旧的嵌入式应用中。它们涵盖的范围,包括从对中断服务...
>> 阅读全文
|
|
webenson |
11209 |
2007-9-2 |
|
uC/OS-II嵌入式操作系统移植 操作系统的移植指的是使实时系统的内核能在微处理器上运行。uC/OS-II应移植到所使用的CPU上,然后才能得到应用。在uC/OS-II的移植中,处理器必须满足一下一些要求:l 处理器的C编译器能产生可重入型代码l 处理器支持中断,并且能产生定时中断l 用C语言就可以开/关中断l 处理器能支持一定数量的数据存储硬件堆栈l 处理器有将堆栈指针以及其他CPU寄存器的内容读出,并存储到堆栈或内存中去的指令实际上,uC/OS-II可以简单地看作是一个多任务调度器,在这个任务调度器上添加了与多任务操作系统相关的一些系统服务,如信号量、邮箱...
>> 阅读全文
|
|
webenson |
6134 |
2007-9-2 |
|
(讲嵌入式移植的一篇非常好的文章,原文出自《基于arm+uClinux的嵌入式系统的开发》,这是节选了其中讲移植的这一段)不同平台间程序的移植--简单程序的移植 研究程序移植的那两周是最痛苦的两周,没有太多可以借鉴的东西,只能摸黑向前走,于是更加坚定决心要整理些东西给后来的弟兄。不过话说回来,各位弟兄别被我前面说的吓倒,只要搞清你要作什么,程序移植其实是比较简单的事情。 首先列出一些问题: (1) X86上运行的程序能不能在51单片机上运行,为什么,有没有可能,如果可以,应该做哪些工作才可以实现。 (2) 相同CPU平台,DOS的程序为什么可以在windows下运行,能不能在linux下运行,为什么,作什么工作可能实现。 为什么可以移植程序,为什么要移植程序? 程序可以移植首先要感谢开发出高级语言的大牛们,记住,无论多么漂亮的代码经过编译以后都要变成CPU可以识别的机器语言,而几乎一千种CPU说着一千种语言。为保证大家有共同语言,规定一种高级语言――高级语言。每一个CPU派出自己的翻译――编译器。这个翻译精通两国语言,高级语言和自己的语言。(由此已经可以看出编译工具在程序移植中的重要性)。只要程序没有硬件上的约束,可以说这种沟通是无极限的,甚...
>> 阅读全文
|
|
linuxkaka |
2720 |
2007-8-31 |
|
书接上回,下面是init_mm的初始化,init_mm定义在/arch/arm/kernel/init_task.c:struct mm_struct init_mm = INIT_MM(init_mm);从本回开始的相当一部分内容是和内存管理相关的,凭心而论,操作系统的内存管理是很复杂的,牵扯到处理器的硬件细节和软件算法,限于篇幅所限制,请大家先仔细读一读arm mmu的部分,中文参考资料:linux内核源代码情景对话,linux2.4.18原代码分析。init_mm.start_code = (unsigned long) &_text;内核代码段开始init_mm.end_code = (unsigned long) &_etext;内核代码段结束init_mm.end_data = (unsigned long) &_edata;内核数据段开始init_mm.brk = (unsigned long) &_end;内核数据段结束每一个任务都有一个mm_struct结构管理任务内存空间,init_mm是内核的mm_struct,其中设置成员变量* mmap指向自己,意味着内核只有一个内存管理结构,设置* pgd=swapper_pg_dir,swapper_pg_dir是内核的页目录,在arm体系结构有16k,所以init_mm定义了整个kernel的内存空间,下面我们会碰到内核线程,所有的内核线程都使用内核空间,拥有和内核同样的访问权限。memcpy(saved_command_line, from, COMMAND_LINE_SIZE);//clear command arrays...
>> 阅读全文
|
|
blue88 |
1250 |
2007-8-29 |
|
[作者] hsly110 或者 猪头三[Email] pliceman_110@163.com PS:本文如果有错漏请来信指出[范围] 逆向工程[目的] 分享逆向技术心德[目标API] 未文档化的RtlInitializeGenericTable[参考文献] Secrets of Reverse Engineering[备注] 欢迎转载该文章,只要保留完整内容即可1 前言:这2天看了Secrets of Reverse Engineering一书,对分析未文档化的API的技术比较有心得,希望各位看了下面的教程,能抛砖引玉灵活的应用在逆向工程和破解技术上,方法是死的,但是人的思维是活,最重要是灵活应用。2 实践:用OllyDbg对NTDLL.DLL进行反汇编,前提你要加入NTDLL.DLL的符号表,这样你才能更好的对未文档化的API进行反汇编,你们到微软官方网站获取相应版本Windows系统的系统符号表。下面是RtlInitializeGenericTable函数的反汇编代码:01 MOV EDI, EDI ; //压入堆栈,保存EBP的数值 02 PUSH EBP ; >> 阅读全文
|
|
blue88 |
1097 |
2007-8-29 |
|
网上搜索一下,到处都是“过来人”的谆谆教导我们不要过分重视技术。技术的确不是创业成功的唯一原因,也的确是不能太把技术的重要性过分强调。假如目前国内是一种技术至上的现状,技术人员的地位虚高,那么这些言论的确有助于业内整体的协调发展。但是现状是,目前国内普遍的认识并没有很抬高技术的地位。恰恰相反,技术被过低的估计了其应有的价值,网上强调技术重要性的文章几乎没有。技术人员的地位已经是低得不能再低,在许多公司内部,已经到处都是对技术人员的轻蔑的眼光。在重要的技术几乎都由国外主导,而目前中国已经几乎丧失了任何技术主导权的今天,还在一直继续强调切不可技术主导,将会给国家的IT产业的自强发展造成严重的影响。比如今天看到的这篇关于创业团队的思考:切不可技术主导,又是一篇典型文章。其实整篇看下来,作者说的有一定道理,只不过他其实考虑的只是有关Web 2.0网站的创业,却又强扣了一顶技术无用论的大帽子。他的文章标题假如是:“关于Web 2.0网站创业的思考:切不可技术主导”的话,倒也较少可辩驳之处。可惜他文章标题的范围说的是整个创业团队,那这篇文章就完全是在误导人了。IT业技术主导创业成功的例子比比皆是,著名的有:Borlan...
>> 阅读全文
|
|
blue88 |
2079 |
2007-8-29 |
|
在微软工作的华人已近千人。在微软TechEd技术教育大会期间,他们中的16位作为讲师回到北京。他们为听众带来微软软件技术的最新进展,而他们自身的软件生涯也是一种财富。记者在大会期间,趁他们讲课 之余,采访了其中的5位讲师。 学得杂一些 “人的成长实际上是个金字塔形的,你的基础越扎实、越广,塔尖才越高。”微软Server管理部门软件设计与测试工程师陈硕就是一个典型的“杂家”。先是在北京大学地球物理系读书,毕业后保送到中科院大气物理所,后又获得普林斯顿大学全额奖学金,读了海洋学方面的硕士,最后又在德州A&M大学拿到商学硕士。当然,她一直没有忘了她的“副业”——计算机,她在北大时就选了相当多的计算机课程; 在普林斯顿大学海洋学实验室使用计算机模拟的方式来研究温室效应、厄尔尼诺等气候问题,当时用的是Cray(大型机)和Unix服务器;在德州A&M大学读书时,找到的兼职工作依旧是维护学校数百人的计算机实验室。 13岁就随父母来到美国的严治庆,本科是在明尼苏达大学电气与计算机工程...
>> 阅读全文
|
|
linuxkaka |
991 |
2007-8-23 |
|
上回我们讲到arm靠初始化完成了,打开了cache,到此为止,汇编部分的初始化代码就差不多了,最后还有几件事情做:1。初始化BSS段,全部清零,BSS是全局变量区域。2。保存与系统相关的信息:如.long SYMBOL_NAME(compat).long SYMBOL_NAME(__bss_start).long SYMBOL_NAME(_end).long SYMBOL_NAME(processor_id).long SYMBOL_NAME(__machine_arch_type).long SYMBOL_NAME(cr_alignment).long SYMBOL_NAME(init_task_union)+8192不用讲,大家一看就明白意思3。重新设置堆栈指针,指向init_task的堆栈。init_task是系统的第一个任务,init_task的堆栈在task structure的后8K,我们后面会看到。4。最后就要跳到C代码的start_kernel。b SYMBOL_NAME(start_kernel)现在让我们来回忆一下目前的系统状态:临时页表已经建立,在0X08004000处,映射了4M,虚地址0XC000000被映射到0X08000000.CACHE,MMU都已经打开。堆栈用的是任务init_task的堆栈。如果以为到了c代码可以松一口气的话,就大错特措了,linux的c也不比汇编好懂多少,相反到掩盖了汇编的一些和机器相关的部分,有时候更难懂。其实作为编写操作系统的c代码,只不过是汇编的另一种写法,和机器代码的联系是很紧密的。start_ker...
>> 阅读全文
|
|
linuxkaka |
1105 |
2007-8-21 |
|
上回书讲到已经设置好了内核的页表,然后要跳转到__arm920_setup,这个函数在arch/arm/mm/proc-arm929.s__arm920_setup:mov r0, #0mcr p15, 0, r0, c7, c7 @ invalidate I,D caches on v4mcr p15, 0, r0, c7, c10, 4@ drain write buffer on v4mcr p15, 0, r0, c8, c7 @ invalidate I,D TLBs on v4mcr p15, 0, r4, c2, c0 @ load page table pointermov r0, #0x1f @ Domains 0, 1 = clientmcr p15, 0, r0, c3, c0 @ load domain access registermrc p15, 0, r0, c1, c0 @ get control register v4/** Clear out ''''unwanted'''' bits (then put them in if we need them)*/@ VI ZFRS BLDP WCAMbic r0, r0, #0x0e00bic r0, r0, #0x0002bic r0, r0, #0x000cbic r0, r0, #0x1000 @ ...0 000. .... 000./** Turn on what we want*/orr r0, r0, #0x0031orr r0, r0, #0x2100 @ ..1. ...1 ..11 ...1#ifdef CONFIG_CPU_ARM920_D_CACHE_ONorr r0, r0, #0x0004 @ .... .... .... .1..#endif#ifdef CONFIG_CPU_ARM920_I_CACHE_ONorr r0, r0, #0x1000 @ ...1 .... .... ....#endifmov pc, lr这一段首先关闭i,d cache,清除write buffer ,然后设置页目录地址,设置domain的保护,在上节...
>> 阅读全文
|
|
linuxkaka |
1004 |
2007-8-20 |
|
查询到了处理器类型和系统的内存映像后就要进入初始化过程中比较关键的一步了,开始设置mmu,但首先要设置一个临时的内核页表,映射4m的内存,这在初始化过程中是足够了://r5=0800 0000 ram起始地址 r6=0020 0000 io地址,r7=f020 0000 虚ioteq r7, #0 @ invalid architecture?moveq r0, #''a'' @ yes, error ''a''beq __errorbl __create_page_tables其中__create_page_tables为:__create_page_tables:pgtbl r4//r4=0800 4000 临时页表的起始地址//r5=0800 0000, ram的起始地址//r6=0020 0000, i/o寄存器空间的起始地址//r7=0000 3c08//r8=0000 0c1e//the page table in 0800 4000 is just temp base page, when init_task''s sweaper_page_dir ready,// the temp page will be useless// the high 12 bit of virtual address is base table index, so we need 4kx4 = 16k temp base page,mov r0, r4mov r3, #0add r2, r0, #0x4000 @ 16k of page table1: str r3, [r0], #4 @ Clear page tablestr r3, [r0], #4str r3, [r0], #4str r3, [r0], #4teq r0, r2bne 1b/** Create identity mapping for first MB of kernel.* This is marked cacheable and bufferable.** The ...
>> 阅读全文
|
|
blue88 |
1424 |
2007-8-17 |
|
“ 哎哟,哥们儿,还捣鼓汇编呢?那东西没用,兄弟用VB"钓"一个API就够你忙活个十天半月的,还不一定搞出来。”此君之言倒也不虚,那吾等还有无必要研他一究呢?(废话,当然有啦!要不然你写这篇文章干嘛。)别急,别急,让我把这个中原委慢慢道来:一、所有电脑语言写出的程序运行时在内存中都以机器码方式存储,机器码可以被比较准确的翻译成汇编语言,这是因为汇编语言兼容性最好,故几乎所有跟踪、调试工具(包括WIN95/98下)都是以汇编示人的,如果阁下对CRACK颇感兴趣……;二、汇编直接与硬件打交道,如果你想搞通程序在执行时在电脑中的来龙去脉,也就是搞清电脑每个组成部分究竟在干什么、究竟怎么干?一个真正的硬件发烧友,不懂这些可不行。三、如今玩DOS的多是“高手”,如能像吾一样混入(我不是高手)“高手”内部,不仅可以从“高手”朋友那儿套些黑客级“机密”,还可以自诩“高手”尽情享受强烈的虚荣感--#$%& “醒醒!” 对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃。所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,...
>> 阅读全文
|
|
blue88 |
670 |
2007-8-17 |
|
当我们想任意显示字符串,如:UNDERSTAND?,则可以使用DOS21H号中断9H号功能。输入下行程序,存盘并执行看看: 1.输入 A100 MOV DX,109 ;DS:DX = 字符串的起始地址 MOV AH,9 ;DOS的09h功能调用 INT 21 ;字符串输出 INT 20 DB ''UNDERSTAND? ;定义字符串 在汇编语言中,有两种不同的指令:1.正规指令:如 MOV 等,是属于CPU的指令,用来告诉CPU在程序执行时应做些什么,所以它会以运算码(OP-code)的方式存入内存中;2.伪指令:如DB等,是属于DEBUG等编译器的指令,用来告诉编译器在编译时应做些什么。DB(Define Byte)指令用来告诉DEBUG 将单引号内的所有ASCII 码放入内存中。使用 9H 功能的字符串必须以$结尾。用D命令可用来查看DB伪指令将那些内容放入内存。 6.输入 D100 1975:0100 BA 09 01 B4 09 CD 21 CD-20 75 6E 64 65 72 73 74 ......!. underst 1975:0110 61 6E 64 24 8B 46 F8 89-45 04 8B 46 34 00 64 19 and$.F..E..F4.d. 1975:0120 89 45 02 33 C0 5E 5F C9-C3 00 C8 04 00 00 57 56 .E.3.^_.......WV 1975:0130 6B F8 0E 81 C7 FE 53 8B-DF 8B C2 E8 32 FE 0B C0 k.....S.....2... 1975:0140 74 05 33 C0 9...
>> 阅读全文
|
|
blue88 |
72 |
2007-8-17 |
|
CBW 实际结果是:若AL中的值为正,则AH填入00h;反之,则AH填入FFh。XCHG常用于需要暂时保留某个寄存器中的内容时。 当然,还得一个子程序(CRLF)使后显示的十六进制数不会盖掉先输入的十进制数。 crlf segment assume cs:crlf mov dl,0dh ;回车的ASCII码0DH入DL mov ah,2 int 21h mov dl,0ah ;换行的ASSII码0AH入AH mov ah,2 int 21h int 20 ;回主程序 crlf ends end 现在我们就可以将BINIHEX、DECIBIN及CRLF等模块合并成一个大程序了。首先,我们要将这三个模块子程序略加改动。然后,再写一段程序来调用每一个子程序。 crlf proc near; mov dl,0dh mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h ret crlf endp类似SEGMENT与ENDS的伪指令,PROC与ENDP也是成对出现,用来识别并定义一个程序。其实,PROC 真正的作用只是告诉编译器:所调用的程序是属于近程(NEAR)或远程(FAR)。 一般的程序是由 DEBUG 直接调用的,所以用 INT 20 返回,用 CALL 指令所调用的程序则改用返回指令RET,RET会把控制权转移到栈顶所指的地址,而该地址是由调用此程序的 CALL指令所放入的。 各模块都搞定了,然后我们...
>> 阅读全文
|