汇编-循环与分支程序设计.ppt
文本预览下载声明
基址变址寻址实现跳跃表法 …… cmp al, 0 je continue lea bx, branch_table mov si, 7 * type branch_table mov cx, 8 L: shl al, 1 ;逻辑左移 jnc sub1 jmp word ptr [bx][si] ;段内间接转移 sub1: sub si, type branch_table ;(si)-2 loop L continue: …… routine1: …… routine2: …… * 小 结 顺序、分支和循环是程序的3种基本控制结构。 程序隐含以顺序方式执行,除非遇到转移类指令。 实现多分支结构的主要方法有逻辑分解、地址表和转移表等,地址表较为常用。 循环程序的控制方法主要包括计数控制、条件控制、开关控制与逻辑尺控制等。 带重复前缀的串操作指令适用于处理连续的内存单元。 * 作业: Page194 5.17~5.2 3 * 例5.5:有数组 x(x1,x2,……,x10) 和 y(y1,y2,……,y10), 编程计算 z(z1,z2,……,z10) z1 = x1 + y1 z2 = x2 + y2 z3 = x3 - y3 z4 = x4 - y4 z5 = x5 - y5 z6 = x6 + y6 z7 = x7 - y7 z8 = x8 - y8 z9 = x9 + y9 z10= x10 + y10 逻辑尺:0 0 1 1 0 1 1 1 0 0 1 减法 0 加法 X1+Y1 X2+Y2 X3-Y3 余类推 * 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 00dch ;0000,0000,1101,1100 …… mov bx, 0 mov cx, 10 mov dx, logic_rule next: mov ax, x[bx] shr dx, 1 jc subtract add ax, y[bx] jmp short result ; 向前引用 subtract: sub ax, y[bx] result: mov z[bx], ax add bx, 2 loop next …… * 总结:这种设置逻辑尺的方法非常有用。例如要传输一批数据(定义为一个数组),该数组中含有多个0元素,为了节省存储空间和传输时间,可以选用合适的数据结构。比如可以使用压缩数据及逻辑尺的方法,把所有元素按下标顺序排列,并各用1个bit表示。设0元素用0表示,非0元素用1表示。存储时只需保存非0元素(压缩数组)和逻辑尺,当进行数据传输时,若逻辑尺相应位为1,则从压缩数组中取到非0数据并传送。若逻辑尺相应位为0时,只送一个标志,在接收方直接生成数字0,这样可以提高传输效率 * 例5.6 试编制一程序:从键盘输入一行字符,要求第一个键入的字符必须是空格符,如不是,则退出程序;如是,则开始接收键入的字符并顺序存放在首地址为BUFFER的缓冲区中(空格符不存入),直到接收到第二个空格符时退出程序。 20H 20H L * datarea segment buffer db 80 dup(?) flag db ? datarea ends prognam segment assume cs:prognam,ds:datarea start: mov ax,datarea mov ds,ax lea bx,buffer mov flag,0 next: mov ah,1 int 21h test flag,01h jnz
显示全部