收藏 分享(赏)

汇编语言程序设计基础.PPT.ppt

上传人:wspkg9802 文档编号:5957346 上传时间:2019-03-22 格式:PPT 页数:71 大小:247KB
下载 相关 举报
汇编语言程序设计基础.PPT.ppt_第1页
第1页 / 共71页
汇编语言程序设计基础.PPT.ppt_第2页
第2页 / 共71页
汇编语言程序设计基础.PPT.ppt_第3页
第3页 / 共71页
汇编语言程序设计基础.PPT.ppt_第4页
第4页 / 共71页
汇编语言程序设计基础.PPT.ppt_第5页
第5页 / 共71页
点击查看更多>>
资源描述

1、1,汇编语言程序设计基础,基本程序结构:顺序结构 循环结构分支结构 子程序结构复合结构:多种程序结构的组合,2,4.1 循环程序设计,3,例1. 把BX中的二进制数以十六进制的形式显示在屏幕上。,BX,4,mov ch, 4 rotate: 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-46H printit: mov dl, almov ah, 2int 21hdec chjnz rotate,5,例2.

2、将正数n插入一个已整序的字数组的正确位置。 算法: 将数组中数逐个与N比较,Si为指针 若NKi,则Ki下移一个单元 若NKi,则插在Ki的下一个单元,并结束 临界条件: 若NKn,则插入Kn的下一个单元 若NK1,则K1Kn后移一个单元, N插在第一个单元 循环控制: 计数控制 元素个数=(字末地址字首地址) / 2) +1 字数= (字节末地址字节首地址) +1 字节数 地址边界控制 结束地址为ARRAY_HEAD 特征值控制: 表示结束条件的值,6,例2. 将正数n插入一个已整序的字数组的正确位置。x dw ?array_head dw 3,5,15,23,37,49,52,65,78,

3、99array_end dw 105n dw 32mov ax, nmov array_head-2, 0ffffhmov si, 0 compare:cmp array_endsi, axjle insertmov bx, array_endsimov array_endsi+2, bxsub si, 2 jmp short compare insert:mov array_endsi+2, ax,7,例3 将首地址为A的字数组从小到大排序(气泡算法,多重循环) A dw 32,85,16,15, 8,8,mov cx, 10dec cx loop1: mov di, cxmov bx, 0

4、 loop2: mov ax, Abxcmp ax, Abx+2jle continuexchg ax, Abx+2mov Abx, ax continue:add bx, 2 loop loop2mov cx, diloop loop1,9,4.2 分支程序设计,A,B,A,B,X,(1)两路分支结构 (2)多路分支结构,10,(1)逻辑尺控制 (2)条件控制(3)地址跳跃表TABLE DW ONE, TWO, THREEJMP TABLESI1000 ONE: 2000 TWO: 3000 THREE: ,。,11,例1. 设有数组x(x1, , x10)和y(y1, , y10),编程计

5、算z1=x1 y1z2=x2 y2z3=x3 y3z4=x4 y4z5=x5 y5z6=x6 y6z7=x7 y7z8=x8 y8z9=x9 y9z10=x10 y10,逻辑尺:0 0 1 1 0 1 1 1 0 01 减法0 加法,12,x dw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10 y dw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 z dw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10 logic_rule dw 00dchmov bx, 0mov cx, 10mov dx, logic_rulenext: mov ax, xb

6、xshr dx, 1jc subtractadd ax, ybxjmp short result ; 向前引用 subtract: sub ax, ybxresult: mov zbx, axadd bx, 2loop next,13,例2. 根据AL寄存器中哪一位为1(从低位到高位)把程序转移到8个不同的程序分支去 。(寄存器间接寻址),branch_table dw routine1dw routine2dw routine3 dw routine4 dw routine5 dw routine6 dw routine7 dw routine8,cmp al, 0je continuele

