50 编写程序,从键盘上输入一个无符号字整数,用“四进制”格式输出它的值
(也就是,每2位二进制看作一位四进制数,使用数字0~3)。 答: INCLUDE YLIB.H
DATA SEGEMNT
MESS1 DB 0DH, 0AH, ‘Input a number please : $’
MESS2 DB 0DH, 0AH, ‘The number in quardri_system is: $’ DATA ENDS CODE SEGMENT
ASSUME CS: CODE, DS: DATA START:
MOV AX, DATA MOV DS, AX LEA DX, MESS1
CALL READDEC ;输入一个无符号整数 MOV BX, AX ;转存到BX LEA DX, MESS2 MOV AH, 9 INT 21H ;输出前导信息 MOV CX, 8 ONE: ROL BX, 1 ROL BX, 1 ;最高2位移到最低位 MOV DL, BL ;转存到DL AND DL, 0000 0011B ;保留最低2位
OR DL, 30H ;转换成ASCII代码 MOV AH, 2 INT 21H ;输出 LOOP ONE CALL CRLF
MOV AX, 4C00H
INT 21H CODE ENDS END START
51编写程序,把一个30个元素的有符号字数组ARRAY按照各元素的正负分别送
入数组P和M,正数和零元素送P数组,负数送M数组。 答: DATA SEGEMNT
ARRAY DW 30 DUP(?) ;汇编之前置入数据
EXIT: CODE ADD DI, 2
LOOP LOOPOUT MOV AX, 4C00H INT 21H ENDS END START
52 缓冲区BUFFER中存放有字符串,以0为结束标志。编写程序,把字符串中的
大写字母转换成小写字母。 答: DATA SEGEMNT
BUFFER DB ‘A String for Test.’, 0 DATA ENDS CODE SEGMENT
ASSUME CS: CODE, DS: DATA START:
MOV AX, DATA MOV DS, AX LEA BX, BUFFER ;BUFFER缓冲区指针 ONE: MOV AL, [BX] ;从缓冲区取出一个字符 AND AL, AL
JZ QUIT ;为零,处理完成 CMP AL, ‘A’ JB NEXT CMP AL, ‘Z’
P DW 30 DUP(?)
M DW 30 DUP(?) DATA ENDS CODE SEGMENT
ASSUME CS: CODE, DS: DATA START:
MOV AX, DATA MOV DS, AX LEA BX, ARRAY ;ARRAY数组指针 MOV SI, 0 ;P数组指针 MOV DI, 0 ;M数组指针 MOV CX, 30 ONE: MOV AX, [BX] ;从ARRAY数组取出一个数据 AND AX, AL JGE PLUS ;正数、零转PLUS MINUS: MOV M[DI], AX ;负数存入M数组 ADD DI, 2 JMP NEXT PLUS: MOV P[SI], AX ;正数、零存入P数组 ADD SI, 2 NEXT: ADD BX, 2 LOOP ONE
MOV AX, 4C00H INT 21H CODE ENDS END START
JA NEXT ADD AL, ‘a’-‘A’ MOV [BX], AL NEXT: INC BX JMP ONE QUIT: MOV AX, 4C00H INT 21H CODE ENDS END START
53 编写程序,从键盘上输入无符号字整数X,Y的值,进行X+Y的运算,然后按
以下格式显示运算结果和运算后对应标志位的状态。 SUM=XXXX
ZF=Y,OF=Y,SF=Y,CF=Y
(其中X为十进制数字,Y为0或1) 答: INCLUDE YLIB.H CODE SEGMENT
ASSUME CS: CODE
MESS1 DB 0DH, 0AH, ‘Input a unsigned integer please : $’
MESS2 DB 0DH, 0AH, ‘SUM=$’ MESS3 DB 0DH, 0AH, ‘ZF=’ ZF DB ?
DB ‘, OF=’ OF DB ?
DB ‘, SF=’ SF DB ?
DB ‘, CF=’ CF DB ?
DB 0DH, 0AH, ‘$’ START:
PUSH CS POP DS LEA DX, MESS1 CALL READDEC MOV CX, AX ;输入X
LEA DX, MESS1
CALL READDEC ;输入Y ADD AX, CX ;求和
PUSHF ;保留标志位状态 LEA DX, MESS2
CALL WRITEDEC ;输出两个数的和 POP BX ;标志寄存器内容转存入BX MOV AL, ‘0’
TEST BX, 100 0000B ;测试ZF
;测试CF ;输出标志位状态
54 编写程序,从键盘上输入一个字符串,统计其中数字字符,小写字母,大写
字母,空格的个数并显示。 答:
INCLUDE YLIB.H
CODE SEGMENT
ASSUME CS: CODE
MESS1 DB 0DH, 0AH, ‘Input a string please : $’ BUFFER DB 81, ?, 81 DUP(?)
MESS2 DB 0DH, 0AH, ‘Digits: $’
MESS3 DB 0DH, 0AH, ‘Uppercase alphabet: $’ MESS4 DB 0DH, 0AH, ‘Lowercase alphabet: $’ MESS5 DB 0DH, 0AH, ‘Space : $’ START:
PUSH CS POP DS LEA DX, MESS1 MOV AH, 09H INT 21H ;输出提示信息
JZ SKP1
INC AL SKIP1: MOV ZF, AL MOV AL, ‘0’
TEST BX, 1000 0000 0000B JZ SKP2 INC AL SKIP2: MOV OF, AL
MOV AL, ‘0’
TEST BX, 1000 0000B JZ SKP3 INC AL SKIP3: MOV SF, AL
MOV AL, ‘0’
TEST BX, 1 JZ SKP4 INC AL SKIP4: MOV CF, AL LEA DX, MESS3 MOV AH, 9 INT 21H MOV AX, 4C00H INT 21H CODE ENDS END START
;测试OF
;测试SF
LEA DX, BUFFER MOV AH, 0AH INT 21H XOR DX, DX XOR BX, BX MOV CL, BUFFER+1 MOV CH, 0 ;输入字符串
;各计数器清零
;字符个数送CX LEA SI, BUFFER+2 ONE: MOV AL, [SI] CMP AL, ‘ ‘ JNE L2 L1: INC DL JMP NEXT L2: CMP AL, ‘0’ JB NEXT CMP AL, ‘9’ JA L4 L3: INC DH JMP NEXT L4: CMP AL, ‘A’ JB NEXT CMP AL, ‘Z’ JA L6 L5: INC BH JMP NEXT L6: CMP AL, ‘a’ JB NEXT CMP AL, ‘z’ JA NEXT INC BL NEXT: INC SI LOOP ONE
PUSH DX MOV AL, DH LEA DX, MESS2 MOV AH, 0
CALL WRITEDEC LEA DX, MESS4 MOV AL, BL MOV AH, 0
CALL WRITEDEC LEA DX, MESS3 MOV AL, BH
MOV AH, 0
;设置字符指针 ;取出一个字符
;空格字符计数
;数字字符计数
;大写字符计数
;小写字母计数
;循环控制
;输出数字字符个数 ;输出小写字母个数