汇编中文件的读写
- 格式:doc
- 大小:188.00 KB
- 文档页数:15
汇编汇编大多是指汇编语言,汇编程序。
把汇编语言翻译成机器语言的过程称为汇编。
在汇编语言中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。
这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。
于是汇编语言亦称为符号语言。
用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理的系统软件。
汇编汇编语言(Assembly Language)是面向机器的程序设计语言。
汇编语言比机器语言易于读写、易于调试和修改,同时也具有机器语言执行速度快,占内存空间少等优点,但在编写复杂程序时具有明显的局限性,汇编语言依赖于具体的机型,不能通用,也不能在不同机型之间移植。
是能完成一定任务的机器指令的集合。
常说汇编语言过时,是低级语言,并不是说汇编语言要被弃之,相反,汇编语言仍然是程序员必须了解的语言,在某些行业与领域,汇编是必不可少的,非它不可适用。
只是,现在计算机最大的领域为IT软件,也是我们常说的Windows 编程,在熟练的程序员手里,使用汇编语言编写的程序,运行效率与性能比其它语言写的程序是成倍的优秀,但是代价是需要更长的时间来优化,如果对计算机原理及编程基础不扎实,实在是得不偿失,对比现在的软件开发,已经是市场化的软件行业,加上高级语言的优秀与跨平台,一个公司不可以让一个团队使用汇编语言来编写所有的东西,花上几倍甚至几十倍的时间,不如使用其它语言来完成,只要最终结果不比汇编语言编写的差太多,就能抢先一步完成,这是市场经济下的必然结果。
但是,至今为止,还没有程序员敢断定汇编语言是不需要学的,一个不懂汇编语言的程序员,只是三流的程序员,这是大部分人的共识,同时,技术汇编语言(Assembly Language)是面向机器的程序设计语言精湛的汇编程序员,已经脱离软件开发,挤身于工业电子编程中,一个电子工程师,主要开发语言就是汇编,c语言使用只占极少部分,而电子开发工程师是千金难求,在一些工业公司,一个核心的电子工程师比其它任何职员待遇都高,对比起来,一般电子工程师待遇是程序员的十倍以上。
汇编语言入门教程2007-04—29 22:04对初学者而言,汇编的许多命令太复杂,往往学习很长时间也写不出一个漂漂亮亮的程序,以致妨碍了我们学习汇编的兴趣,不少人就此放弃.所以我个人看法学汇编,不一定要写程序,写程序确实不是汇编的强项,大家不妨玩玩DEBUG,有时CRACK出一个小软件比完成一个程序更有成就感(就像学电脑先玩游戏一样)。
某些高深的指令事实上只对有经验的汇编程序员有用,对我们而言,太过高深了。
为了使学习汇编语言有个好的开始,你必须要先排除那些华丽复杂的命令,将注意力集中在最重要的几个指令上(CMP LOOP MOV JNZ……).但是想在啰里吧嗦的教科书中完成上述目标,谈何容易,所以本人整理了这篇超浓缩(用WINZIP、WINRAR…依次压迫,嘿嘿!)教程.大言不惭的说,看通本文,你完全可以“不经意”间在前辈或是后生卖弄一下DEBUG,很有成就感的,试试看!那么――这个接下来呢?――Here we go!(阅读时看不懂不要紧,下文必有分解)因为汇编是通过CPU和内存跟硬件对话的,所以我们不得不先了解一下CPU和内存:(关于数的进制问题在此不提)CPU是可以执行电脑所有算术╱逻辑运算与基本I/O 控制功能的一块芯片.一种汇编语言只能用于特定的CPU。
也就是说,不同的CPU 其汇编语言的指令语法亦不相同。
个人电脑由1981年推出至今,其CPU发展过程为:8086→80286→80386→80486→PENTIUM →……,还有AMD、CYRIX等旁支。
后面兼容前面CPU的功能,只不过多了些指令(如多能奔腾的MMX指令集)、增大了寄存器(如386的32位EAX)、增多了寄存器(如486的FS)。
为确保汇编程序可以适用于各种机型,所以推荐使用8086汇编语言,其兼容性最佳.本文所提均为8086汇编语言。
寄存器(Register)是CPU内部的元件,所以在寄存器之间的数据传送非常快。
用途:1。
汇编语言文件的读写源代码一、概述汇编语言是一种低级语言,可以直接操作计算机的硬件资源。
在使用汇编语言编程时,文件的读写是非常常见的操作。
本文将介绍如何使用汇编语言进行文件的读写操作,并给出相应的源代码示例。
二、文件读取1. 打开文件在进行文件读取操作之前,首先需要打开待读取的文件。
以下是一个打开文件的汇编语言源代码示例:```assemblysection .datafilename db 'example.txt', 0mode db 'r', 0file dd 0section .textglobal _start_start:; 打开文件mov eax, 5mov ebx, filenamemov ecx, modeint 0x80mov [file], eax; ...```在上述示例中,首先定义了一个变量 `filename` 用于存储待读取文件的文件名,变量 `mode` 用于指定打开文件的模式。
然后使用系统调用 `int 0x80` 进行文件打开操作,并将返回的文件描述符保存在变量`file` 中。
2. 读取文件内容文件打开之后,就可以开始读取文件的内容了。
以下是一个读取文件内容的汇编语言源代码示例:```assemblysection .bssbuffer resb 1024section .text; ...; 读取文件内容mov eax, 3mov ebx, [file]mov ecx, buffermov edx, 1024int 0x80; ...```在上述示例中,定义了一个缓冲区变量 `buffer` 来存储读取的文件内容,并使用系统调用 `int 0x80` 进行文件读取操作。
读取的文件内容将被存储到缓冲区变量 `buffer` 中。
三、文件写入1. 创建文件在进行文件写入操作之前,有时需要先创建一个新的文件。
以下是一个创建文件的汇编语言源代码示例:```assemblysection .datafilename db 'output.txt', 0mode db 'w', 0file dd 0section .textglobal _start_start:; 创建文件mov eax, 8mov ebx, filenamemov ecx, modemov edx, 0777int 0x80mov [file], eax; ...```在上述示例中,首先定义了一个变量 `filename` 用于存储待创建文件的文件名,变量 `mode` 用于指定创建文件的模式。
在8086汇编语言中ax, bx, cx, dx四个寄存器的常见用途1. 引言1.1 概述在8086汇编语言中,AX、BX、CX和DX是四个常见的寄存器。
这些寄存器具有不同的功能和用途,可以提供对数据的临时存储和处理。
它们在程序设计中扮演着重要的角色,并且对于编写高效且功能完善的汇编代码至关重要。
1.2 文章结构本文将详细讨论AX、BX、CX和DX四个寄存器的常见用途。
首先,我们将探讨AX寄存器及其在累加、函数返回值传递以及数据处理和运算中的作用。
然后,我们将研究BX寄存器,在基址寄存器、指针地址存储以及字符串操作方面的应用。
接下来,我们将介绍CX寄存器在计数与循环控制、位移与移位操作以及I/O 端口控制方面的功能。
最后,我们将讲解DX寄存器在数据传输、中断向量以及I/O端口地址存储方面所起到的重要作用。
1.3 目的通过深入理解AX、BX、CX和DX四个常用寄存器以及它们各自的应用领域,读者将能够更好地理解如何在8086汇编语言中使用这些寄存器,并且能够优化自己的编程技巧。
此外,对于那些希望进一步学习汇编语言的人来说,本文还可作为入门指南,提供了有关寄存器功能和用途的基本知识。
2. AX寄存器的常见用途:2.1 累加器:AX寄存器是8086汇编语言中最常用的累加器。
作为一个通用寄存器,它被广泛用于执行不同类型的运算,例如加法、减法、乘法和除法操作。
在进行加法或减法运算时,我们可以将待操作的数值加载到AX寄存器,并且可以通过执行ADD或SUB指令来实现加法或减法操作。
以乘法为例,其中一个乘数会被放入AX寄存器中,并通过执行MUL(无符号)或IMUL(有符号)指令与另一个操作数进行相乘。
2.2 存储函数返回值:在很多情况下,子程序会将其返回值保存在AX寄存器中。
当调用某个函数或子程序时,该函数或子程序可能会要求将结果返回给调用者。
这时候,函数会将结果保存在AX寄存器中,并通过RETN指令将控制权交还给调用者,从而返回函数的执行结果。
汇怎么读汇编语言实验报告(七)班级:01540802班姓名:南征学号: 20080705信息与电子学院实验七文件的读写一、实验目的二、实验要点磁盘文件的读写有两种方法,一种称为文件控制块;另一种方法称为文件标记,前者在读写文件时首先要设定文件控制块,知名文件所在的当前磁盘的驱动器、文件名,同时还要制定所读写的文件所处的当前块号、当前记录号、记录长度等参量,此外还需要设置磁盘传输区。
在读磁盘数据文件时,应先将磁盘上有关数据读入磁盘传输区,然后再传送至目的的内存区。
在写磁盘数据文件时,要写入磁盘文件的数据也必须先送入磁盘传输区,然后再执行写操作。
此种方法的缺点是不支持树形目录结构。
目前常用的方法是利用文件标记读写文件,无论用什么方法读写文件,都要解决以下几个问题:A) 用户程序要告诉操作系统将要存取那个文件。
B) 无论是从磁盘独处的数据,还是要写入磁盘的数据都必须存放在一个制定的内存缓冲区中,这个内存缓冲区叫数据传输区(DTA)。
C) 在读一个磁盘文件之前,要先打开文件,然后才能将文件内容读入内存。
而在读写一个文件之前,要先建立一个新文件名,再将内存中的内容写入磁盘。
D) 在存取文件之后,特别是在写入文件之后,务必将此文件关闭。
利用文件标记读写文件的主要特点是:通过建立文件、打开文件,将磁盘路径名、文件名转换为文件标记或件号,在以后读写文件的操作中均要与文件标记打交道。
在一个系统中,可同时打开多个文件,并配置相应的文件标记。
在利用文件标记读写磁盘文件是要掌握以下几个要点:1) 使用建立文件、打开文件系统功能之前,都必须将DS:DX指向驱动器名、路径名、文件名和以数值零为结尾的ASCIIZ字符串的首地址。
2) 对于一个新文件要用3CH系统功能调用,建立文件。
(如果不是新文件,此步骤可略)3) 已存在的文件则利用3DH系统功能调用,打开此文件。
4) 如果文件建立、打开成功,则CF=0,并且在AX寄存器中返回文件标记。
第六章磁盘文件存取实验(设计性实验一、实验要求和目的1. 理解文件、目录的概念;2. 了解 FCB(文件控制块方式文件管理方法;3. 掌握文件代号式文件存取方式;4. 学习使用文件指针读取文件二、软硬件环境1. 硬件环境:计算机系统 windows;2. 软件环境:装有 MASM、DEBUG、LINK、等应用程序。
三、实验涉及的主要知识单元DOS 功能调用中断(INT 21H提供了两类磁盘文件管理功能,一类是 FCB(文件控制块方式,另一类是文件代号式存取方式。
对于文件的管理,实际上是对文件的读写管理, DOS 设计了四种存取文件方式:顺序存取方式、随机存取方式、随机分块存取方式和代号法存取方式。
文件的处理步骤A 写之前必须先建立文件、读之前必须先打开文件。
B 写文件之后一定要关闭文件。
通过关闭文件,使操作系统确认此文件放在磁盘哪一部分,写后不关闭会导致写入文件不完整。
1、文件代号式存取方式: 当用户需要打开或建立一个文件时,必须提供文件标识符。
文件标识符用ASCII Z 字符串表示。
ASCII Z 字符串是指文件标识符的 ASCII 字符串后面再加1 个“0”字符。
文件标识符的字符串包括驱动器名、路径名和文件名。
其格式为[d:][path]filename[.exe]其中 d 为驱动器名,path 为路径名,.exe 为文件名后缀。
中断 21H 提供了许多有关目录和文件操作的功能,其中文件代号式存取方式常用的功能如下:2、操作目录的常用功能39H——创建目录 3BH——设置当前目录3AH——删除目录 47H——读取当前目录有关中断功能的详细描述和调用参数在此从略,需要查阅者可参阅相关资料之目录控制功能。
3、用文件句柄操作文件的常用功能3CH——创建文件 4EH——查找到第一个文件3DH——打开文件 4FH——查找下一个文件3EH——关闭文件 56H——文件换名3FH——读文件或设备 57H——读取/设置文件的日期和时间40H——写文件或设备 5AH——创建临时文件41H——删除文件 5BH——创建新文件42H——设置文件指针 67H——设置文件句柄数(最多文件数43H——读取/设置文件属性 6CH——扩展的打开文件功能有关中断功能的详细描述和调用参数在此从略,需要查阅者可参阅相关资料之文件操作功能。
【文件操作类的api函数主要是包含】:文件的创建; createfile | 文件的读写;writefile |获取文件大小;getfilesize | 取文件属性;GetFileAttributesA|设置文件属性;setfileattribute|复制文件 copyfile|移动文件movefile | 关闭文件句柄;closehandle1、sleep 延迟函数004A2015 68 E8030000 push 0x3E8 1000毫秒==1秒004A201A E8 41C2F6FF call <jmp.&kernel32.Sleep>004A1E48 > 68 E8030000 push 3E8004A1E4D FF15 70834A00 call dword ptrds:[<&kernel32.Sleep>] ; kernel32.Sleeppush xxxxcall [xxxxxxxx] 模板CTRL+N查找函数参考-------------------------------------------2、ExitProcess 中止一个进程004A20E0 6A 00 push 0x0 (终止本进程)004A20E2 E8 4D4DF6FF call <jmp.&kernel32.ExitProcess>004A1E48 > 6A 00 push 0004A1E4A FF15 E0844A00 call dword ptrds:[<&kernel32.ExitProc>; kernel32.ExitProcess-------------------------------------------3、WinExec 调用运行另一个程序的函数push 0push 路径call [xxxxxxxx]004A2078 50 push eax004A2079 E8 EE50F6FF call <jmp.&kernel32.WinExec>004A1E48 > 6A 01 push 0x1 //显示运行004A1E4A 68 721E4A00 push004A1E72 ; ASCII "c:\d.exe"004A1E4F FF15 48834A00 call dword ptr[<&kernel32.WinExec>] ; kernel32.WinExec----------------------------------------------4、GetLocalTime 获取本地时间的函数0040ADF3 50 PUSH EAX0040ADF4 E8 3BC1FFFF CALL <JMP.&kernel32.GetLocalTime> DB 07 2011年月周日时分秒004A1E49 8D85 70FEFFFF lea eax, dword ptr [ebp-0x190]004A1E4F 50 push eax //这个里面004A1E50 FF15 60844A00 call dword ptr[<&kernel32.GetLocalTime>] ;00473AD5 8D45 EC lea eax, dword ptr [ebp-0x14] 00473AD8 50 push eax00473AD9 E8 A634F9FF call <jmp.&kernel32.GetSystemTime> --------------------------------------------------------------5、GetSystemDirectoryA 获取系统目录的函数call <jmp.&kernel32.GetWindowsDirectoryA>0049FD5E 68 FF000000 push 0xFF 大小0049FD63 8D85 00FFFFFF lea eax, dword ptr [ebp-0x100] 0049FD69 50 push eax0049FD6A E8 6D72F6FF call<jmp.&kernel32.GetWindowsDirectoryA>00401006 6A 20 push 0x20 bufer size00401008 68 00234000 push 00402300 bufer address 0040100D FF15 04314000 call GetSystemDirectoryA004A1E48 > 68 00010000 push 0x100004A1E4D 8D85 00FFFFFF lea eax, dword ptr [ebp-0x100]004A1E53 50 push eax004A1E54 FF15 23204C00 call dword ptr[<&kernel32.GetSystemDirectoryA>] ;xp c:\windows\system322000--------------------------------------------------------------6、GetTickCount 从你开机----现在所经历的毫秒数 1000 ==1秒GetTickCount 无参数有返回值获取系统启动时间的函数返回数据存放在eax寄存器中;005C7A02005DCED4005E06DC获取到这个数据,然后将他写入到程序里面。
实验指导一.上机实验的一般步骤和要求:1.上机前对选定的实验题应有所了解,并写好程序。
2.上机过程中对重要方法和步骤、问题和结果应有记录。
3.所有程序原则上都要通过调试手段运行。
4.实验后进行分析和总结,给出实验报告。
二.实验报告的内容一般有:1.实验题的内容及要求。
2.思路和方法、算法描述及有注释和说明的程序清单。
3.程序调试和运行的重要步骤、问题和结果。
4.分析和总结。
三.实验环境的建立参看第二章第一节。
通常在WINDOWS XP系统下。
如果其他操作系统(如WIN 7),不支持汇编程序工作,可安装Masm for Windows集成实验环境asm20125(支持Win2000、WinXP、WinVISTA、WIN7等操作系统)。
/实验1 上机过程及程序调试实验目的:1.通过第二章两个简单实例认识汇编语言程序,初步了解程序格式;段定义;标号;DOS系统功能;操作数;指令;说明语句等作用。
2.掌握汇编语言程序从设计到形成可执行程序文件的方法和步骤。
即编辑、汇编、连接。
了解汇编语言的系统工作文件和工作环境。
理解汇编程序和连接程序的作用。
理解列表文件内容。
3.初步了解程序的运行和调试方法。
学会使用DEBUG主要命令和常用的DOS命令。
实验内容:【1】编辑第二章两个简单实例,通过汇编、连接。
【2】用DEBUG对hello程序进行调试。
问题:(1) 该程序在内存中的起始地址是多少?结束地址是多少?共占几个字节?(2) 0B63:0008表示什么意思?(3) 程序中定义的串‘HELLO, WORLD !$’在内存中的起始地址是多少?请用DEBUG命令显示该串。
(4) 如果用带有断点的G命令运行该程序,写出命令。
(5) 用P命令单步执行程序。
(6) 用T命令跟踪程序,在跟踪执行INT 21时出现什么问题?(7) 用A命令在偏移地址100H处建立该段程序,并运行。
(8) 用W命令把该段程序写成文件,再调入。
实验2 算术及位串处理程序实验目的:掌握多数位的算术运算、移位操作、字符串操作等程序的设计,学习使用分支与循环等基本编程方法,熟练使用DEBUG。
“汉语教材编写”文件汇编目录一、近20年对外汉语教材编写和研究的基本情况述评二、韩国初级汉语教材编写的调查与分析三、论汉语教材编写的教学实用性四、商务汉语教材编写中存在的问题与对策五、《中文听说读写》的优缺点及其对国内汉语教材编写的启示六、区域化对外汉语教材编写之我见以《泰国人学汉语》为例近20年对外汉语教材编写和研究的基本情况述评本文旨在探讨近20年对外汉语教材编写和研究的基本情况。
我们将简要概述对外汉语教材编写和研究的历史背景和现状;接着,分析近20年对外汉语教材编写和研究的特点;随后,我们将展示近20年对外汉语教材编写和研究的重要成果;探讨存在的问题并展望未来发展方向。
随着中国综合国力的不断提升,汉语在国际上的地位也逐渐提高。
对外汉语教材编写和研究的重要性日益凸显,它不仅关系到汉语国际推广的效果,还关乎中华文化的传播。
本文将对近20年对外汉语教材编写和研究进行全面评述。
在过去的几十年里,对外汉语教材编写和研究经历了从无到有、由小到大逐步发展的过程。
海内外学者和机构积极参与对外汉语教材的编写和研究,为对外汉语教育事业做出了巨大贡献。
然而,教材的种类和数量虽然丰富,但质量参差不齐,仍需深入研究和改进。
近20年对外汉语教材编写和研究呈现出以下特点:编写理念发生了变化,从单纯的语言教学转变为语言与文化并重;教材结构愈发多样化,既有课本、又有辅助读物和网络资源;再者,内容覆盖范围不断扩大,涉及到中国历史、文化、社会、科技等多个领域;课程设置更加灵活多样,满足不同国家、不同层次学习者的需求。
近20年对外汉语教材编写和研究取得了丰硕的成果。
例如,《汉语拼音识字教材》等一系列针对不同国家和地区、不同年龄层次的教材极大地满足了海外汉语学习者的需求。
《中华人民共和国国家通用语言文字法》的颁布实施,为推广普通话和规范汉字提供了法律依据。
尽管近20年对外汉语教材编写和研究取得了显著进展,但仍存在一些问题。
部分教材内容过于单一,偏重语言知识传授而忽略文化元素的融入;教学方式相对传统,缺乏创新和实践性;再者,教材编写者与使用者之间的沟通不够畅通,导致部分教材难以满足学习者需求。
汇编 u盘扇区读写以汇编U盘扇区读写为标题U盘是一种常用的存储设备,它通常被用来存储和传输数据。
在U 盘中,数据是存储在扇区中的。
扇区是U盘存储空间的最小单位,每个扇区通常有512字节大小。
在进行U盘数据读写操作时,我们可以使用汇编语言来实现对U盘扇区的读写。
汇编语言是一种低级语言,它与计算机硬件密切相关。
使用汇编语言可以直接操作计算机的内存和寄存器,因此在对U盘进行读写操作时,汇编语言是一种非常有效的工具。
在进行U盘扇区读写之前,首先需要了解U盘的存储结构。
U盘通常由一个或多个分区组成,每个分区包含一个分区表和若干个扇区。
分区表记录了每个分区的起始扇区和大小等信息。
通过读取分区表可以确定要操作的扇区的位置。
在进行U盘扇区读写时,需要使用BIOS中的INT 13h中断来进行扇区读写操作。
在使用INT 13h中断之前,需要将读写操作的参数设置好并存入寄存器中。
参数包括扇区号、磁头号、柱面号等信息。
然后通过调用INT 13h中断来进行扇区读写操作。
当需要读取U盘扇区中的数据时,首先需要将扇区号、磁头号、柱面号等参数存入寄存器中。
然后通过调用INT 13h中断的02h功能来进行扇区读取操作。
读取的数据将存放在指定的内存缓冲区中。
读取操作完成后,可以通过检查返回的标志位来判断读取是否成功。
当需要向U盘扇区中写入数据时,同样需要将扇区号、磁头号、柱面号等参数存入寄存器中。
然后通过调用INT 13h中断的03h功能来进行扇区写入操作。
需要注意的是,写入的数据必须按照扇区大小进行对齐,否则可能会导致数据错误。
在进行U盘扇区读写操作时,还需要注意一些细节。
比如,U盘的分区表通常存储在第一个扇区中,因此在读取分区表之前,需要将读取参数中的扇区号设置为1。
另外,U盘的读写操作需要在实模式下进行,因此需要在进入保护模式之前进行相关操作。
总结起来,使用汇编语言进行U盘扇区读写操作是一种高效而且灵活的方法。
通过了解U盘的存储结构和使用INT 13h中断,我们可以实现对U盘扇区的读取和写入操作。
汇编语言中的rcx指令【汇编语言中的rcx指令】一、引言在计算机科学领域中,汇编语言是一种底层程序设计语言,用于将人类可读的代码转换成机器语言指令,以交给计算机执行。
即使在当今高级编程语言盛行的时代,了解汇编语言仍然对于理解计算机内部工作原理和进行系统级别的优化非常重要。
本文将围绕着汇编语言中的RCX指令展开深入讨论,从基础概念到实际应用一步一步详细解析。
二、什么是RCX指令?RCX指令是汇编语言中的一个寄存器指令。
在x86架构的汇编语言中,RCX是一个64位通用寄存器,也被称为R1。
该寄存器可以被用于存储任意的64位数据,同时作为某些指令的操作数。
三、寄存器和指令的基本概念1. 汇编语言寄存器在汇编语言中,寄存器是一种能够快速存取数据的高速存储器件。
它们直接嵌入在CPU中,并且可以被保存和读取。
典型的x86架构中有多个寄存器,如AX、BX、CX等。
这些寄存器可以存储不同大小的数据,作为指令的操作数或存储临时结果。
2. 汇编语言指令汇编语言指令是用于操作计算机硬件的基本命令。
在不同的架构中,指令集是不同的,但基本的指令类型包括数据传输指令、数据处理指令、控制指令等。
通过将指令组合起来,我们可以实现复杂的计算和操作。
四、RCX寄存器的使用1. 存储数据RCX寄存器是一个通用寄存器,可用于存储不同的数据。
例如,我们可以使用MOV指令将一个64位的常数加载到RCX寄存器中,如下所示:MOV RCX, 1234567890123456 ; 将常数1234567890123456存储到RCX寄存器中该指令将RCX寄存器的值设置为1234567890123456。
2. 作为操作数RCX寄存器可以作为某些指令的操作数,例如加法、乘法等。
以下是使用RCX 寄存器进行加法运算的示例:MOV RCX, 10 ; 将常数10存储到RCX寄存器中ADD RAX, RCX ; 将RAX寄存器和RCX寄存器中的值相加,并将结果存储到RAX寄存器中在此示例中,RCX寄存器中的值10被加到RAX寄存器中,并将结果存储回RAX 寄存器。
汇编修改文件操作想一想,如果你要写一个加密程序,或者病毒程序,都需要对文件进行修改(写操作)。
在dos下,系统提供有相应的功能调用来完成这样的操作,如:“打开文件\移动指针\读文件\写文件\关闭文件”,在windows下,系统也提供有相应的Api函数。
如“CreateFile\SetFilePointer\ReadFile\WriteFile\SetEndOfFile\CloseHandle”等,利用这些编程和dos下没什么两样,这里就不再多说啦!咱们今天要用的是利用“内存映射文件”来操作。
简单的说就是把文件内容映射到一个内存块,改变这块内存的内容就是改变文件的内容,系统可提供的这块内存巨大、平坦,操作起来真是方便!这种方法要用到“CreateFile/CreatFileMapping/MapViewOfFile/UnmapViewOfFile/CloseHandle”,具体使用参考“Win32 Developer's References”。
俺也是刚看,不敢乱说,嘿嘿嘿。
--------------------------------------------------------------;例:打开一个已存在的文件并修改,建议文件具有一定的大小,比如80H字节。
;文件名:12.asm.386.Model Flat, StdCallOption Casemap :None;---------------------------------------------------------Include windows.incInclude kernel32.incIncludeLib kernel32.libModifyFile PROTO :LPSTR.dataMyFile db 'd:\masm7\MyTest',0 ;文件MyTest必须存在,若不存在,程序将什么也不做M1 db 'Good morning',0 ;将写到文件中的字符串M2 db 'Good afternoon',0M3 db 'Good evening',0;---------------------------------------------------------.data?hFile dd ?hMap dd ?pMapAddr dd ?;---------------------------------------------------------.codeSTART:invoke CreateFile, \ ;打开文件,该函数具有多种功能ADDR MyFile,\ ;指向要打开的文件名字符串GENERIC_READ or GENERIC_WRITE ,\ ;打开的文件具有读写的权限FILE_SHARE_READ or FILE_SHARE_WRITE,\ ;别人也可读写此文件NULL, \ ;95下不用OPEN_EXISTING, \ ;要打开的文件必须存在FILE_ATTRIBUTE_NORMAL,\ ;文件的属性NULL ;95下必须是NULL.if eax!=INV ALID_HANDLE_V ALUE ;判断文件是否已正常打开mov hFile, eax ;保存文件句柄invoke CreateFileMapping, \ ;creates file-mapping object for the specified file.hFile, \ ;Identifies the file from which to create a mapping objectNULL, \ ;ignoredPAGE_READWRITE, \ ;access0, \ ;high-order 32 bits of the maximum size0, \ ;low-order 32 bits of the maximum sizeNULL ;the mapping object is created without a name.if eax!=NULL ;mov hMap,eax ;the return value is a handle to the file-mapping objectinvoke MapViewOfFile,hMap,FILE_MAP_WRITE,0,0,NULL ;映射文件到内存 .if eax!=NULLmov pMapAddr,eax ;保存返回的内存块首地址invoke ModifyFile,pMapAddr ;修改内存块内容invoke UnmapViewOfFile,pMapAddr ;解除文件映射.endifinvoke CloseHandle,hMap ;关闭内存映射文件.endifinvoke CloseHandle, hFile ;关闭文件.endifinvoke ExitProcess,0 ;结束程序;修改内存块的内容,就相当于修改文件的内容ModifyFileproc uses ebx esi edi,lpBufferAddress:LPSTRmov edi,lpBufferAddress ;取内存块地址invoke lstrcpy,edi,addr M1 ;修改内存块内容add edi,40h ;调整地址(随意)invoke lstrcpy,edi,addr M2 ;修改add edi,240hinvoke lstrcpy,edi,addr M3retModifyFileendpEND START----------------------------------------------------------------------注意:0、程序运行后无任何提示,只可从被修改的文件上看变化1、第39、40行的值都是0,这样,内存映射文件的大小就正好取文件的实际大小2、可以看到,第62、63行的修改并没起作用,因为文件没有这样大。
汇编语言实验报告(七)班级:01540802班姓名:南征学号: 20080705信息与电子学院实验七文件的读写一、实验目的理解文件标记的概念,掌握利用文件标记读写文件的方法,学习使用文件指针读取文件。
二、实验要点磁盘文件的读写有两种方法,一种称为文件控制块;另一种方法称为文件标记,前者在读写文件时首先要设定文件控制块,知名文件所在的当前磁盘的驱动器、文件名,同时还要制定所读写的文件所处的当前块号、当前记录号、记录长度等参量,此外还需要设置磁盘传输区。
在读磁盘数据文件时,应先将磁盘上有关数据读入磁盘传输区,然后再传送至目的的内存区。
在写磁盘数据文件时,要写入磁盘文件的数据也必须先送入磁盘传输区,然后再执行写操作。
此种方法的缺点是不支持树形目录结构。
目前常用的方法是利用文件标记读写文件,无论用什么方法读写文件,都要解决以下几个问题:A)用户程序要告诉操作系统将要存取那个文件。
B)无论是从磁盘独处的数据,还是要写入磁盘的数据都必须存放在一个制定的内存缓冲区中,这个内存缓冲区叫数据传输区(DTA)。
C)在读一个磁盘文件之前,要先打开文件,然后才能将文件内容读入内存。
而在读写一个文件之前,要先建立一个新文件名,再将内存中的内容写入磁盘。
D)在存取文件之后,特别是在写入文件之后,务必将此文件关闭。
利用文件标记读写文件的主要特点是:通过建立文件、打开文件,将磁盘路径名、文件名转换为文件标记或件号,在以后读写文件的操作中均要与文件标记打交道。
在一个系统中,可同时打开多个文件,并配置相应的文件标记。
在利用文件标记读写磁盘文件是要掌握以下几个要点:1)使用建立文件、打开文件系统功能之前,都必须将DS:DX指向驱动器名、路径名、文件名和以数值零为结尾的ASCIIZ字符串的首地址。
2)对于一个新文件要用3CH系统功能调用,建立文件。
(如果不是新文件,此步骤可略)3)已存在的文件则利用3DH系统功能调用,打开此文件。
4)如果文件建立、打开成功,则CF=0,并且在AX寄存器中返回文件标记。
5)在建立、打开文件成功之后,即可对文件进行读、写操作。
如果要对文件进行读操作,则在打开文件之后,用3FH系统功能调用将文件读入数据缓冲区,调用前的入口参数是:文件标记存入BX,读入文件的字节数放入CX,数据缓冲区的起始地址存入DS:DX。
调用完毕,AX返回实际读入的字节数。
6)读入数据缓冲区的文件,可利用40H系统功能调用将文件写入指定的磁盘。
调用入口参数是:文件标记存入BX,要写入的字节数放入CX,DS:DX指向要写入数据缓冲区的首地址。
调用结束后AX返回实际写入的字节数。
如果AX<CX,则表示磁盘空间已满,但系统不提示错误信息。
7)在读、写文件完成后,要用3EH系统功能调用关闭,释放原占有的文件号,并将缓冲区的数据最终写入磁盘。
特别是对于写磁盘文件操作,在写入之后,必须要关闭文件,否则该数据文件将会丢失。
此外,特别要注意的是,在一个系统中不能同时建立两个以上的新文件。
8)在文件建立或打开后,文件指针的初始位置是指向文件首偏移为‘0’处,如果不想从文件首开始读、写文件,则可用系统功能调用42H移动文件指针的方法实现。
调用前,将文件标记存入BX,所需移动偏移量的字节数(CX为高位部分)存放于CX:DX;调用后在DX:AX中返回读写指针移动后的位置。
移动的方式有三种:AL=0 指针从文件头移动到由CX:DX所指定的偏移量处;AL=1 指针从当前位置移动到由CX:DX所指定的偏移量处;AL=2 指针从文件尾移动到由CX:DX所指定的偏移量处;本实验通过第1题,使同学掌握利用文件标记的方法,读写一个文件;第2题在掌握文件标记的使用之后,理解利用文件标记及文件指针将两个文件合并成一个文件的过程及技术要领。
第3题进一步理解文件指针的三种移动方式的使用方法。
三、实验任务及步骤1.用文件标记读写文件编程实现,首先从键盘输入包括驱动器名、路径名、文件名及0的ASCIIZ字符串(即为指定路径下的一个文件),然后把这个文件打开并读入到内存数据缓冲区50000H(对应的逻辑地址为5000:0000)处,再换个文件名重新写入磁盘。
代码如下:DATA SEGMENTFILE1 DB 40DB ?DB 40 DUP(0)FILE2 DB 40DB ?DB 40 DUP(0)MSG1 DB 'INPUT SOURCE FILE:$'MSG2 DB 'INPUT NEW NAME:$'ENTER DB 0DH,0AH,'$'BUF DB 100 DUP(0)STACK SEGMENTDB 100 DUP(?)STACK ENDSDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACKMAIN PROC FARMOV AX,DATAMOV DS,AXLEA DX,MSG1 MOV AH,09HINT 21HLEA DX,FILE1 MOV AH,0AHINT 21HLEA SI,FILE1MOV AL,[SI+1] CBWINC SIINC SIADD SI,AXMOV BYTE PTR[SI],0LEA DX,ENTER MOV AH,9INT 21HLEA DX,FILE1+2 MOV AH,3DH MOV AL,0INT 21HMOV BX,AXMOV AH,3FH PUSH DSPUSH ESMOV CX,5000H MOV DS,CXMOV DX,0000HMOV CX,50INT 21HPOP DSPOP ESMOV AH,3EHINT 21HLEA DX,MSG2INT 21HLEA DX,FILE2MOV AH,0AHINT 21HLEA SI,FILE2MOV AL,[SI+1]CBWINC SIINC SIADD SI,AXMOV BYTE PTR[SI],0MOV AH,3CHMOV CX,00HLEA DX,FILE2+2INT 21HMOV BX,AXMOV AH,40HPUSH DSPUSH ESMOV CX,5000HMOV DS,CXMOV DX,0000HMOV CX,14INT 21HPOP DSPOP ESMOV AH,3EHINT 21HMOV AH,4CHINT 21HMAIN ENDPCODE ENDSEND MAIN运行结果如下:2.利用文件标记,从磁盘内读入两个文件到内存缓冲区,然后把这两个文件合并为一个文件存入磁盘。
试编写源程序。
代码如下:DATA SEGMENTFILE1 DB 'C:\72A.TXT',00HFILE2 DB 'C: \72B.TXT',00HFILE3 DB 'C:\72C.TXT',00HSAVE DW 0NUM DW 0SAVENEW DW 0BUF DB 100 DUP(0)DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATAMAIN PROC FARMOV AX,DATAMOV DS,AXMOV ES,AXMOV AH,3DHMOV AL,0LEA DX,FILE1INT 21HMOV SAVE,AXMOV AH,3FH MOV BX,SAVE LEA DX,BUFMOV CX,255INT 21HMOV NUM,AXMOV AH,3EH MOV BX,SAVE INT 21HMOV AH,3CH MOV CX,00H LEA DX,FILE3INT 21HMOV SAVENEW,AXMOV AH,40H MOV BX,SAVENEW MOV CX,NUM LEA DX,BUFINT 21HMOV AH,3DH MOV AL,0LEA DX,FILE2INT 21HMOV SAVE,AXMOV AH,3FH MOV BX,SAVE LEA DX,BUFMOV CX,255INT 21HMOV NUM,AXMOV AH,3EH MOV BX,SAVE INT 21HMOV AH,40H MOV BX,SAVENEW MOV CX,NUMLEA DX,BUFINT 21HMOV AH,3EHMOV BX,SAVENEWINT 21HMOV AH,4CHINT 21HMAIN ENDPCODE ENDSEND MAIN运行结果如下:(运行前)(运行后)3.利用文件指针读取一个源文件,要求从文件尾处开始读取100H个字节到缓冲区,然后换个文件名存入磁盘。
试编写源程序。
代码如下:DATA SEGMENTFILE1 DB 'C:\73.TXT',00HFILE2 DB 50DB ?DB 50 DUP(0)SAVE DW 0BUF DB 256 DUP(0)STR DB 'INPUT NEW NAME:$'DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATAMAIN PROC FARMOV AX,DATAMOV DS,AXMOV ES,AXLEA DX,STRMOV AH,09HINT 21HMOV AH,3DHMOV AL,0LEA DX,FILE1INT 21HMOV SAVE,AXMOV BX,SAVEMOV AH,42HMOV CX,0MOV DX,0MOV AL,02INT 21HSUB AX,100HMOV DX,AXMOV AH,42HMOV CX,0MOV AL,0INT 21HMOV AH,3FHMOV BX,SAVELEA DX,BUFMOV CX,256INT 21HMOV AH,3EHMOV BX,SAVEINT 21HLEA SI,BUFADD SI,255MOV DI,SILEA SI,BUFMOV CX,128 AGAIN:MOV BL,[SI]XCHG BL,[DI]MOV [SI],BLINC SIDEC DILOOP AGAINLEA DX,FILE2MOV AH,0AHINT 21HLEA SI,FILE2MOV AL,[SI+1]CBWINC SIINC SIADD SI,AXMOV BYTE PTR[SI],0MOV AH,3CHMOV CX,00HLEA DX,FILE2+2INT 21HMOV BX,SAVEMOV BX,SAVEMOV AH,40HMOV CX,256LEA DX,BUFINT 21HMOV AH,3EHMOV BX,SAVEINT 21HMOV AH,4CHINT 21HMAIN ENDPCODE ENDSEND MAIN运行结果如下:4.编程实现,一边从键盘上接收字符,一边将其写入指定的文件,限定字符个数为50个。