例题5.4从键盘上输入0到9中任一自然数,求其 方值,若输入数据不是0-9,显示“INPUT ERROR!”。 分析: 求一个数的立方值可以用乘法运算实现,也可以造 一个立方表,运行时查表实现,此题采用查表法, 对于每个键入的X,从字单元TAB+2×X之中取出 的数据即是其立方值。注意键盘输入数字与ASCII。 码以及原值的对应关系。 11
例题5.4 从键盘上输入0到9中任一自然数,求其立 方值,若输入数据不是0-9,显示“INPUT ERROR! ” 。 分析: 求一个数的立方值可以用乘法运算实现,也可以造 一个立方表,运行时查表实现 运行时查表实现,此题采用查表法 此题采用查表法, 对于每个键入的X,从字单元TAB+2×X之中取出 的数据即是其立方值。注意键盘输入数字与ASCII 码以及原值的对应关系 。 11
程序如下 DATA SEGMENT CMP AL,'0' NPUT DB“PLEASE INPUT X(O9):$” JB LERR TAB DW0,1,8,27,64,125,216,343,512,729 CMP AL,'9 XDBP LA LERR YDWP AND AL,OFH INERR DB ODH,OAH,INPUT MOV X,AL ERRORI$ ADD AL,AL DATA ENDS MOV BL,AL CODE SEGMENT MOV BH,0 ASSUME MOV AX,TABB闪 CS:CODE,DS:DATA,SS:STACK MOV Y,AX BEGIN:MOV AX.DATA EXIT:MOV AH,4CH MOV DS,AX INT 21H MOV DX,OFFSET INPUT LERR:MOV DX,OFFSET INERR MOV AH,9 MOV AH,9 INT 21H INT 21H MOV AH,1 JMP EXIT CODE ENDS INT 21H END BEGIN 12
程序如下 DATA SEGMENT INPUT DB “PLEASE INPUT X(0...9):$” TAB DW 0,1,8,27,64,125,216,343,512,729 CMP AL, '0' JB LERR CMP AL, '9' X DB ? Y DW ? INERR DB 0DH,0AH,“INPUT “ LA LERR AND AL, 0FH MOV X, AL ERROR!$ “ ADD AL AL DATA ENDS CODE SEGMENT ADD AL, AL MOV BL, AL MOV BH, 0 MOV AX TAB[BX] ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN: MOV AX, DATA MOV DS AX MOV AX, TAB[BX] MOV Y, AX EXIT: MOV AH, 4CH MOV DS, AX INT 21H MOV DX, OFFSET INPUT MOV AH, 9 INT 21H INT 21H LERR: MOV DX,OFFSET INERR MOV AH,9 INT 21H INT 21H MOV AH, 1 INT 21H INT 21H JMP EXIT CODE ENDS END BEGIN 12
5.2.2多路分支 1)用二路分支实现多路分支 AL←-X 例题5.5 任意给定X值(-128≤X≤127), 当X>0 Y= 当X=0 AL>≥0 -1 当X<0 AL-OFFH 分析:假定X=-18,且存 AL←- 放在X单元中,函数值Y存 放在Y单元。这是一个三路分 支结构,可以转化为二路分 支结构,只是在二路分支中在 Y←-AL 比较一次而已。流程如图5.3所示。 图53例5.5程序流程图 ●●● ●●● 13
5.2.2多路分支 1)用二路分支实现多路分支 例题5.5 任意给定X值(-128≤X≤127), AL←X 例题5.5 任意给定X值(-128≤X≤127), 1 当X>0 Y= 0 当X=0 AL≥0 Y= 0 当X=0 -1 当X<0 分析:假定X=-18,且存 AL≥0 AL>0 AL=0FFH 分析:假定X=-18,且存 放在X单元中,函数值Y存 AL←1 放在Y单元。这是一个三路分 支结构,可以转化为二路分 支结构,只是在二路分支中在 比较一次而已。流程如图5.3所示。 图5 3 例5 5程序流程图 Y←AL 图5.3 例5.5程序流程图 13
DATA SEGMENT X DB-18 Y DB DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX MOV AL,X CMP AL,0 ;此处可用SUB AL,0或ORAL,AL ;或AND AL,AL替代 JGE BIGE MOV AL,OFFH (AL)<0,AL←--1 JMP OUTY ;使用无条件转移指令,保障同一出口 BIGE:JE OUTY (AL)=0 MOV AL,1 (AL)>0,AL←-1 OUTY:MOVY,AL MOV AH,4CH;返回DOS INT 21H CODE ENDS ENDS START 14
DATA SEGMENT X DB -18 Y DB ? DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: MOV AX, DATA MOV DS AX MOV DS, AX MOV AL, X CMP AL, 0 ;此处可用SUB AL,0或OR AL,AL ;或AND AL,AL替代 JGE BIGE MOV AL, 0FFH ;(AL)<0,AL←-1 JMP OUTY ;使用无条件转移指令 使用无条件转移指令,保障同 出一 口 BIGE:JE OUTY ;(AL)=0 MOV AL, 1 ;(AL)>0,AL←1 OUTY:MOV Y, AL MOV AH, 4CH ;返回DOS INT 21H CODE ENDS ENDS START 14
2)用跳转表实现多路分支 表首址SUB1L 表首址 SUBI H SUBI L 为了实现多路分支,程序中常用跳转表形式。 JMP SUBI 例如某程序有n路分支,每路分支的入口地址分别 SUB2 L SUBI H 为SUB1、SUB2、..、SUBn。把这些分支程序的入 口地址组成一个表,叫跳转表。表内每2个字节存 SUB2 H 放1个入口地址的偏移量,也可以存放若干跳转指 令,如图5.4所示,这时用无条件转移指令,且每 条指令的目标代码长度一致。 这类程序的设计关键是求表地址: 表地址=表首址+偏移量 SUBn L 对于图5.6(a), E9 JMP 表地址=表首址+(k-1)*2 SUBn (k为1,,n) SUBn H 对于图5.6(6), 表地址=表首址+(k-1)*3 SUBn H (k为1,.,n) 图5.4跳转表数据存放形式
2)用跳转表实现多路分支 表首址 SUB1 L 表首址 E 9 为了实现多路分支,程序中常用跳转表形式。 例如某程序有n路分支,每路分支的入口地址分别 为SUB1、SUB2、 、SUBn。把这些分支程序的入 SUB1 H SUB2 L JMP SUB1 SUB1 L SUB1 H 为SUB1、SUB2、…、SUBn。把这些分支程序的入 口地址组成一个表,叫跳转表。表内每2个字节存 放 1个入口地址的偏移量,也可以存放若干跳转指 SUB2 H 放 1个入口地址的偏移量,也可以存放若干跳转指 … 令,如图5.4所示,这时用无条件转移指令,且每 条指令的目标代码长度一致。 这类程序的设计关键是求表地址: …… …… 这类程序的设计关键是求表地址: 表地址 = 表首址 + 偏移量 对于图5.6(a), SUBn L … 对于图5.6(a), E 9 表地址 = 表首址 + (k - 1) * 2 (k为1, …,n) 对于图5.6(b), SUBn H E 9 JMP SUBn 对于图5.6(b), 表地址 = 表首址 + (k - 1) * 3 (k 为 1,…,n) SUBn H (k 为 1,…,n) 图5.4 跳转表数据存放形式 15