题目:从键盘上读入一个十进制数X,根据以下条件求Y,并以十六进制输出。
当X=3时,Y=X *X +X; 当X=4时,Y=X*X-2X; 当X=5时,Y=X*X; 当X=6时,Y=X*X/2
程序如下:
DATA SEGMENT
X DB ?
Y DB 2 DUP(?), '$'
STR1 DB 'PLEASE INPUT X: $'
STR2 DB 0AH, 0DH, 'THE RESULT IS: $'
STR3 DB 0AH, 0DH, 'SORRY! YOU INPUT IS INVALID! $'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
BEGIN: MOV AX, DATA
MOV DS, AX
MOV DX, OFFSET STR1 ; 显示提示字符
MOV AH, 09H
INT 21H
MOV AH, 01H ; 获取输入(ASCII码形式存入AL)
INT 21H
CMP AL, 33H ; 当输入==3时(ASCII码为33H时)跳转到CASE1
JE CASE1
CMP AL, 34H ; 当输入==4时(ASCII码为34H时)跳转到CASE2
JE CASE2
JMP CONTINUE ; 由于条件转移的距离只能为-128~+127个字节,所以此处设转移点
CASE1: AND AL, 0FH ; 屏蔽AL高四位(把读入的ASCII码转变为数字)
MOV X, AL
MOV BL, X
MUL BL ; BL * AL 结果存入AX中
ADD AL, X ; 低四位加上X (此时低四位即为最终的16进制结果)
MOV AH, AL ; 令高8位等于低8位
AND AH, 0F0H ; 屏蔽AH的低四位(保留十位数字)
MOV CL, 4 ; CL为右移位数
SHR AH, CL ; 逻辑右移4位,使得AH的低四位变为高四位,高四位置0
AND AL, 0FH ; 屏蔽AL低四位(保留个位数字)
CMP AL, 0AH ; 判断AL与0AH的关系
JB CASE1_A ; 如果AL < 0AH,则跳转到CASE_1A
ADD AL, 07H ; 否则将AL加上07H(转到字母所对应的ASCII码)
CASE1_A: MOV DI, OFFSET Y ; 把Y的偏移量赋给DI
ADD DI, 1 ; DI加1,指向Y的高地址部分(Y有两个字节)
ADD AL, 30H ; 将AL加30H使数字对应上相应的ASCII码
MOV [DI], AL ; 把AL的值赋给DI所指向的地址
DEC DI ; DI减1(向低地址移动1个字节)
CMP AH, 0AH ; 判断AH与0AH的关系
JB CASE1_B ; 如果AH < 0AH,则跳转到CASE_1B
ADD AH, 07H ; 否则将AH加上07H(转到字母所对应的ASCII码)
CASE1_B: ADD AH, 30H ; 将AH加30H使数字对应上相应的ASCII码
MOV [DI], AH ; 把AH的值赋给DI当前所指向的地址
JMP SHOW ; 无条件跳到SHOW处
CASE2: AND AL, 0FH ; CASE2过程与CASE1类似,注释略
MOV X, AL
MOV BL, X
MUL BL
SUB AL, X ; 两次减去X(借位自动完成)
SUB AL, X
MOV AH, AL
AND AH, 0F0H
MOV CL, 4
SHR AH, CL
AND AL, 0FH
CMP AL, 0AH
JB CASE2_A
ADD AL, 07H
CASE2_A: MOV DI, OFFSET Y
ADD DI, 1
ADD AL, 30H
MOV [DI], AL
DEC DI
CMP AH, 0AH
JB CASE2_B
ADD AH, 07H
CASE2_B: ADD AH, 30H
MOV [DI], AH
JMP SHOW
CONTINUE: CMP AL, 35H ; 当输入==5时(ASCII码为35H时)跳转到CASE3
JE CASE3
CMP AL, 36H ; 当输入==6时(ASCII码为36H时)跳转到CASE4
JE CASE4
MOV DX, OFFSET STR3 ; 当输入无效时
MOV AH, 09H
INT 21H
JMP OVER
CASE3: AND AL, 0FH ; 类似,注释略
MOV X, AL
MOV BL, X
MUL BL
MOV AH, AL
AND AH, 0F0H
MOV CL, 4
SHR AH, CL
AND AL, 0FH
CMP AL, 0AH
JB CASE3_A
ADD AL, 07H
CASE3_A: MOV DI, OFFSET Y
ADD DI, 1
ADD AL, 30H
MOV [DI], AL
DEC DI
CMP AH, 0AH
JB CASE3_B
ADD AH, 07H
CASE3_B: ADD AH, 30H
MOV [DI], AH
JMP SHOW
CASE4: AND AL, 0FH
MOV X, AL
MOV BL, X
MUL BL
MOV BL, 2
DIV BL ; 商在AL中,余数在AH中(此处不考虑余数)
MOV AH, AL
AND AH, 0F0H
MOV CL, 4
SHR AH, CL
AND AL, 0FH
CMP AL, 0AH
JB CASE4_A
ADD AL, 07H
CASE4_A: MOV DI, OFFSET Y
ADD DI, 1
ADD AL, 30H
MOV [DI], AL
DEC DI
CMP AH, 0AH
JB CASE4_B
ADD AH, 07H
CASE4_B: ADD AH, 30H
MOV [DI], AH
JMP SHOW
SHOW: MOV DX, OFFSET STR2 ; 显示提示字符串
MOV AH, 09H
INT 21H
MOV DX, OFFSET Y ; 显示结果
MOV AH, 09H
INT 21H
MOV DL, 'H'
MOV AH, 02H
INT 21H
OVER: MOV AH, 4CH ; 中止
INT 21H
CODE ENDS
END BEGIN
过了几天我再看的时候就有些问题了,感觉太繁琐了,应该定义一个子程序,调用就会简单许多了。算了,第一个汇编程序,就留作纪念好了