7、a bx, branch_table L : shr al, 1 ;逻辑右移jnc add1jmp word ptr bx;段内间接转移 add1:add bx, 2jmp L continue: routine1: routine2: ,14,4.3 子程序的设计方法过程(子程序)定义伪操作procedure_name PROC NEAR ( FAR ) procedure_name ENDP(1)NEAR属性:调用程序和子程序在同一代码段中(段内调用)(2)FAR属性:调用程序和子程序不在同一代码段中(段间调用),15,保存与恢复寄存器subt proc farpush axpush bx

8、push cxpush dxpop dxpop cxpop bxpop axretsubt endp,16,子程序调用(中断调用):隐含使用堆栈保存返回地址call near ptr subp (1) 保存返回地址(2) 转子程序(IP) subp的偏移地址call far ptr subp (1) 保存返回地址(2) 转子程序(CS) subp的段地址(IP) subp的偏移地址,子程序的调用和返回,17,INT n (n : 中断类型号)(1) 保存现场和返回地址(FLAGS,CS,IP入栈)(2) 转中断处理程序(IP) (n*4)(CS) (n*4+2)子程序返回:(1)ret (返回

9、地址出栈)(2)iret (IP,CS,FLAGS出栈),int 21H,18,子程序的参数传送(1)通过寄存器传送参数(2)通过存储区传送参数*子程序和调用程序在同一程序模块中,则子程序可直接访问模块中的变量。*子程序和调用程序不在同一程序模块中,则有两种传送方式:建立公共数据区和使用外部符号。(3)通过地址表传送参数地址(4)通过堆栈传送参数或参数地址,19,例3. 十进制到十六进制的转换程序(通过寄存器传送变量)Decihex segment ; 1016assume cs: decihexmain proc farpush dssub ax, axpush ax repeat: cal

10、l decibin ; 102call crlfcall binihex ; 216call crlfjmp repeatret main endp,20,Decibin proc near ; 102mov bx, 0 newchar: mov ah, 1int 21hsub al, 30h jl exit ; 9退出cbwxchg ax, bxmov cx, 10dmul cxxchg ax, bxadd bx, axjmp newchar exit: ret decibin endp,21,binihex proc near ; 216mov ch, 4 rotate: mov cl,

11、4rol bx, clmov al, bland al, 0fhadd al, 30hcmp al, 3ahjl printitadd al, 7h ; AF printit: mov dl, almov ah, 2int 21hdec chjnz rotateret binihex endp,22,crlf proc nearmov dl, 0dhmov ah, 2int 21hmov dl, 0ahmov ah, 2int 21hret crlf endpdecihex endsend main,23,例4. 累加数组中的元素(直接访问变量) data segmentary dw 1,2,

12、3,4,5,6,7,8,9,10count dw 10sum dw ? data ends code segment main proc farassume cs:code, ds:data start:push dssub ax, axpush axmov ax, datamov ds, axcall near ptr proaddret main endp,24,proadd proc nearpush axpush cxpush silea si, arymov cx, countxor ax, ax next: add ax, siadd si, 2loop nextmov sum,

13、axpop sipop cxpop axret proadd endp code endsend start,25,data segmentary dw 1,2,3,4,5,6,7,8,9,10 count dw 10 sum dw ?ary1 dw 10,20,30,40,50,60,70,80,90,100 count1 dw 10 sum1 dw ?data ends,如果数据段定义如下:,*如果直接访问内存变量,那么累加数组ary和数组ary1中的元素不能用同一个子程序proadd,26,例5 . 累加数组中的元素(通过地址表传送变量地址) data segmentary dw 10,

14、20,30,40,50,60,70,80,90,100count dw 10sum dw ?table dw 3 dup (?) ; 地址表 data endscode segment main proc far assume cs:code, ds:data start: push dssub ax, axpush axmov ax, datamov ds, axmov table, offset arymov table+2, offset countmov table+4, offset summov bx, offset tablecall proaddretmain endp,27,

