预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共17页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

第四章汇编语言程序设计基础 基本程序结构: 顺序结构循环结构 分支结构子程序结构 …… 4.1循环程序设计 结 束 初始化 循环的初始状态 循环体 循环的工作部分及修改部分 计数控制 特征值控制 地址边界控制 修改部分 循环控制 条件 Y N 例1.把BX中的二进制数以十六进制的形式显示在屏幕上。 1 BX 2 3 4 movch,4 rotate:movcl,4 rolbx,cl moval,bl andal,0fh addal,30h;’0’-’9’ASCII30H-39H cmpal,3ah jlprintit addal,7h;’A’-’F’ASCII41H-46H printit:movdl,al movah,2 int21h decch jnzrotate A B X 判定条件 … 4.2分支程序设计 判定条件 A B (1)两路分支结构(2)多路分支结构 (1)逻辑尺控制(2)条件控制 ? ? case1case2case3 case1case2casen (3)地址跳跃表 TABLEDWONE,TWO,THREE JMPTABLE[SI] … 1000 ONE:… 2000 TWO:… 3000 THREE:… 例。设有数组x(x1,…,x10)和y(y1,…,y10),编程计算 z1=x1+y1 z2=x2+y2 z3=x3-y3 逻辑尺:0011011100 1减法 0加法 z4=x4-y4 z5=x5-y5 z6=x6+y6 z7=x7-y7 z8=x8-y8 z9=x9+y9 z10=x10+y10 xdwx1,x2,x3,x4,x5,x6,x7,x8,x9,x10 ydwy1,y2,y3,y4,y5,y6,y7,y8,y9,y10 zdwz1,z2,z3,z4,z5,z6,z7,z8,z9,z10 logic_ruledw00dch …… mov bx,0 mov cx,10 mov dx,logic_rule next:mov ax,x[bx] shr dx,1 jcsubtract addax,y[bx] jmpshortresult;向前引用 subtract:sub ax,y[bx] result:movz[bx],ax addbx,2 loopnext 4.3子程序的设计方法 过程(子程序)定义伪操作 procedure_namePROCNEAR(FAR) …… procedure_nameENDP (1)NEAR属性:调用程序和子程序在同一代码段中 (段内调用) (2)FAR属性:调用程序和子程序不在同一代码段中 (段间调用) ●保存与恢复寄存器 subtprocfar pushax pushbx pushcx pushdx ...... popdx popcx popbx popax ret subtendp ●子程序的调用和返回 子程序调用(中断调用):隐含使用堆栈保存返回地址 (IP) (SP)→ callnearptrsubp (1)保存返回地址 (2)转子程序 (IP)←subp的偏移地址 callfarptrsubp (IP) (SP)→ (CS) (1)保存返回地址 (2)转子程序 (CS)←subp的段地址 (IP)←subp的偏移地址 int21H INTn(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)通过堆栈传送参数或参数地址 例.十进制到十六进制的转换程序(通过寄存器传送变量) Decihex segment;10→16 assumecs:decihex main proc far push ds sub ax,ax push ax repeat: calldecibin;10→2 callcrlf callbinihex;2→16 callcrlf jmp repeat ret main endp Decibin procnear;10→2 mov