版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机原理与应用第4讲汇编语言北京理工大学信息与电子学院汇编程序设计提纲Ø 顺序结构程序设计Ø 分支结构程序设计Ø 循环结构程序设计汇编程序设计步骤1.分析题意,确定算法。首先分析理解题意,找出合理的算法及适当的数据结构,这是决定程序质量高低的关键。2.根据算法画出程序流程图,可以从粗到细把算法逐步的具体化。3.根据框图编写程序。4.上机调试程序。汇编程序的基本结构顺序结构循环结构分支结构子程序结构复合结构:多种程序结构的组合顺序结构程序设计安排指令的先后次序很重要。编程时,要顺序合理,避免不必要的重复操作。例1:已知某班学生的英语成绩按学号(从1开始)从小到大的
2、顺序排列在TAB表中,要查的学生的学号放在变量NO中,查表结果放在变量ENGLISH中。DATATAB NOSEGMENTDB80,85,86,71,79,96,83,56,32,66,78,84DBDB10ENGLISH?DATACODEENDSSEGMENTASSUME DS:DATA,CS:CODEBEGIN:MOV,AXAX,DATAMOVLEA MOVDSBX,TABAL,NOXLAT TABMOVMOV INTCODEENDENGLISH,ALAH,4CH 21H ENDSBEGIN分支结构程序设计?case 1 case 2case ncase 1case 2case nCASE
3、 结构IF-THEN-ELSE 结构法è利用逻辑尺实现二分支;1. 逻辑尺2. 地址跳跃表法è利用跳跃表实现多分支;法è利用条件转移指令实现二分支或多分支;3. 条件直接标志转移指令l在指令助记符中直接给出标志状态的测试条件:以CF,ZF,SF,OF和PF等5个标志的10种状态为的条件。间接标志转移指令CMP指令格式:CMP 目标操作数,源操作数功能:模拟目标减源的减法操作,影响标志寄存器,不改变目标操作数。TEST指令格式:TEST 目标操作数,源操作数功能:模拟目标与源的与操作,影响标志寄存器,不改变目标操作数。注意:p 使用CMP与SUB,TEST与AND能
4、够进行相同的转移,但CMP和TEST均不改变被的操作数,而SUB与AND则会改变目标操作数;p 负数以补码形式存放,当做为无符号数进行比较式做为无符号数进行的,因此-1高于3。以其对应的补码形(1) MOV AL,-1 MOV BL,3 SUB AL,BL JL L1(2) MOV AL,-1 MOV BL,3 CMP AL,BL JBE L1;-4送AL;由于-1小于3,即AL小于BL所以转移到L1执行;AL不变,仅仅影响标志位;由于-1作为无符号数是0FFH高于3,即AL高于BL所以顺序执行,不转移(应用:JLE)(3) MOV AL,80HMOV BL,80H AND BL,AL JNZ
5、 L1(4) MOV AL,80H MOV BL,80H TEST BL,AL JNZ L1;0送BL;因为结果为ZF=1所以顺序执行,不转移(与JNE等价);不改变BL,但模拟运算结果为0,置ZF为1;因为结果为0所以顺序执行,不转移逻辑尺例:有数组x(x1,x2,x10) 和y(y1,y2,y10),编程计算z(z1,z2,z10)z1 z2 z3 z4 z5 z6 z7 z8z9=x1 x2 x3 x4 x5 x6 x7 x8 x9x10+-+-+y1 y2 y3 y4 y5 y6 y7 y8 y9y10逻辑尺:001101011100减法加法z10=x y zlogic_ruledw
6、dw dwdwx1,x2,x3,x4,x5,x6,x7,x8,x9,x10 y1,y2,y3,y4,y5,y6,y7,y8,y9,y10 z1,z2,z3,z4,z5,z6,z7,z8,z9,z1000dch mov mov mov mov shr jc addjmpbx,cx,dx,ax,dx,010logic_rule xbx1next:subtractax, ybx; 向前shortresultsubtract:subax, ybxzbx, ax bx, 2 nextresult:mov add loop地址跳跃表例:根据AL寄存器中哪一位为1(从低位到),把程序转移到8个不同的程序分支
7、branch_tabledw dw dw dw dw dw dwdwroutine1 routine2 routine3 routine4 routine5 routine6 routine7routine8 cmp je lea shr jncjmp(寄存器间接寻址)al, 0continuebx, branch_table al, 1add1word ptrbx;逻辑右移;L:间接转移;add1: addjmp continue:routine1:routine2:bx,Ltypebranch_table cmp je mov shr jnbjmp(变址寻址)al, 0 continue
8、si, 0al, 1 add1branch_tablesi;逻辑右移;jnb=jncL:间接转移;add1:add jmpcontinue:routine1:routine2:si,Ltypebranch_table cmp je lea mov movshljnb jmp(基址变址寻址)al, 0continuebx,si,cx,al,branch_table7 * type branch_table 81;逻辑左移L:sub1word ptr;jnb=jnc间接转移bxsibranch_table;sub1: subloopcontinue:routine1:routine2:si,Lty
9、pe条件例:折半查找算法条件例:折半查找算法(1) 初始化首尾下标,low=1,high=n;(2) 若low>high,则查找失败,置CF=1,否则,计算重点:mid=(low+high)/2;(3) k与重点元素rmid比较。;若k= rmid,则查找,;若k< rmid,则转步骤(4);若k> rmid,则转步骤(5);(4) 低半部分查找:high=mid-1,返回步骤(2),继续比较;(5) 高半部分查找:low=mid+1,返回步骤(2),继续比较;条件例:折半查找算法datasegmentarraydw12,11,22,33,44,55,66,77,88,99,
10、111,222,333numberdw55low_idxdw?high_idxendsdw?datalea movdi,ax,arraynumber(ax)与第一个元素比较cmp ja lea je stc jmpchk_last:mov shl add cmp jb je stcjmpax,di+2;chk_last si, di+2exitsi存放位置(ax)第一个元素,找到cf=1 查找失败(ax)<第一个元素,未找到;exitsi,si,si,ax,di 1disi;字节数数目2; (ax)与最后一个元素比较searchexit; (ax)最后一个元素,找到; (ax)>最
11、后一个元素,未找到exitsearch:mov low_idx, 1mov bx, dimov high_idx, bx mov bx, dimid:mov cx, low_idx mov dx, high_idx cmp cx, dxjano_match add cx, dx shr cx, 1 mov si, cx shl si, 1compare:cmp ax, bx+sijeexitjahigherdec cxmov high_idx, cxjmp midhigher:inc cxmov low_idx, cxjmp midno_match: stcexit:low_idxhigh_i
12、dx0123456789101112114512555(ax)=55(si)=0ahCf=0vwxulow_idxhigh_idx177891212888(ax)=90(si)=10hCf=112112233445566778899111222333循环结构程序设计循环程序就是某段指令序列在执行时多次反复执行的程序。N条件Y N 条件YWHILE -DO结构DO-UNTIL 结构循环体循环体初始化初始化循环结构程序设计设计循环结构的基本操作:1. 初始化è设置循环的初始状态2. 循环体è循环的工作部分及修改部分条件è计数;3.、特征值、地址边界循环结构程序设计常用
13、指令1.2.LOOP,LOOPZ/LOOPE,LOOPNZ/LOOPNE;各种跳转指令;指令格式循环条件功能描述LOOPOPR(CX/ECX)0若条件满足,则转向标号所指向的指令;否则:终止循环;LOOPZ /LOOPEOPR(ZF=1)且(CX/ECX)0LOOPNZ /LOOPNE OPR(ZF=0)且(CX/ECX)0LOOP指令Ø 格式:loop标号Ø CPU执行loop指令的时候,进行两步操作:(cx)=(cx)-1;cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。LOOP指令Ø 任务1:编程计算22,结果存放在ax中。Ø 分析:设
14、(ax)=2,可计算:(ax)= (ax)*2,最后(ax)中为22的值。N*2可用N+N实现。任务1:编程计算22,结果存放在ax中。程序代码:assumecs:codecodesegmentmovaddax,2ax,axmovintax,4c00h21hcodeendendsLOOP指令Ø 任务2:编程计算23。分析:23=2*2*2,若设(ax)=2,可计算: (ax)= (ax)*2*2,最后(ax)中为23的值。N*2可用N+N实现。任务2:编程计算23。程序代码:assume cs:codecode segment mov ax,2 add ax,ax add ax,ax
15、mov ax,4c00hint 21h code ends endLOOP指令Ø 任务3:编程计算212。分析:212=2*2*2*2*2*2*2*2*2*2*2*2,若设(ax)=2,可计算:(ax)=(ax)*2*2*2*2*2*2*2*2*2*2*2,最后(ax)中为212的值。N*2可用N+N 现。实任务3:编程计算212。程序代码:assume cs:codecode segmentmov ax,2;做11次add ax,ax mov ax,4c00hint 21h code endsend按照我们的算法,计算212需要11条重复的指令add ax, ax。我们显然不希望这
16、样来写程序,这里,可用loop来简化我们的程序 程序分析:(1)标号编程计算212。程序代码:assume cs:codecode segment mov ax,2 mov cx,11在汇编语言中,标号代表一个地址,此有一个标号s 。它实际上标识了一个地址,这个地址处有一条指令:add ax,ax。s:add ax,ax loop s(2)loop sCPU 执行loop s的时候,要进行两步操作: (cx)=(cx)-1;mov ax,4c00h int 21hcode endsendcx 中的值,不为0 则转至标号s 所标识的地址处执行(这里的指令是“add ax,ax),如果为零则执行下
17、一条指令(下一条指令是mov ax,4c00h)。编程计算212。程序代码:assume cs:codecode segment mov ax,2 mov cx,11 程序分析(续):(3)以下三条指令mov cx,11s: ddd ax,ax loop s执行loop s时,首先要将(cx)减1,然后若(cx)不为0,则向前转至s处执行add ax,ax。所以,我们可以利用cxs:add ax,ax loop smov ax,4c00h int 21hcode endsend来add ax,ax的执行次数。LOOP指令Ø 用cx和loop三个要点:(1)在cx中存放循环次数;指令相
18、配合实现循环功能的(2)loop指令中的标号所标识地址要在前面;(3)要循环执行的程序段,要写在标号和loop指令的中间。循环体不能超过256字节è把BX中的二进制数以十六进制的形式显示在屏幕上基本思想如下图所示,程序流程图常见;BX=A6CE循环左移4位显示BH高4位循环左移4位显示BH低4位循环左移4位显示BL高4位循环左移4位显示BL低4位10100110110011101110101001101100110011101010011001101100111010101010011011001110用条件跳转实现循环:movmov rol mov and add cmp jl a
19、dd mov mov int decjnzch, 4cl,bx,al,al,al,al,;设置循环次数; BX循环左移4位,把高4位移至低4位rotate:4cl bl;取出BL给AL;保留AL低4位;把AL中的数转换成对应的ASCII码;09 ASCII 30H39H;程序二分支;AF ASCII41H46H,10与A的ASCII差07H; 屏显0fh30h3ahprintital,dl,ah, 21h ch07hal2printit:;若没处理完,继续循环处理rotate用LOOP指令实现循环:movpush mov rol mov and add cmp jl add mov mov i
20、nt;decpop Loopcx,cx cl,bx,al,al,al,al,4;设置LOOP循环次数rotate:4cl bl 0fh 30h3ah; BX循环左移4位,把高4位移至低4位;取出BL给AL;保留AL低4位;把AL中的数转换成对应的ASCII码;09 ASCII 30H39Hprintital,dl,ah, 21hchcx07hal2;AF ASCII 41H46H,10与A的ASCII差07H; 屏显printit:;若没处理完,继续循环处理rotate例:将正数nx array_head array_end n一个已排序的正数字数组dw dw dw dw?3,5,15,23,
21、37,49,52,65,78,9910532x ®array_head®array_end®n ®movax, nmovarray_head-2, 0ffffhmovsi, 0compare:cmparray_endsi , ax jleinsertmovbx, array_endsi movarray_endsi+2 , bx subsi, 2jmpshort compareinsert:movarray_endsi+2 , ax-135152337495265789910532例:将首地址为a 的字数组从大到小排序(冒泡排序算法,多重循环)uvwxy
22、z|256189100997866453015-11001892569976431-100991892567866453015-1100997818925666453015-1100997866189256453015-1100997866451892563015-1100997830664518925615-1100789930156645189256-110030789915-adw100,30,78,99,15,-1,66,45,189,256 mov dec movmovcx, cx di,bx,10loop1:cx0loop2:mov cmp jge xchgmovax,ax,abx
23、abx+2continue ax, abx+2abx, axcontinue:add loop mov loopbx, 2 loop2 cx, diloop1DATABUFSEGMENT;冒泡法完整程序loop2.asmDW3,-4,6,7,9,2,0,-8,-9,-10,20N=($-BUF)/2ENDSDATACODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVMOV MOV DEC MOVMOVAX,DATADS,AX CX,N CX DX,CXBX,0LOOP1:LOOP2:MOVCMP JGE XCHG MOV ADD DEC JNE MOV LOOP
24、MOV INT ENDSENDAX,BUFBXAX,BUFBX+2 L AX,BUFBX+2 BUFBX,AX BX,2CX LOOP2 CX,DX LOOP1 AH,4CH21HL:CODESTARTØ 程序运行后,BUF区中的内容如下:0000 14 00 09 00 07 00 06 00-03 00 02 00 00 00 FC FF0010 F8 FF F7 FF F6 FF 00 00-00 00 00 00 00 00 00 00Ø 20,9,7,6,3,2,0,-4,-8,-9,-10Ø 若要对N个无符号数按由大到小的顺序排列,只需将指令“JGEL
25、”改为“JAEL”即可。子程序结构及设计完整段定义伪指令(4)PROC/ENDP 定义过程伪指令格式:<过程名> PROC<过程名> ENDP功能:定义过程的起始和结束。PROC和ENDP必须成对出现。关于堆栈段定义方法1:Stack1DB TOPStack1SEGMENT256 DUP(?);256是堆栈的长度,可改变LABEL ENDSWORD单元说明语句之后,再说明一个栈顶别名,对SP在堆栈的赋值就很方便。方法2:STACK1DB STACK1SEGMENT 256 DUP(?) ENDSSTACK ;定义一个堆栈段系统会自动把段寄存器SS和栈顶寄存器SP与该堆栈
26、段之间建立相应的关系,并设置其初值。提纲Ø 子程序的说明Ø 子程序的调用和返回Ø 寄存器的保护和恢复Ø 子程序的参数传送Ø 嵌套与递归子程序Ø程序的不同部分,常用到类似的程序段,它们的功能和结构都相同,只是某些变量的赋值不同,可把 这些程序段写成子程序。Ø某些常用的特定功能的程序段,也可编制成子程序,供不同用户使用。子程序的说明过程名 PROCRET过程名 ENDPNEAR ( FAR )(1)NEAR属性:调用子程序在同一代码段中(调用)(2)FAR属性:调用子程序不在同一代码段中(调用)codesegmentmainpr
27、occall ret endpfarsubr1mainsubr1procretendpnearsubr1codeends调用调用segxsubtsubtsegx segysegysegmentproc far ret endpcall subtendssegmentcall subtends子程序的调用和返回子程序调用:隐含使用堆栈保存返回地址callnear ptrsubp(1) 保存返回地址(2) 转子程序(SP)callfarptrsubp(1) 保存返回地址(2) 转子程序(SP)(IP)(CS)(IP)子程序的调用和返回RET/RETN/RETF ImmØ近返回:RET指令
28、将SP所指向的栈顶字(断点的位移量)弹出送至指令指示器IP中,并将SP加2远返回:RET指令先弹出栈顶之值送到IP中,再弹出栈顶之值送到CS中,并再将SP加4如果返回指令后面带有立即数表示在得到返回地址之后,SP还要增加的偏移量。ØØRETRETN RETF;可能是近返回,也可能是远返回;近返回指令;远返回指令RET6;子过程返回后,(SP)(SP)+6寄存器的保护和恢复寄存器对于所有的程序都是公用的。subtproc push push push push pop pop poppopfar ax bx cxdx注意:p寄存器入栈和出栈的顺序相反。p用PUSHF和POPF
29、保护和恢复标志寄存器。dx cx bxaxretsubtendp子程序的参数传送1. 通过寄存器传送参数2. 通过器传送参数3. 通过地址表传送参数地址4. 通过堆栈传送参数或参数地址例:十进制到十六进制的转换(通过寄存器传送参数)10®16decihexsegment;assume proc push sub push call call call call jmp retendpcs: far ds ax,axdecihexmainax10®2回车换行2®16repeat:decibin crlf binihex crlfrepeat;maindecihex三
30、个子程序;endsendmainbinihexproc mov mov rol mov and add cmp jl add mov mov int dec jnz retendpnearch,cl,bx,al,al,al,al,44cl bl 0fh 30h3ahdecibinproc mov mov int sub jl cmp jg cbw xchg mov mul xchg add jmp retendpnear bx,ah,21hrotate:0newchar:1al,exit30hal, 9exitprintital,dl,ah, 21h ch7al 2printit:ax,cx,
31、 cx ax,bx,bx10bxaxrotatenewcharbinihexexit:decibincrlfproc mov mov int mov mov int retendpnear dl,ah, 21h dl,ah,21h0dh20ah2crlf例:累加数组中的元素(通过器传送参数)datasegment ary count sumendsdwdwdw1,2,3,4,5,6,7,8,9,1010?datacodemainsegment proc assume push sub push mov mov callretfarcs:code,ds:data dsax, ax ax,ds,a
32、xdataaxproaddmaincodeendp;proadd子程序endsendmainproadd proc nearpush axpush cxpush sileasi, arymovcx, countxorax, ax next:addax, siaddsi, 2loop nextmovsum,axpopsipopcxpopax retproadd endp如果数据段定义如下:datasegmentarycountsumdwdwdw1,2,3,4,5,6,7,8,9,1010?ary1 count1sum1dw dwdw10,20,30,40,50,60,70,80,90,10010
33、?dataends如果直接内存变量,那么累加数组ary和数组ary1中的元素不能用同一个子程序 proadd。例:累加数组中的元素(通过地址表传送参数地址)datasegment ary count sum table ends segment proc assume push sub push mov movmov mov mov mov call retendpdw dw dwdw1,2,3,4,5,6,7,8,9,1010?; 地址表3dup (?)data codemainfarcs:code,dsds:dataax, ax ax,ds,axdataaxtable, table+2,
34、table+4, bx,proaddoffset offset offsetoffsetary countsum; 建立地址表table ; 地址表的地址->bxmainary®0000count®001400160018sum®table®®(bx)1d2d3d4d5d6d7d8d9d10d10d55d000000140016proadd proc nearpush axpush cxpush sipush dimovsi, bx movdi, bx+2 movcx, di movdi, bx+4 xorax, axnext:addax
35、, siaddsi, 2loop nextmovdi,axpopdipopsipopcxpopax retproadd endp codeendsendmain通过堆栈传送参数或参数地址:stack segmentstackDS®ESdw100dup (?)tos label wordSS®stack endsCS®stack segmentdw100dup (?)tos label wordstack endsDSstart:ES®movax, stackSS®movss, axmovsp, offset tospushdsCS®s
36、ubax, axpushax例:累加数组中的元素(通过堆栈传送参数地址)datasegment ary count sumendsdw dwdw1,2,3,4,5,6,7,8,9,1010?datastacksegmentdwtos100labeldup (?)wordstackendscode1mainsegment proc assumefarcs:code1, ds:data,ss:stackstart:mov mov movax,ss,sp,stack ax offsettosmov mov mov push mov push mov pushax,ds,bx, bx bx, bx b
37、x, bxdataaxoffsetary4ch 中断出现前的程序(sp)®offsetcountoffsetsumcallfarptrproaddcode1endsretmain endppushdssubax, axpushax(ip)(cs)0016001400000(ds)(sp)®(bp)®®(bp)+6®(bp)+8®(bp)+0ah®(di)(si)(cx)(ax)(bp)(ip)(cs)0016001400000(ds)xorax, ax next:addax, siaddsi, 2loop nextmovdi
38、,axpopdipopsipopcxpopaxpopbpret6 proadd endpcode2segmentassume cs:code2proaddproc farpush bpmovbp, sppush axpush cxpush sipush dimovsi,bp+0ah movdi,bp+8movcx,dimovdi,bp+6code2endsend start结构伪操作STRUC:定义一种可包含不同类型数据的结构模式格式:结构名STRUC字段名1 字段名2 字段名3ENDSDBDW DD?结构名例:学生个人信息STUDENT_DATANAME ID AGE DEPSTUDENT_
39、DATASTRUC DB DW DB DBENDS50? 10DUP(?)DUP(?)例:累加数组中的元素(通过堆栈传送参数地址)code2segmentassumecs:code2proaddprocendpfarproaddcode2endsendstartstack_strcstrucsave_bpdw? save_cs_ipdw2 dup(?) par3_addrdw?par2_addrdw?par1_addrdw?stack_strcends(sp)®(bp)®par3_addr par2_addrpar1_addr(di)(si)(cx)(ax)(bp)(ip)(cs)0016001400000(ds)proadd proc farpush bpmovbp, sppush axpush cxpush sipush dimov si, bp.par1_addr mov di, bp.par2_addr mov cx, dimov di, bp.par3_addr xor ax, axnext:addax, siaddsi, 2loop
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- (8)晶胞和物质结构与性质综合-2025年高考化学二轮复习
- 内蒙古兴安盟科尔沁右翼前旗第二中学2024-2025学年高三上学期第二次月考语文试题
- 河南省通许县2024-2025学年上期二次月考八年级物理试题(人教版)
- 安徽省蚌埠市五河县城区联考 2024-2025学年七年级上学期12月期末道德与法治试题(含答案)
- 医学教程 胆脂瘤型中耳炎患者的护理查房2讲课
- 2025届广东省普通高中高三上学期第二次调研考试物理试题(含答案解析)
- 《人生价值》课件
- 《产科超声之科普讲》课件
- 2024年高一上学期期末数学考点《集合及其运算》含答案解析
- 固态电池生产(1GWH)项目可行性研究报告模板-立项拿地
- 中外园林史第七章-中国近现代园林发展
- 崴脚护理课件教程
- 人卫慕课《走进肺功能》试题答案
- 2022年保育师理论知识考试题库(含答案)
- ISO9001-2015质量管理体系要求培训教材
- 工程全过程造价咨询服务方案(技术标)
- 小区保洁投标方案
- 新汇科电解质质控记录
- 钻孔桩钢护筒跟进施工方案
- 建筑施工安全规范
- 安全生产条件和设施综合分析报告
评论
0/150
提交评论