15、proadd proc nearpush axpush cxpush sipush dimov si, bxmov di, bx+2mov cx, dimov di, bx+4xor ax, ax next: add ax, siadd si, 2loop nextmov di, axpop dipop sipop cxpop axret proadd endp code endsend start,(si),(di),28,例6 . 累加数组中的元素(通过堆栈传送变量地址)data segmentary dw 10,20,30,40,50,60,70,80,90,100count dw 10

16、sum dw ? data endsstack segmentdw 100 dup (?)tos label word stack ends,29,code1 segment main proc farassume cs:code1, ds:data, ss:stack start:mov ax, stackmov ss, axmov sp, offset tospush dssub ax, axpush axmov ax, datamov ds, axmov bx, offset arypush bxmov bx, offset countpush bxmov bx, offset sump

17、ush bxcall far ptr proaddret main endp code1 ends,30,code2 segmentassume cs: code2 proadd proc farpush bpmov bp, sppush axpush cxpush sipush dimov si, bp+0ahmov di, bp+8mov cx, dimov di, bp+6,xor ax, ax next: add ax, siadd si, 2loop nextmov di, axpop dipop sipop cxpop axpop bpret 6 proadd endp code2

18、 endsend start,31,例8 十六进制到十进制的转换程序(通过寄存器传送变量)hexidec segment ; 1610 main proc farassume cs: hexidec start:push dssub ax, axpush ax repeat:call hexibin ; 162call crlfcall binidec ; 210call crlfjmp repeatret main endp,32,hexibin proc near ; 162mov bx, 0 newchar:mov ah, 1int 21hsub al, 30hjl exitcmp al

19、, 10djl add_tosub al, 27h ; a f cmp al, 0ahjl exitcmp al, 10hjge exit add_to:mov cl, 4shl bx, clmov ah, 0add bx, axjmp newchar exit: ret hexibin endp,33,binidec proc near ; 210 mov cx, 10000dcall dec_divmov cx, 1000dcall dec_divmov cx, 100dcall dec_divmov cx, 10dcall dec_divmov cx, 1dcall dec_divret

20、binidec endp,dec_div proc nearmov ax, bxmov dx, 0div cxmov bx, dxmov dl, aladd dl, 30hmov ah, 2int 21hret dec_div endp,34,crlf proc nearmov dl, 0ahmov ah, 2int 21hmov dl, 0dhmov ah, 2int 21hret crlf endp hexidec endsend start,35,4.4 I/O程序设计,1. I/O设备的数据传送方式 程序控制方式(查询方式)CPU利用指令反复查询I/O的状态,直到I/O准备好,才进行输

21、入/输出。此间CPU处于循环等待状态,未做有效的工作。中断方式CPU在执行程序的同时兼顾对I/O设备的控制或数据传送。当I/O设备准备好(空闲),由I/O通知CPU暂停正在运行的程序,转而处理I/O设备的请求,处理完即返回主程序继续执行。DMA方式(直接存储器存取方式/成组传送方式)主要适用于高速I/O设备(如磁盘),CPU向I/O接口提供控制信息(如数据块的首地址及字节数),I/O设备直接和存储器进行成批数据的快速传送。,36,2. 程序直接控制I/O方式I/O端口 外设接口由一组寄存器(数据寄存器/状态寄存器/命令寄存器)组成,每个寄存器有一个端口地址(端口号),IBM-PC机的I/O地址

22、空间可达64K(0000FFFFH)。I/O指令主机与外设进行通信的最基本途径。DOS功能调用和BIOS例行程序中的输入/输出功能也是由IN和OUT指令完成的。例:测试某状态寄存器(端口号27H)的第2位是否为1 IN AL, 27H TEST AL, 00000100B JNZ ERROR,37,例1. Sound程序mov dx, 6000 ;声音频率in al, 61hand al, 11111100b trig: xor al, 00000010bout 61h, almov cx, 1000 ;声音延迟 delay: loop delaydec dxjne trig,38,例2. C

