汇编语言程序设计基础.doc_第1页
汇编语言程序设计基础.doc_第2页
汇编语言程序设计基础.doc_第3页
汇编语言程序设计基础.doc_第4页
汇编语言程序设计基础.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

第四章 汇编语言程序设计基础基本程序结构:顺序结构 循环结构分支结构 子程序结构4.1 循环程序设计 结 束 初始化 循环的初始状态 循 环 体 循环的工作部分及修改部分 计数控制特征值控制地址边界控制 修改部分 循环控制条件 YN例1. 把BX中的二进制数以十六进制的形式显示在屏幕上。1BX234mov ch, 4rotate: mov cl, 4rol bx, clmov al, bland al, 0fhadd al, 30h ;0-9 ASCII 30H-39Hcmp al, 3ahjl printitadd al, 7h ;A-F ASCII 41H-46Hprintit: mov dl, almov ah, 2int 21hdec chjnz rotateA B X 判定条件 4.2 分支程序设计判定条件 A B (1)两路分支结构 (2)多路分支结构(1)逻辑尺控制 (2)条件控制? ? case 1 case 2 case 3 case 1 case 2 case n (3)地址跳跃表TABLE DW ONE, TWO, THREEJMP TABLESI1000 ONE: 2000 TWO: 3000 THREE: 例。 设有数组x(x1, , x10)和y(y1, , y10),编程计算 z1=x1 y1 z2=x2 y2 z3=x3 y3逻辑尺:0 0 1 1 0 1 1 1 0 0 1 减法 0 加法 z4=x4 y4 z5=x5 y5 z6=x6 y6 z7=x7 y7 z8=x8 y8 z9=x9 y9 z10=x10 y10 x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_rule dw 00dchmov bx, 0mov cx, 10mov dx, logic_rulenext: mov ax, xbxshr dx, 1jc subtractadd ax, ybxjmp short result ; 向前引用subtract: sub ax, ybxresult: mov zbx, axadd bx, 2loop next4.3 子程序的设计方法 过程(子程序)定义伪操作procedure_name PROC NEAR ( FAR ) procedure_name ENDP(1)NEAR属性:调用程序和子程序在同一代码段中 (段内调用)(2)FAR属性:调用程序和子程序不在同一代码段中 (段间调用)保存与恢复寄存器subt proc far push ax push bx push cx push dx . pop dx pop cx pop bx pop ax retsubt endp子程序的调用和返回子程序调用(中断调用):隐含使用堆栈保存返回地址 (IP)(SP)call near ptr subp (1) 保存返回地址 (2) 转子程序 (IP) subp的偏移地址call far ptr subp (IP)(SP) (CS) (1) 保存返回地址 (2) 转子程序 (CS) subp的段地址 (IP) subp的偏移地址int 21HINT n (n : 中断类型号) (1) 保存现场和返回地址(FLAGS,CS,IP入栈)(IP)(SP) (CS)(FLAGS) (2) 转中断处理程序 (IP) (n*4) (CS) (n*4+2)子程序返回:(1)ret (返回地址出栈)(2)iret (IP,CS,FLAGS出栈)子程序的参数传送(1)通过寄存器传送参数(2)通过存储区传送参数*子程序和调用程序在同一程序模块中,则子程序可直接访问模块中的变量。*子程序和调用程序不在同一程序模块中,则有两种传送方式:建立公共数据区和使用外部符号。(3)通过地址表传送参数地址(4)通过堆栈传送参数或参数地址例. 十进制到十六进制的转换程序(通过寄存器传送变量)Decihexsegment ; 1016assume cs: decihexmain proc farpush ds sub ax, ax push axrepeat: call decibin ; 102 call crlf call binihex ; 216 call crlf jmp repeat retmain endpDecibinproc near ; 102 mov bx, 0newchar: mov ah, 1 int 21h sub al, 30h jl exit ; 9退出 cbw xchg ax, bx mov cx, 10d mul cx xchg ax, bx add bx, ax jmp newcharexit: retdecibin endpbinihex proc near ; 216 mov ch, 4rotate: mov cl, 4 rol bx, cl mov al, bl and al, 0fh add al, 30h cmp al, 3ah jl printit add al, 7h ; AF printit: mov dl, al mov ah, 2 int 21h dec ch jnz rotate retbinihex endpcrlf proc near mov dl, 0dh mov ah, 2 int 21h mov dl, 0ah mov ah, 2 int 21h retcrlf endpdecihex ends end main4.4 I/O程序设计1. I/O设备的数据传送方式 程序控制方式(查询方式) CPU利用指令反复查询I/O的状态,直到I/O准备好,才进行输入/输出。此间CPU处于循环等待状态,未做有效的工作。中断方式 CPU在执行程序的同时兼顾对I/O设备的控制或数据传送。当I/O设备准备好(空闲),由I/O通知CPU暂停正在运行的程序,转而处理I/O设备的请求,处理完即返回主程序继续执行。DMA方式(直接存储器存取方式/成组传送方式) 主要适用于高速I/O设备(如磁盘),CPU向I/O接口提供控制信息(如数据块的首地址及字节数),I/O设备直接和存储器进行成批数据的快速传送。2. 程序直接控制I/O方式I/O端口 外设接口由一组寄存器(数据寄存器/状态寄存器/命令寄存器)组成,每个寄存器有一个端口地址(端口号),IBM-PC机的I/O地址空间可达64K(0000FFFFH)。I/O指令 主机与外设进行通信的最基本途径。DOS功能调用和BIOS例行程序中的输入/输出功能也是由IN和OUT指令完成的。例:测试某状态寄存器(端口号27H)的第2位是否为1IN AL, 27HTEST AL, 00000100BJNZ ERROR设备控制寄存器 端口61H 控制其它外部设备与门 放大器 2号定时器门控 1 / 0 01 0例1. Sound程序mov dx, 6000 ;声音频率in al, 61hand al, 11111100btrig: xor al, 00000010bout 61h, almov cx, 1000 ;声音延迟delay: loop delaydec dxjne trig例2.CPU要从3个设备轮流输入数据,设备1,2,3的状态寄存器端口号分别用STAT1,STAT2,STAT3表示,第5位是输入准备位。INPUT: IN AL, STAT1TEST AL, 20H;0010 0000bJZ DEV2CALL FAR PTR PROC1DEV2: IN AL, STAT2TEST AL, 20HJZ DEV3CALL FAR PTR PROC2DEV3: IN AL, STAT3TEST AL, 20HJZ NO_INPUTCALL FAR PTR PROC3NO_INPUT: 3. 中断程序设计中断源:引起中断的事件外中断(硬中断):外设的I/O请求 可屏蔽中断电源掉电/奇偶错 非屏蔽中断内中断(软中断):INT指令/CPU错(除法错、溢出)非屏蔽中断请求 中断逻辑INT nINTO除法错 n 4 0 1CPU2 NMI8259A可编程中断控制器(PIC)IR0 系统定时器IR1 键盘IR2 彩色/图形接口IR3 保留IR4 串行通讯口IR5 保留IR6 软盘IR7 打印机08090A0B0C0D0E0F单步INTR中断操作的5个步骤:(1) 取中断类型号(2) 计算中断向量地址(3) 取中断向量,偏移地址送IP,段地址送CS(4) 转入中断处理程序(5) 中断返回到INT指令的下一条指令例:BIOS中断 INT 4AH (P.136 图4.13)4AH4 = 128H 4AH4+2 = 12AH类型0的(IP)00000000044*N003FC类型0的(CS)类型1的(IP)类型1的(CS)类型N的(CS)类型N的(IP)类型255的(IP)类型255的(CS)中断向量表IBM-PC中断系统能处理256种类型的中断,类型号为00FFH。中断向量表是各种中断处理程序的地址表。(128H) IP(12AH) CSDOS功能调用(21H)存取中断向量设置中断向量:AH=25HAL=中断类型号DS:DX=中断向量INT 21H取中断向量:AH=35HAL=中断类型号INT 21H返回时送ES:BX=中断向量例1用DOS功能调用存取中断向量MOV AL, NMOV AH, 35HINT 21H ; 取原中断向量PUSH ESPUSH BX ; 保存原中断向量PUSH DSMOV AX, SEG INTHANDMOV DS, AX MOV DX, OFFSET INTHANDMOV AL, NMOV AH, 25HINT 21H ; 设置新的中断向量POP DSPOP DXPOP DSMOV AL, NMOV AH, 25HINT 21H ; 恢复原中断向量RET;INTHAND: IRET中断程序的编写步骤:主程序:(1) 设置中断向量 ( DOS调用 AH=25H, AH=35H )(2) 设置CPU中断允许位FLAGS中的IF位=1 允许中断 (STI 开中断)=0 禁止中断 (CLI 关中断)(3) 设置中断屏蔽位I/O端口 21H 中断屏蔽寄存器中断屏蔽位=0 允许中断=1 禁止中断7 6 5 4 3 2 1 0 定时器键 盘 打印机中断屏蔽寄存器21H中断处理子程序:(1)保存工作寄存器 (PUSH)(2)开中断( STI )(3)中断处理功能(4)关中断( CLI )(5)送中断结束命令( EOI ,仅对硬中断)(6)恢复工作寄存器( POP)(7)中断返回( IRET )7 6 5 4 3 2 1 0中断命令寄存器20H EOIEOIMOV AL, 20HOUT 20H, AL例2 . 编写一个中断处理程序,要求在主程序运行期间,每隔 10秒响铃一次,同时显示The bell is ring!dseg segment count dw 1 mess db The bell is ring!,0ah,0dh,$dseg endscseg segmentmain proc far assume cs:cseg, ds:dseg, es:dsegstart: push ds mov ax, ax push ax mov ax, dseg mov ds, ax mov al, 1ch mov ah, 35h int 21h ; 取原中断向量 push es push bx ; 保存原中断向量 push ds mov dx, offset ring mov ax, seg ring mov ds, ax mov al, 1ch mov ah, 25h int 21h ; 设置新的中断向量 pop ds in al, 21h and al, 11111110b out 21h, al ; 设置中断屏蔽位,允许定时器中断 sti ; 开中断mov di, 2000delay: mov si, 3000delay1: dec si jnz delay1 dec di jnz delay ; 主程序工作(期间每秒产生中断18.2次) pop dx pop ds mov al, 1ch mov ah, 25h int 21h ; 恢复原中断向量 retmain endpring proc far push ds push ax push cx push dx mov ax, dseg mov ds, ax sti ; 开中断,允许更高级的中断 dec count jnz exit mov dx, offset mess mov ah, 09 int 21h ; 显示The bell is ring!movdx, 100 inal, 61h and al, 11111100bsound: xor al, 2 out 61h, al mov cx, 140hwait1: loop wait1 dec dx jne sound ; 响铃 mov count, 182exit: cli ; 关中断 pop dx pop cx pop ax pop ds iretring endpcseg ends end start 4.5 BIOS和DOS基本调用调用方法:1、将调用参数装入指定的寄存器中;2、如需功能号,把它装入AH;3、如需子功能号,把它装入AL;4、按中断号调用DOS或BIOS中断;5、检查或取得返回参数。例:建立文件程序MOV CX,0 ;normal attributeMOV DX,PATHNAM ;path nameMOV AH,3CH ;creat file INT 21H ; DOS callJC ERROR ;if CF=1,error1.键盘I/O(1)BIOS键盘中断 ( INT 16H)AH 功能 返回参数0 从键盘读一字符 AL=字符码,AH=扫描码1 读键盘缓冲区的字符 如ZF=0,AL=字符码,AH=扫描码如ZF=1,缓冲区空2 取键盘状态字节 AL=键盘状态字节 字符数字键 字符码为ASCII 码 功能键、控制键 字符码为0对应一个扫描码(2)DOS键盘中断 ( INT 21H)AH 功 能 调用参数 返回参数 1 从键盘输入一个字符并回显在屏幕上 AL=字符 6 读键盘字符,不回显 DL= 0FFH 若有字符可取,AL=字符,ZF=0 若无字符可取,AL=0,ZF=1 7 从键盘输入一个字符,不回显 AL=字符 8 从键盘输入一个字符,不回 AL=字符 检测Ctrl-BreakA 输入字符到缓冲区 DS:DX=缓冲区首址 B 读键盘状态 AL=0FFH有键入,AL=00无键入 C 清除键盘缓冲区, AL=键盘功能号并调用一种键盘功能 (1,6,7,8或A) 例: 输入字符串到缓冲区STRINGDATA SEGMENTMAXLEN DB 32 MAXLEN DB 32 ,0, 32 DUP(?)ACTLEN DB ? MAXLEN DB 32 ,33 DUP(?)32568H61H70H70H79H0DHMAXLENACTLENSTRINGSTRING DB 32 DUP(?)DATA ENDS;CODE SEGMENTLEA DX,MAXLENMOV AH,0AHINT 21HCODE ENDSEND7 6 5 4 3 2 1 0ASCII字符2.显示器I/O字符显示 7 6 5 4 3 2 1 0前景000 = 黑111 = 白 亮度0 = 正常亮度1 = 加强亮度 闪烁0 = 正常显示1 = 闪烁显示 背景000 = 黑111 = 白 单色属性7 6 5 4 3 2 1 0 前景闪烁背景BL R G B I R G B16色属性(1)BIOS显示中断 INT 10H 功能号 AH=1, 2, 3, 5, 6, 7, 8, 9, 0AH, 0EH, 13H (p.158)例:屏幕初始化或上卷 (AH=6)mov ah, 6;to scroll up screenmov al, 0;blank screenmov bh, 7;blank linemov ch, 0;upper left rowmov cl, 0;upper left columnmov dh, 24;lower right rowmov dl, 79;lower right columnint 10h ;call video BIOS例: 在品红背景下,显示5个浅绿色闪烁的星号。MOVAH,09MOVAL,*MOVBH,0MOVBL,0DAH ;1101 1010 (表4.10)MOVCX,05INT 10H 例: 在屏幕上以红底兰字显示字符串:“WORLD SCENERY”。 STRINGDB

温馨提示

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

评论

0/150

提交评论