汇编语言程序和高级语言程序一样,有顺序、分支、循环、子程序四种结构形式。
计算机程序在执行过程中,可以改变程序的执行顺序,根据一定的条件进行转移,使程序完成更复杂的功能。汇编语言提供了无条件转移指令和条件转移指令。
一个分支程序的例子
示例 设计分支程序,实现下列公式计算。X、Y为字型。假设X单元中保存三个数:9,-6,34,分别作判断和计算。
设计思路:
(1) 在数据段中定义2个字型变量X、Y,均为带符号数;
(2) 在X单元中依次取出三个数分别作判断,根据X的大小作分支转移;
(3) 采用寄存器相对寻址方式(MOV AX,X[SI])取出X的三个值;
(4) 标号OUT1是各路分支的公共出口。
程序框图:
代码:
;a.asm 用正常程序格式编写分支程序 data segment x dw 9,-6,34 y dw 3 dup(?) ;定义一个变量,占3的字,每个字的内容未知 data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov cx,3 ;循环三次 mov si,0 let0: mov ax,x[si] ;取出X cmp ax,0 ;X ≥0 ? jge let1 ;是,转到let1 mov bx,ax ;否,计算X*X imul bx jmp out1 ;跳到公共出口out1 let1: cmp ax,10 ;X ≥10 ? jge let2 ;是,转到let2 sal ax,1 ;否,计算2X+3 add ax,3 jmp out1 ;跳到公共出口out1 let2: mov bl,6 ;计算X/6 idiv bl ;商在al,余数在ah out1: mov y[si],ax ;保存Y add si,2 dec cx ;CX-1 cmp cx,0 jnz let0 ;CX≠0转移到let0 mov ah,4ch ;CX=0,程序结束 int 21h code ends end start
条件转移非常多,但基本上看见名字就能明白,可自行百度查阅。
示例2
示例 设计分支程序。计算 Y=5X-18,如果结果为负,求绝对值。并显示十进制结果。
设计思路:
(1) 用数据段保存X、Y。为简便,X定义为字节,Y定义为字;
(2) 用符号位SF判断运算结果的正负,为负数则求补(绝对值),如果是正数,直接保存结果;
(3) 采用将AX中的结果除以10、取得余数的方法获得结果的十进制数;
(4) 将余数变为ASCII码,用DOS中断调用的2号功能显示出来;
(5) 用9号功能显示提示信息。
程序框图:
代码:
;b.asm 计算Y=5X-18,用正常程序格式 data segment x db -6 ;Define Byte,定义一个字节, y dw ? ;字,?表示内容不确定 cc db 0ah,0dh,'Y=$' data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov al,5 ;5X imul x sub ax,18 ;-18 jns let0 ;结果不为负则转移 neg ax ;结果为负,求绝对值 let0: mov y,ax ;保存结果 ;将ax中的二进制数变为十进制数,并显示 mov cx,0 mov bx,10 let1: mov dx,0 inc cx ;统计余数个数 idiv bx ;AX/10,商在AX,余数在DX push dx ;保存余数 cmp ax,0 ;商为0,则退出循环 jnz let1 mov dx,offset cc ;9号功能显示提示 mov ah,9 int 21h let2: ;循环执行cx次,显示十进制结果 pop ax ;将余数弹入ax add ax,0030h ;调整为ASCII码 mov dl,al ;2号功能,显示一个字符 mov ah,2 int 21h dec cx cmp cx,0 jnz let2 mov ah,4ch int 21h code ends end start