23、PU要从3个设备轮流输入数据,设备1,2,3的状态寄存器端口号分别用STAT1,STAT2,STAT3表示,第5位是输入准备位。INPUT: IN AL, STAT1TEST AL, 20H ;0010 0000bJZ DEV2CALL FAR PTR PROC1 DEV2: IN AL, STAT2TEST AL, 20HJZ DEV3CALL FAR PTR PROC2 DEV3: IN AL, STAT3TEST AL, 20HJZ NO_INPUTCALL FAR PTR PROC3 NO_INPUT:,39,3. 中断程序设计中断源:引起中断的事件 外中断(硬中断):外设的I/O请求

24、 可屏蔽中断电源掉电/奇偶错 非屏蔽中断 内中断(软中断):INT指令/CPU错(除法错、溢出),40,中断操作的5个步骤:,(1) 取中断类型号 (2) 计算中断向量地址 (3) 取中断向量,偏移地址送IP,段地址送CS (4) 转入中断处理程序 (5) 中断返回到INT指令的下一条指令,例:BIOS中断 INT 4AH (P.136 图4.13)4AH4 = 128H 4AH4+2 = 12AH(128H) IP(12AH) CS,41,中断向量表 IBM-PC中断系统能处理256种类型的中断,类型号为00FFH。中断向量表是各种中断处理程序的地址表。,42,DOS功能调用(21H)存取中

25、断向量设置中断向量: AH=25H AL=中断类型号 DS:DX=中断向量 INT 21H取中断向量: AH=35H AL=中断类型号 INT 21H 返回时送ES:BX=中断向量,43,例1 用DOS功能调用存取中断向量MOV AL, NMOV AH, 35HINT 21H ; 取原中断向量PUSH ESPUSH BX ; 保存原中断向量PUSH DS MOV AX, SEG INTHAND MOV DS, AX MOV DX, OFFSET INTHAND MOV AL, N MOV AH, 25H INT 21H ; 设置新的中断向量 POP DS POP DX POP DS MOV A

26、L, N MOV AH, 25H INT 21H ; 恢复原中断向量 RET ; INTHAND: IRET,44,中断程序的编写步骤:主程序:(1) 设置中断向量 ( DOS调用 AH=25H, AH=35H )(2) 设置CPU中断允许位FLAGS中的IF位=1 允许中断 (STI 开中断)=0 禁止中断 (CLI 关中断)(3) 设置中断屏蔽位I/O端口 21H 中断屏蔽寄存器中断屏蔽位=0 允许中断=1 禁止中断,45,MOV AL, 20H OUT 20H, AL,中断处理子程序: 保存工作寄存器 (PUSH) 开中断( STI ) 中断处理功能 关中断( CLI ) 送中断结束命令

27、( EOI ,仅对硬中断) 恢复工作寄存器( POP) 中断返回( IRET ),46,例2 . 编写一个中断处理程序,要求在主程序运行期间,每隔 10秒响铃一次,同时显示The bell is ring!dseg segmentcount dw 1mess db The bell is ring!,0ah,0dh,$ dseg endscseg segment main proc farassume cs:cseg, ds:dseg, es:dseg start:push dsmov ax, axpush axmov ax, dsegmov ds, ax,47,mov al, 1chmov

28、ah, 35hint 21h ; 取原中断向量push espush bx ; 保存原中断向量push dsmov dx, offset ringmov ax, seg ringmov ds, axmov al, 1chmov ah, 25hint 21h ; 设置新的中断向量pop dsin al, 21hand al, 11111110bout 21h, al ; 设置中断屏蔽位,允许定时器中断sti ; 开中断,48,mov di, 2000 delay: mov si, 3000 delay1:dec sijnz delay1dec dijnz delay ; 主程序工作(期间每秒产生

29、中断18.2次)pop dxpop dsmov al, 1chmov ah, 25hint 21h ; 恢复原中断向量ret main endp,49,ring proc farpush dspush axpush cxpush dxmov ax, dsegmov ds, axsti ; 开中断,允许更高级的中断dec countjnz exitmov dx, offset messmov ah, 09int 21h ; 显示The bell is ring!,50,mov dx, 100in al, 61hand al, 11111100b sound:xor al, 2out 61h, a

