《汇编语言程序设计基础》由会员分享,可在线阅读,更多相关《汇编语言程序设计基础(18页珍藏版)》请在金锄头文库上搜索。
1、第四章第四章 汇编语言程序设计基础汇编语言程序设计基础基本程序结构:基本程序结构:顺序结构顺序结构 循环结构循环结构分支结构分支结构 子程序结构子程序结构4.14.1 循环程序设计循环程序设计例例 1. 把把 BX 中的二进制数以十六进制的形式显示在屏幕上。中的二进制数以十六进制的形式显示在屏幕上。movmov ch,ch, 4 4rotate:rotate: movmov clcl, , 4 4rolrol bx,bx, clclmovmov al,al, blblandand al,al, 0fhadd0fhadd al,al, 30h30h ;0-9 ASCII 30H-结结束束初始化初
2、始化循环的初始状态循环的初始状态循循 环环 体体循环的工作部分及修改部分循环的工作部分及修改部分计数控制计数控制 特征值控制特征值控制 地址边界控制地址边界控制修改部分修改部分循环控制循环控制条件条件Y YN N1BX23439Hcmpcmp al,al, 3ah3ahjl jl printitprintitaddadd al,al, 7h7h ;A-F ASCII 41H-46Hprintit:printit: movmov dl,dl, alalmovmov ah,ah, 2 2intint 21h21hdecdec chchjnzjnz rotaterotate4.24.2 分支程序设计
3、分支程序设计(1)两路分支结构 (2)多路分支结构 (1)逻辑尺控制)逻辑尺控制 (2)条件控制)条件控制(3)地址跳跃表)地址跳跃表 TABLE DW ONE, TWO, THREE JMP TABLESI 1000 ONE: 2000 TWO: 3000 THREE: 例。例。 设有数组设有数组 x(x1, , x10)和和 y(y1, , y10),编程计算,编程计算z1=x1 y1z2=x2 y2z3=x3 y3z4=x4 y4z5=x5 y5z6=x6 y6z7=x7 y7z8=x8 y8判定条件判定条件ABABX判定条件判定条件case 1 case 2 case n?case 1
4、 case 2 case 3逻辑尺:逻辑尺:0 0 1 1 0 1 1 1 0 01 减法减法 0 加法加法z9=x9 y9z10=x10 y10 x x dwdw x1,x2,x3,x4,x5,x6,x7,x8,x9,x10x1,x2,x3,x4,x5,x6,x7,x8,x9,x10y y dwdw y1,y2,y3,y4,y5,y6,y7,y8,y9,y10y1,y2,y3,y4,y5,y6,y7,y8,y9,y10z z dwdw z1,z2,z3,z4,z5,z6,z7,z8,z9,z10z1,z2,z3,z4,z5,z6,z7,z8,z9,z10logic_rulelogic_rul
5、e dwdw 00dch00dchmovmov bx,bx, 0 0movmov cx,cx, 1010movmov dx,dx, logic_rulelogic_rulenext:next: movmov ax,ax, xbxxbxshrshr dx,dx, 1 1jcjc subtractsubtractaddadd ax,ax, ybxybxjmpjmp shortshort resultresult ; 向前引用向前引用 subtract:subtract: subsub ax,ax, ybxybxresultresult: : movmov zbx,zbx, axaxaddadd b
6、x,bx, 2 2looploop nextnext4.34.3 子程序的设计方法子程序的设计方法过程(子程序)定义伪操作过程(子程序)定义伪操作procedure_nameprocedure_name PROCPROC NEARNEAR ( ( FARFAR ) )procedure_nameprocedure_name ENDPENDP(1 1)NEARNEAR 属性:属性:调调用程序和子程序在同一代用程序和子程序在同一代码码段中段中(段内(段内调调用)用)(2 2)FARFAR 属性:属性:调调用程序和子程序不在同一代用程序和子程序不在同一代码码段中段中(段(段间调间调用)用)保存与恢复
7、寄存器保存与恢复寄存器subtsubt procproc farfarpushpush axaxpushpush bxbxpushpush cxcxpushpush dxdx.poppop dxoppop cxcxpoppop bxbxpoppop axaxretretsubtsubt endpendp子程序的调用和返回子程序的调用和返回子程序调用(中断调用):隐含使用堆栈保存返回地址子程序调用(中断调用):隐含使用堆栈保存返回地址callcall nearnear ptrptr subpsubp (1) 保存返回地址保存返回地址(2) 转子程序转子程序 (IP)(IP) subpsubp 的
8、偏移地址的偏移地址callcall farfar ptrptr subpsubp (1) 保存返回地址保存返回地址(2) 转子程序转子程序(CS)(CS) subpsubp 的段地址的段地址 (IP)(IP) subpsubp 的偏移地址的偏移地址INTINT n n (n n : 中断类型号)中断类型号) (1) 保存现场和返回地址(保存现场和返回地址(FLAGS,CS,IP 入栈)入栈)(2) 转中断处理程序转中断处理程序(IP)(IP) (n*4)(n*4)(CS)(CS) (n*4+2)(n*4+2)子程序返回:子程序返回:(1)retret (返回地址出栈)(返回地址出栈) (2)i
9、retiret (IP,CS,FLAGS 出栈)出栈)子程序的参数传送子程序的参数传送(IP)(SP)(IP)(SP)(CS)intint 21H21H(IP)(SP)(CS)(FLAGS)(1)通过寄存器传送参数)通过寄存器传送参数 (2)通过存储区传送参数)通过存储区传送参数*子程序和子程序和调调用程序在同一程序模用程序在同一程序模块块中,中,则则子程序可子程序可 直接直接访问访问模模块块中的中的变变量。量。 *子程序和子程序和调调用程序不在同一程序模用程序不在同一程序模块块中,中,则则有两种有两种 传传送方式:建立公共数据区和使用外部符号。送方式:建立公共数据区和使用外部符号。 (3)通
10、过地址表传送参数地址)通过地址表传送参数地址(4)通过堆栈传送参数或参数地址)通过堆栈传送参数或参数地址 例例. 十进制到十六进制的转换程序(十进制到十六进制的转换程序(通通过过寄存器寄存器传传送送变变量量)DecihexDecihexsegmentsegment ; ; 1016assumeassume cs:cs: decihexdecihexmainmain procproc farfarpushpush dsdssubsub ax,ax, axaxpushpush axaxrepeat:repeat: callcall decibindecibin ; ; 102 callcall c
11、rlfcrlf callcall binihexbinihex ; ; 216 callcall crlfcrlf jmpjmp repeatrepeatretretmainmain endpendpDecibinDecibin procproc nearnear ; ; 102 movmov bx,bx, 0 0newchar:newchar: movmov ah,ah, 1 1intint 21h21hsubsub al,al, 30h30h jl jl exitexit ; ; 9 退出退出 cbwcbwxchgxchg ax,ax, bxbxmovmov cx,cx, 10d10dmulmul cxcxxchgxchg ax,ax, bxbxaddadd bx,bx, axaxjmpjmp newcharnewcharexit:exit: retretdecibindecibin endpbinihexendpbinihex procproc nearnear ; ; 216 movmov ch,ch, 4 4rotate:rotate: movmov cl,cl, 4 4rolrol bxbx, , clclmovmov