IBMPC汇编程序设计第3章_第1页
IBMPC汇编程序设计第3章_第2页
IBMPC汇编程序设计第3章_第3页
IBMPC汇编程序设计第3章_第4页
IBMPC汇编程序设计第3章_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

IBM-PC汇编程序设计第3章I/O程序设计Contents本章目录接口技术核心模块与程序设计方法概览01基本概念与指令系统回顾02发声系统程序设计03显示器I/O程序设计04键盘输入程序设计05中断程序设计CHAPTER01基本概念与指令系统回顾理解汇编语言的底层本质与Intel80x86指令体系AssemblyFundamentals机器语言与汇编语言的关系汇编语言是机器语言的符号化表示,与特定CPU架构紧密绑定。理解这一底层本质是进行I/O端口编程的前提。01·Binary二进制指令流机器语言是CPU直接执行的二进制指令流,如ADDAX,02H对应机器码05H02H00H,人类难以直接阅读和编写。02·Mnemonic助记符替代操作码汇编语言用助记符(如ADD、SUB、MOV)替代二进制操作码,需经汇编器翻译为机器码后方可由CPU执行。03·Architecture与CPU架构强绑定Intel80x86汇编程序无法在Z80CPU上运行,而C等高级语言具有跨平台特性。04·I/O端口操作的精确时序I/O编程依赖汇编语言,端口操作指令(IN/OUT)直接对应硬件电气信号,需要精确的时序控制。REGISTERARCHITECTUREIntel80x86寄存器体系80x86的寄存器体系是汇编编程的操作核心。I/O操作强制要求通过AL/AX寄存器进行数据传输,理解寄存器结构是掌握端口编程的第一步。01—通用数据寄存器AX累加器I/O操作的必经通道,IN/OUT指令只支持AL(8位)或AX(16位)作为数据载体IN/OUTBX基址寄存器常用于内存间接寻址的基址指针,也可作为通用数据暂存间接寻址CX计数寄存器LOOP指令的隐含计数器,在循环I/O操作中扮演关键角色LOOPDX数据寄存器I/O指令中存放端口地址,端口号>255时必须使用DX间接寻址端口地址02—段寄存器与指针段寄存器CS/DS/SS/ES四个段寄存器分别指向代码段、数据段、堆栈段和附加段,构成8086的分段内存模型CS·DS·SS·ES指针与变址SP/BP为堆栈指针,SI/DI为变址寄存器,在字符串I/O操作(如LODSB/STOSB)中作为隐含操作数SP·BP·SI·DI8086ArchitectureI/O端口编址与访问方式8086采用独立I/O编址,65536个端口地址通过IN/OUT指令访问。端口地址≤255可直接寻址,>255需通过DX间接寻址,这是所有I/O程序设计的底层规则。独立编址空间I/O端口地址空间0000H~FFFFH,共64K个端口,与内存地址空间完全分离。这种设计使得I/O操作与内存访问互不干扰,便于硬件扩展。0000H–FFFFHIN指令·读取从端口读数据到AL(8位)或AX(16位),如INAL,61H读取端口61H。用于获取外设状态或输入数据,是程序查询方式的核心指令。AL/AXOUT指令·写入将AL/AX内容写入端口,如OUT42H,AL将AL值写入端口42H。用于向外设发送控制命令或输出数据,实现对外部设备的精确控制。AL/AX寻址方式分界端口号0~255可直接写在指令中(直接寻址);超过255必须先将端口号装入DX,再用INAL,DX访问(间接寻址)。这种设计兼顾了指令长度与寻址灵活性,短指令用于常用端口,DX扩展支持全地址空间。255·DXINDIRECTIBM-PC关键端口42H/43H定时器、61H扬声器、60H键盘数据端口。这些端口是系统底层编程的基础,直接控制硬件设备的工作状态与数据传输。42H·61H·60HASSEMBLY·I/OBIOS中断与DOS功能调用BIOS中断(INT10H/16H等)提供底层硬件服务,DOS中断(INT21H)提供操作系统级服务。两者通过AH功能号选择具体服务,是汇编I/O编程中最常用的两类接口。BIOS中断直接调用ROM中的硬件驱动,覆盖显示、键盘、打印、磁盘四类核心设备服务INT10H·16H·17H·13H调用方式AH←功能号→设置入口参数→INTn,三步完成中断调用AH=09H→INT21HDOS中断INT21H提供更高层OS服务,涵盖字符输入输出与程序控制01H·02H·09H·4CH对比取舍BIOS速度快但依赖硬件,DOS兼容性好但稍慢,实际编程中混合使用速度vs兼容性CHAPTER02发声系统程序设计通过8253定时器与8255接口芯片控制PC扬声器发声HARDWAREPRINCIPLEPC发声系统硬件原理PC扬声器通过8253定时器通道2产生方波、8255端口61H控制门控和连接,三者协同实现发声。频率由定时器计数初值决定:计数值=1193180÷目标频率(Hz)。01定时器通道2发声8253定时器通道2专用于发声,向其端口42H写入计数初值,以1.19318MHz为基准分频产生方波信号1.19318MHz02端口61H门控8255端口61H的PB0控制定时器GATE2门控信号,PB1控制扬声器是否连接到定时器输出端PB0·PB103频率计算公式计数初值=1193180÷目标频率。例如发出440Hz标准A音,计数值≈2712(0A98H)440Hz→271204控制流程设置8253工作方式(43H)→写入计数初值(42H)→读端口61H置位PB0/PB1后回写开启扬声器43H→42H→61HASSEMBLY·8253TIMER发声程序核心代码逻辑发声程序遵循"保存端口状态→开启扬声器→设置频率→延时→恢复端口状态"的标准流程。掌握这一模式后可扩展为演奏任意乐曲。01保存端口状态:INAL,61H读取当前端口61H值并暂存(如存入BX),以便发声结束后恢复原始状态,避免干扰其他功能02开启扬声器:将AL低两位置1(ORAL,03H)后OUT61H,AL,同时激活GATE2门控和扬声器连接03设置8253工作方式:MOVAL,0B6H/OUT43H,AL,选择通道2、读写低高字节、方式3(方波发生器)04写入计数初值:将频率对应计数值分低字节和高字节依次写入端口42H,如MOVAX,2712/OUT42H,AL/MOVAL,AH/OUT42H,AL05延时与关闭:调用延时子程序控制发声持续时间,结束后用保存的原始值OUT61H,BL恢复端口状态关闭扬声器MusicPlayerDesign乐曲演奏程序设计方法乐曲演奏通过频率表和时间表的并行遍历实现:频率表定义音高(定时器计数值),时间表定义节奏(持续时长),循环调用发声子程序即可完成连续演奏。262Hz·4553建立频率数据表按旋律顺序排列各音符对应的定时器计数值,建立音高与硬件计数的映射关系,为后续发声提供基础数据支撑。音高映射定时器18.2ticks/s建立时间数据表按相同顺序排列各音符的持续时长,精确控制每个音符的播放节奏,实现旋律的时间维度编排。节奏控制时长SI&DI双指针并行遍历SI指向频率表、DI指向时间表,每轮同步取出一对数据,指针各加2继续下一轮,实现音高与节奏的精准同步。SI寄存器DI寄存器FFFFH结束标记设计在频率表末尾放置特殊终止标志值FFFFH,程序检测到该值后立即退出循环,确保演奏完整结束。终止检测循环退出gun·musex教材示例程序gun程序演示单次音效发声,musex程序演示完整音阶的连续演奏,两者结合展示不同应用场景。单次音效连续演奏EXPERIMENT发声系统实验练习乐曲编程实验要求学生独立设计频率表和时间表,综合运用端口I/O、循环遍历、子程序调用等技术,从简单旋律到完整乐曲逐步提升编程能力。实验3.1乐曲程序(1)01选择一段简单旋律(如《小星星》),手动计算各音符对应的8253定时器计数值并建立频率表,理解音高与定时器初值的数学关系02设计配套的时间数据表确保节奏正确;编写主程序实现频率表和时间表的循环遍历与发声控制,掌握数据驱动编程思想03要求程序结构清晰,包含独立的发声子程序、延时子程序和主循环,便于调试和扩展,培养模块化设计能力8253频率表·定时器编程实验3.2乐曲程序(2)01在实验3.1基础上增加功能扩展:支持多首乐曲选择、播放速度调节或增加休止符处理,提升程序灵活性02优化用户体验:在演奏前通过DOS中断INT21H显示曲名和播放提示,结束后显示结束信息,学习系统调用方法03鼓励创新:可尝试加入按键控制(按任意键停止演奏)或实现简单的和声效果,探索更多硬件交互可能性INT21H交互·人机接口CHAPTER03显示器I/O程序设计从光标控制到窗口管理,掌握BIOSINT10H显示服务DISPLAYARCHITECTURE视频显示模式与缓冲区文本模式将屏幕划分为25×80字符网格,每个位置由字符码+属性字节组成,缓冲区起始于B800:0000。理解这一内存映射结构是直接写屏显示的基础。文本模式Mode03H25行×80列字符网格,每字符占2字节——低字节为ASCII码,高字节为属性字节控制颜色显示。25×80显示缓冲区地址CGA/EGA文本模式为B800:0000,单显为B000:0000,直接写内存比调用INT10H速度快数倍。B800:0000属性字节结构高4位为背景色(RGB+闪烁位),低4位为前景色(RGB+高亮度位),如07H=灰字黑底,70H=黑字灰底。07H/70HBIOS模式切换INT10HAH=00H切换显示模式:AL=03H设为80×25彩色文本,AL=12H设为640×480VGA图形模式。INT10HBIOSINTERRUPTSERVICESBIOSINT10H核心显示功能INT10H提供光标控制、字符显示、窗口滚动等完整显示服务。通过功能号(AH)选择服务,配合寄存器参数实现精确的屏幕控制,是文本界面编程的核心工具。光标与字符操作AH=02H设置光标位置—DH=行号(0~24),DL=列号(0~79),BH=显示页号,定位后所有字符输出从该位置开始AH=09H显示字符及属性—AL=字符ASCII码,BL=属性字节(前景/背景色),CX=重复次数,光标不自动前进AH=0EH电传打字输出—AL=字符码,BL=前景色,自动前进光标并处理CR/LF/BS等控制字符,类似DOS字符输出窗口与滚动操作AH=06H窗口上滚—AL=滚动行数(0=清窗口),CH:CL=左上角行:列,DH:DL=右下角行:列,BH=空白行填充属性AH=07H窗口下滚—参数与06H相同但方向相反,两者配合可实现屏幕局部区域的动态滚动效果AH=08H读取光标处字符及属性—返回AL=字符码、AH=属性字节,可用于屏幕内容的读取和保存Assembly·I/OProgramming光标轨迹程序(draw)设计分析光标轨迹程序通过读取方向键扫描码实时更新光标坐标,在移动路径上写入字符实现屏幕绘图。这是键盘I/O与显示I/O协同工作的经典案例。01扩展键的双次读取机制方向键为扩展键,需通过INT16HAH=00H两次读取:第一次返回AL=00H作为扩展前缀,第二次返回扫描码标识具体按键。INT16H·AH=00H02方向键扫描码映射48H=上移(行号−1),50H=下移(行号+1),4BH=左移(列号−1),4DH=右移(列号+1),四组扫描码精确定位方向。48H·50H·4BH·4DH03屏幕边界检测每次更新坐标后检查是否超出屏幕范围(行0–24,列0–79),越界则保持原位置不移动,确保光标始终在可视区域内。Row0–24·Col0–7904轨迹字符写入用INT10HAH=02H将光标定位到新坐标,再用AH=09H在该位置写入轨迹字符(如'*'或'█'),实现可视化绘图。INT10H·AH=09HAssembly·INT10H屏幕窗口控制技术(wdex)通过INT10HAH=06H对指定矩形区域执行滚动/清屏操作,配合不同属性字节,可在文本模式下创建多个独立窗口区域,实现分区域显示管理。窗口定义用左上角(CH:CL)和右下角(DH:DL)两个坐标确定矩形区域,AH=06H+AL=0实现清窗口并填充属性。CH:CL→DH:DL多窗口隔离为不同窗口分配不同颜色属性,视觉上形成独立的界面区域,如标题栏用反白、内容区用常规配色。70H/07H窗口内输出先用AH=02H将光标定位到目标窗口内的指定位置,再执行字符输出,内容自然限制在该窗口范围内。AH=02H滚动更新当窗口内容超出一屏时,用AH=06H+AL=1实现窗口内整体上滚一行,底部出现新的空白行用于追加内容。AL=1GridDrawing·技术细节横竖线绘制程序(grid)实现文本模式下的线条绘制依赖IBM扩展字符集中的制表符(如─、│、┼),通过循环在指定行列坐标连续写入这些特殊字符来构建网格和表格界面。制表符编码IBM扩展字符集提供横线(C4H)、竖线(B3H)、十字交叉(C5H)、左下(C0H)、右下(D9H)等制表字符。C4H·B3H水平线绘制固定行号,从起始列到终止列循环,每次用INT10HAH=02H定位光标+AH=09H写入横线字符C4H。INT10H垂直线绘制固定列号,从起始行到终止行循环,每次定位光标后写入竖线字符B3H,行号递增而列号不变。行递增交叉点处理横线与竖线交汇处需写入十字交叉字符C5H,程序需预先计算所有交叉点坐标避免覆盖。C5H交叉AssemblyLab·INT10H显示器I/O实验练习三个递进式实验从字符图形到窗口管理再到线条绘制,系统训练学生的屏幕控制能力,每个实验都综合运用多种INT10H功能。实验3.3字符图形程序使用ASCII字符和IBM扩展字符在屏幕上绘制指定图案(如三角形、菱形、方框嵌套等)练习光标精确定位和循环控制,要求图案居中显示且比例协调IBM扩展字符实验3.4屏幕窗口程序创建至少3个不重叠的屏幕窗口,每个窗口使用不同颜色属性和边框样式在不同窗口中分别显示不同内容(如系统信息、时间、用户输入等),实现简易多窗口界面多窗口界面实验3.5画栅栏线程序按指定间距绘制水平和垂直交叉的栅栏图案,正确计算所有交叉点并使用对应的制表符支持用户输入栅栏的行数和列数参数,动态调整网格密度动态网格密度CHAPTER04键盘输入程序设计从BIOS中断到端口直读,掌握多层次的键盘输入技术KeyboardInput键盘输入的三个层次键盘输入从高层到底层分为DOS调用、BIOS中断和端口直读三种方式。层次越低控制越精细但编程越复杂,实际应用中通常优先使用BIOSINT16H。DOS层·INT21HAH=01H等待按键并回显字符到屏幕,返回AL=ASCII码,自动处理Ctrl+C中断AH=07H/08H等待按键但不回显,08H响应Ctrl+Break而07H不响应,适用于密码输入AH=0AH缓冲输入字符串,DS:DX指向输入缓冲区(首字节最大长度,次字节返回实际长度)BIOS层·INT16HAH=00H阻塞等待按键,返回AL=ASCII码+AH=扫描码;功能键AL=00H需查扫描码识别AH=01H非阻塞查询键盘缓冲区,ZF=1无键按下,ZF=0有键可读取(但不取出)AH=02H读取Shift/Ctrl/Alt等修饰键状态,返回AL中各标志位,用于组合键判断KEYBOARDI/O键盘处理演示程序(kbdio)分析kbdio程序通过检查AL是否为0来区分普通字符键和功能键,采用"分发-查表-执行"模式处理各类按键输入,是交互式键盘程序的标准设计范式。按键分类判断INT16H读取后检查AL——AL≠0为可打印字符直接输出,AL=0为扩展键需进一步查扫描码AL≠0→PRINT扫描码查表机制建立扫描码→功能地址跳转表,用AH值作为索引,通过JMP[BX+SI]实现快速分支跳转JMP[BX+SI]功能键映射AH=48H(↑)调用上移光标,AH=50H(↓)调用下移子程序,AH=01H(Esc)触发退出逻辑48H↑·50H↓·01HESC回显控制程序自行决定是否回显输入内容,可实现密码掩码显示、命令编辑等高级交互功能ECHOCONTROLAssemblyModule自定义键盘输入模块(keyboard)keyboard程序自行管理输入缓冲区和光标位置,支持退格删除、光标移动等编辑功能,比DOSAH=0AH的简单缓冲输入更灵活,适用于需要复杂交互的场景。缓冲区管理定义固定大小的字符数组作为输入缓冲区,用DI指向当前位置,SI记录已输入字符数DI·SI退格处理检测扫描码08H时,DI回退一位、SI减1,用空格覆盖屏幕上最后一个字符并回移光标Scan08H回车确认检测扫描码0DH时,在缓冲区末尾添加'$'终止符,设置返回标志退出输入循环Scan0DH溢出保护每次输入前比较SI与缓冲区最大长度,达到上限时忽略后续输入并发出蜂鸣提示INT10HI/OProgramming字处理演示程序(wspp)设计思路wspp程序综合运用键盘输入、屏幕显示和缓冲区管理技术,实现了简易文本编辑器功能,是I/O编程技术的集大成应用案例。文本缓冲区在内存中维护一个大于屏幕面积的二维字符数组,存储所有已输入的文本内容,支持随机访问和高效读写操作2DArray光标与视图同步屏幕显示缓冲区中当前可见的25行内容,光标移动超出屏幕边界时触发整屏滚动更新,保持视图与数据一致25Lines编辑操作映射普通字符插入缓冲区并显示,Backspace删除前一字符并刷新,Enter插入换行符并下移光标,实现完整的编辑功能映射3Mappings性能优化频繁刷新时绕过INT10H直接写入B800:0000显示缓冲区,避免BIOS调用的额外开销,显著提升屏幕更新效率B800:0000EXPERIMENTPRACTICE键盘输入实验练习两个扩充型实验要求在示例程序基础上增加新功能,锻炼学生对键盘I/O技术的综合运用能力和程序架构设计能力。实验3.6扩充键盘处理功能在kbdio基础上增加Ctrl组合键支持:如Ctrl+S保存、Ctrl+Q退出、Ctrl+C复制等常用快捷键实现按键历史记录功能:维护环形缓冲区保存最近N次按键,支持按F2回放历史输入增加按键统计功能:实时显示已按键次数、字符键/功能键比例,按F10切换显示统计面板实验3.7扩充字处理功能在wspp基础上增加文本查找功能:按Ctrl+F弹出查找输入框,输入关键词后在缓冲区中搜索并高亮定位实现行号显示:在屏幕左侧固定显示当前行号,随光标移动实时更新增加文件保存功能:按Ctrl+S时调用DOSINT21H的文件创建和写入功能,将缓冲区内容保存为磁盘文件CHAPTER05中断程序设计理解中断向量表,掌握中断处理程序的编写与安装8086Architecture中断机制与中断向量表8086通过256项中断向量表(IVT)管理所有中断,每项4字节存储处理程序的段地址和偏移地址。自定义中断程序的核心操作就是修改IVT中对应项的指针值。IVT结构中断类型号0~255对应256个中断向量,每个向量4字节(低字=偏移IP,高字=段CS),IVT位于物理地址00000H~003FFH。00000H–003FFH中断响应过程CPU收到中断→标志寄存器入栈→清IF/TF→CS:IP入栈→从IVT读取处理程序地址→跳转执行。6步响应链IRET返回指令依次弹出IP、CS、标志寄存器,恢复被中断程序的执行现场,与RET指令不同——RET不恢复FLAGS。IRET≠RET向量定位公式类型号n的向量地址=n×4。如INT09H(键盘中断)向量地址=09H×4=00024H(即0000:0024)。n×4=0000:0024ASSEMBLY·INTERRUPT自定义中断处理程序的编写与安装安装自定义中断处理程序需遵循"保存原向量→关中断→安装新向量→开中断"的安全流程,程序退出时必须恢复原向量以防止系统崩溃。01获取原向量DOSAH=35HMOVAH,35H/MOVAL,中断类型号/INT21H,返回ES:BX=原处理程序地址,存入内存变量保存02编写处理过程FARPROC以FARPROC声明,入口处用PUSH保存所有修改的寄存器,出口处POP恢复,最后IRET返回03安装新向量DOSAH=25HCLI关中断→DX=偏移地址→DS=段地址→MOVAH,25H/MOVAL,类型号/INT21H→STI开中断04恢复原向量EXITRESTORE程序退出前用同样方法(AH=25H)将保存的原ES:BX写回IVT,确保后续程序能正常使用该中断InterruptProgramming打字计时程序(type-ex)实例分析type-ex通过替换INT1CH定时器中断实现后台精确计时,在不干扰主程序键盘输入的前提下统计打字时间,展示了中断在异步事件处理中的核心价值。01INT1CH是定时器滴答中断(约18.2次/秒),BIOS默认处理为空操作(仅IRET),用户可安全替换为自定义计时逻辑02计时实现:自定义INT1CH处理程序每次被调用时将内存计数器加1,主程序读取计数器值÷18.2即得秒数03主程序逻辑:安装INT1CH处理程序→等待用户按键开始→循环读取键盘输入并计数→回车结束→读取计数器计算速度→恢复原向量04关键技术点:计数器变量必须在主程序和处理程序之间共享(同一数据段),且操作计数器时需考虑原子性(16位加法可能被中断打断)DOSMEMORYARCHITECTURE驻留程序(TSR)基本概念TSR程序通过DOSAH=31H终止并驻留内存,安装自定义中断处理程序监听热键激活。这是DOS时代实现"后台常驻"和"随时呼出"功能的核心技术。01TSR终止方式通过DOSINT21HAH=31H(TerminateandStayResident)实现终止驻留,AL寄存器传入返回码,DX指定驻留内存大小(以16字节节数计)。INT21H·AH=31H02热键激活机制替换INT09H(键盘中断)或INT16H(键盘服务),在中断处理程序中检测特定组合键(如Ctrl+Alt+Del)以触发TSR功能。INT09H·INT16H03内存管理TSR驻留后占用固定内存区域,需精确计算所需空间(代码+数据+堆栈),避免与后续加载的程序产生内存冲突。16字节/节04安全注意事项TSR激活时必须保存当前所有寄存器和显示状态,执行完毕后完全恢复现场,否则会导致前台程序运行异常。SAV

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论