30、lmov cx, 140h wait1:loop wait1dec dxjne sound ; 响铃mov count, 182 exit: cli ; 关中断pop dxpop cxpop axpop dsiret ring endp cseg endsend start,51,例3 . 从键盘接收字符,同时对32字节的输入缓冲区进行测试。如果缓冲区已满,则将键盘挂起,由打印机输出一个提示信息。程序包括以下几个部分: main 初始化部分 kbint 键盘中断处理程序 intip 初始化打印机 print 打印机中断处理程序 disp 用十六进制显示AL中的内容,52,dseg segmen

31、taddr dw ? ;缓冲区指针count dw ?buffer db 20h dup ( )prompt db please input:,0dh,0ah,$message db buffer full,0dh,0ahsave_ip9 dw ?save_cs9 dw ?save_ipf dw ?save_csf dw ? dseg ends,53,cseg segment main proc far ;主程序assume cs:cseg, ds:dseg start:push dssub ax, axpush ax mov ax, dsegmov ds, ax lea ax, buffer

32、mov addr, axmov count, 0,54,mov al, 09 ;键盘 mov ah, 35h int 21h ;取原中断向量mov save_ip9, bx mov save_cs9, es ;保存 mov dx, offset kbint push ds mov ax, seg kbint mov ds, ax mov al, 09 mov ah, 25h int 21h ;设置新中断向量 pop ds,mov al, 0fh ;打印机 mov ah, 35h int 21h ;取原中断向量mov save_ipf, bx mov save_csf, es ;保存 cli m

33、ov dx, offset prtint push ds mov ax, seg prtint mov ds, ax mov al, 0fh mov ah, 25h int 21h ;设置新中断向量 pop ds,55,in al, 21h and al, 0fdh out 21h, al;允许键盘中断 mov ah, 9 lea dx, prompt int 21h;显示提示信息 sti,mov di, 20000h mainp:mov si, 30000h mainp1:dec sijnz mainp1dec dijnz mainp;延迟,56,clipush dsmov dx, save

34、_ip9mov ax, save_cs9mov ds, axmov al, 09mov ah, 25hint 21h;恢复原键盘中断pop ds,push dsmov dx, save_ipfmov ax, save_csfmov ds, axmov al, 0fhmov ah, 25hint 21h ;恢复原打印机中断pop dsin al, 21hand al, 0fdhout 21h, al ;允许键盘中断stiret main endp,57,kbint proc nearpush axpush bxin al, 60hpush axin al, 61hmov ah, alor al,

35、 80hout 61h, al;送键盘应答信号xchg ah, alout 61h, al;复位键盘pop axtest al, 80hjnz cont ;通码时处理,mov bx, addrmov bx,alcall dispinc bxinc countmov addr, bx check:cmp count,32jb cont ;判断是否溢出in al, 21hor al, 02 ;屏蔽键盘中断and al, 7fhout 21h,al ;允许打印机中断call intip cont: climov al, 20hout 20h,al ;结束键盘中断pop bxpop axiret kb

36、int endp,通码:(60h)7=0 断码:(60h)7=1,58,intip proc nearpush axpush bxpush dxclimov bx, offset messagemov addr, bxmov dx, 378hmov al, 0dhout dx, al ;输出回车mov dx, 37ahmov al, 1dh ;0001 1101out dx, al ;送选通信号jmp $+2 ;展宽选通信号mov al, 1ch ;0001 1100out dx, alpop dxpop bxpop ax ret intip endp,59,prtint proc nearp

37、ush axpush bxpush dx mov bx, addrmov al, bxmov dx, 378hout dx, alpush axmov dx, 37ahmov al, 1dhout dx, aljmp $+2mov al, 1chout dx, alpop ax,inc bxmov addr, bxcmp al, 0ahjnz returnin al, 21hor al, 80hout 21h, al ;屏蔽打印机中断 return:mov al, 20hout 20h, al ;结束打印机中断pop dxpop bxpop ax iret prtint endp,60,dis

38、p proc near ;显示扫描码push axpush cxpush dxmov ch, 2mov cl, 4 nextb: rol al, clpush axmov dl, aland dl, 0fhor dl, 30hcmp dl, 3ahjl dispitadd dl, 7 dispit:mov ah, 2int 21hpop axdec chjnz nextbmov ah, 2mov dl, ,int 21hpop dxpop cxpop axret disp endp cseg endsend start,61,4.5 BIOS和DOS基本调用 调用方法: 1、将调用参数装入指定

39、的寄存器中; 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,error,62,键盘I/O BIOS键盘中断 ( INT 16H),字符数字键 字符码为ASCII 码功能键、控制键 字符码为0,对应一个扫描码,63,DOS键盘中断 ( INT 21H),AH 功 能 调用参数

40、返回参数,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),64,例: 输入字符串到缓冲区STRINGDATA SEGMENTMAXLEN DB 32 MAXLEN DB 32 ,0, 32

41、DUP(?) ACTLEN DB ? MAXLEN DB 32 ,33 DUP(?) STRING DB 32 DUP(?) DATA ENDS ; CODE SEGMENTLEA DX,MAXLENMOV AH,0AHINT 21H CODE ENDSEND,65,显示器I/O 字符显示 ASCII字符,单色属性,前景,闪烁,背景,BL R G B I R G B,16色属性,66,BIOS显示中断 INT 10H功能号 AH=1, 2, 3, 5, 6, 7, 8, 9, 0AH, 0EH, 13H (p.158) 例:屏幕初始化或上卷 (AH=6)mov ah, 6 ;to scroll

42、 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,67,例: 在品红背景下,显示5个浅绿色闪烁的星号。MOV AH,09 MOV AL,* MOV BH,0 MOV BL,0DAH ;1101 1010 (表4.10)MOV CX,05 INT 10H,68,例: 在屏幕

43、上以红底兰字显示字符串:“WORLD SCENERY”。STRING DB WORLD SCENERYLEN_TR EQU $STRINGMOV AL,3 MOV AH,0 ;8025, 16色文本方式INT 10HMOV BP,SEG STRING MOV ES,BP MOV BP,OFFSET STRING MOV CX,LEN_STR MOV DX,0 MOV BL,41H ;0100 0001MOV AL,0 MOV AH,13H INT 10H,69,(2) DOS显示功能调用中断 INT 21H,AH 功 能 调 用 参 数2 显示一个字符(检验Ctrl-Break) DL = 字

44、符 光标跟随字符移动6 显示一个字符(不检验Ctrl-Break) DL = 字符 光标跟随字符移动9 显示字符串 DS:DX=串地址 串必须以$结束,光标跟随串移动,MESSAGE DB The sort operation is finished.,13,10,$ MOV AH,9MOV DX,SEG MESSAGEMOV DS,DXMOV DX,OFFSET MESSAGEINT 21H,70,3. 打印机I/O,71,例: 打印字符串TEXT TEXT DB Hello,everybody! COUNT EQU $TEXTMOV CX,COUNT MOV CX, COUNTMOV BX,0 MOV BX, 0 NEXT: MOV AH,5 NEXT: MOV AH, 0 MOV DL,TEXTBX MOV AL, TEXTBX INT 21H MOV DX,0INC BX INT 17HLOOP NEXT INC BXLOOP NEXT,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 网络科技 > 开发文档

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报