1. 编写综合程序,构成子程序表,实现10->16,16->10,2->10进制转换以及乘除法运算。
代码如下:
STACK SEGMENT PARA STACK DW 100H DUP(?) STACK ENDS DATA SEGMENT PARA STR1 DB 'Please input a decimal number(10->16):',0ah,0dh,'$' STR2 DB 'Please input a binary number(2->10):',0ah,0dh,'$' STR3 DB 'Please input a hexadecimal number(16->10):',0ah,0dh,'$' STR4 DB 'Quotient:','$' STR5 DB 'Remainder:','$' VALUE DB 128 DUP(?) NEW_LINE DB 0DH,0AH,'$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK MAIN PROC FAR MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV DX,OFFSET STR1 ;输入一个十进制数 MOV AH,9 INT 21H MOV CX,5 CALL INPUT_10 MOV BX, 16 ;16进制,要除16 MOV CX, 4 ;求4位16进制数. CALL CV10_16 PUSH AX CALL ENTER_1 MOV DX,OFFSET STR2 ;输入一个二进制数 MOV AH,9 INT 21H MOV CX,16 CALL INPUT_2 CALL ENTER_1 MOV BX, 10 ;10进制,要除10 MOV CX, 5 ;求5位10进制数. CALL CV2_10 PUSH AX CALL ENTER_1 MOV DX,OFFSET STR3 ;输入一个十六进制数 MOV AH,9 INT 21H MOV CX,4 CALL INPUT_16 CALL ENTER_1 MOV BX, 10 ;10进制,要除10 MOV CX, 5 ;求5位10进制数. CALL CV2_10 CALL ENTER_1 POP BX POP AX CALL DIV1_2 CALL ENTER_1 CALL MULT MOV AH,4CH INT 21H MAIN ENDP ;输出回车 ENTER_1 PROC PUSH AX PUSH DX MOV DX,OFFSET NEW_LINE ;显示回车 MOV AH,9 INT 21H POP DX POP AX RET ENTER_1 ENDP INPUT_10 PROC PUSH SI PUSH DX PUSH BX MOV SI,0 MOV BX,10 LP1: MOV AH,1 INT 21H CMP AL,0DH JE RETURN CMP AL,30H JB LP1 CMP AL,39H JA LP1 SUB AL,30H XOR AH,AH PUSH AX MOV AX,SI MUL BX MOV SI,AX POP AX ADD SI,AX LOOP LP1 RETURN: MOV AX,SI POP BX POP DX POP SI RET INPUT_10 ENDP CV10_16 PROC PUSH AX PUSH BX PUSH DX LP1_1: CWD DIV BX PUSH DX ;保存余数到堆栈. LOOP LP1_1 MOV BX,0 MOV CX, 4 ;显示4位. LP1_2: POP DX CMP DL,0 JNZ DISP CMP BX,0 JZ DISP1 DISP: MOV BX,1 CMP DL, 10 JB LP1_3 ADD DL, 7 LP1_3: ADD DL, 48 MOV AH, 2 INT 21H ;输出. DISP1: LOOP LP1_2 MOV DL, 'H' ;输出h MOV AH, 2 INT 21H POP DX POP BX POP AX RET CV10_16 ENDP INPUT_2 PROC PUSH SI PUSH DX PUSH BX MOV SI,0 MOV BX,2 LP2: MOV AH,1 INT 21H CMP AL,'b' JE RETURN1 CMP AL,'B' JE RETURN1 CMP AL,30H JB LP2 CMP AL,31H JA LP2 SUB AL,30H XOR AH,AH PUSH AX MOV AX,SI MUL BX MOV SI,AX POP AX ADD SI,AX LOOP LP2 RETURN1: MOV AX,SI POP BX POP DX POP SI RET INPUT_2 ENDP CV2_10 PROC PUSH AX PUSH BX PUSH DX LP2_1: CWD DIV BX PUSH DX ;保存余数到堆栈. LOOP LP2_1 MOV CX,5 ;显5位. MOV BX,0 LP2_2: POP DX CMP DL,0 JNZ DLP2_1 CMP BX,0 JZ DLP2_2 DLP2_1: MOV BX,1 ADD DL,30H MOV AH,2 INT 21H ;输出. DLP2_2: LOOP LP2_2 POP DX POP BX POP AX RET CV2_10 ENDP INPUT_16 PROC PUSH SI PUSH DX PUSH BX MOV SI,0 MOV BX,16 LP3: MOV AH,1 INT 21H CMP AL,'h' JE RETURN2 CMP AL,'H' JE RETURN2 CMP AL,30H JB LP3 CMP AL,39H JBE LP31 CMP AL,'A' JB LP3 CMP AL,'F' JBE LP32 CMP AL,'a' JB LP3 CMP AL,'f' JA LP3 SUB AL,32 LP32: SUB AL,7 LP31: SUB AL,30H XOR AH,AH PUSH AX MOV AX,SI MUL BX MOV SI,AX POP AX ADD SI,AX LOOP LP3 RETURN2: MOV AX,SI POP BX POP DX POP SI RET INPUT_16 ENDP DIV1_2 PROC PUSH AX PUSH BX CWD DIV BX PUSH AX PUSH DX LEA DX,STR5 MOV AH,9 INT 21H POP DX MOV AX,DX MOV BX, 10 ;10进制,要除10 MOV CX, 5 ;求5位10进制数. CALL CV2_10 CALL ENTER_1 LEA DX,STR4 MOV AH,9 INT 21H POP AX MOV BX, 10 ;10进制,要除10 MOV CX, 5 ;求5位10进制数. CALL CV2_10 POP BX POP AX RET DIV1_2 ENDP MULT PROC PUSH AX PUSH BX MUL BX PUSH AX MOV AX,DX MOV BX, 10 ;10进制,要除10 MOV CX, 5 ;求5位10进制数. CALL CV2_10 POP AX MOV BX, 10 ;10进制,要除10 MOV CX, 5 ;求5位10进制数. CALL CV2_10 POP BX POP AX RET MULT ENDP CODE ENDS END MAIN
程序运行结果如下图:
1. 编写综合程序,构成子程序表,实现字符串的大小写转换、增、删、查、替换、复制、比较以及输入与输出。
代码如下:
STACK SEGMENT PARA STACK DW 100 DUP(?) STACK ENDS DATA SEGMENT PARA LEN EQU 121 SEN1 DB LEN-1 DB ? DB LEN DUP(?) SEN2 DB LEN-1 DB ? DB LEN DUP(?) SEN3 DB LEN-1 DB ? DB LEN DUP(?) SEN4 DB LEN-1 DB ? DB LEN DUP(?) STR1 DB 'Please input string one:',0aH,0dh,'$' STR2 DB 'Please input string two:',0aH,0dh,'$' BIG DB 'STR1>STR2',0aH,0dh,'$' SMA DB 'STR1<STR2',0aH,0dh,'$' EQUE DB 'STR1=STR2',0aH,0dh,'$' lab1 DB 'Enter a keyword:',0aH,0dh,'$' REPL DB 'Enter a replacement word:',0aH,0dh,'$' FOUND DB 'Found!',0aH,0dh,'$' NFOUND DB 'No found!',0aH,0dh,'$' STR3 DB 128 DUP(?) NEW_LINE DB 0DH,0AH,'$' DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA MAIN PROC FAR MOV AX,DATA MOV DS,AX MOV ES,AX MOV AX,STACK MOV SS,AX LEA DX,STR1 MOV AH,09H INT 21H LEA DX,SEN1 MOV AH,0AH INT 21H CALL ENTER_1 MOV CL,SEN1+1 XOR CH,CH MOV SI,OFFSET SEN1+2 PUSH CX PUSH SI ADD SI,CX MOV BYTE PTR[SI],'$' POP SI POP CX MOV DI,OFFSET STR3 CALL STRCPY INDEX: LEA DX,lab1 MOV AH,09H INT 21H LEA DX,SEN3 MOV AH,0AH INT 21H CALL ENTER_1 MOV DI,OFFSET SEN1+2 CALL STRIND CMP AX,1 JZ DELETE JNZ INDEX DELETE: CALL STRDEL ;调用字符串插入和删除即可实现字符串替换 LEA DX,REPL MOV AH,09H INT 21H LEA DX,SEN4 MOV AH,0AH INT 21H CALL ENTER_1 CALL STR_INSERT LEA DX,STR2 MOV AH,09H INT 21H LEA DX,SEN2 MOV AH,0AH INT 21H CALL ENTER_1 MOV CL,SEN2+1 XOR CH,CH MOV SI,OFFSET SEN2+2 CALL STRCV MOV SI,OFFSET SEN1+2 MOV DI,OFFSET SEN2+2 CALL STRCMP MOV AH,4CH INT 21H MAIN ENDP ;输出回车 ENTER_1 PROC PUSH AX PUSH DX MOV DX,OFFSET NEW_LINE ;显示回车 MOV AH,9 INT 21H POP DX POP AX RET ENTER_1 ENDP ;字符串查找 STRIND PROC ;入口参数DI PUSH SI LP3: MOV CL,SEN1+1 XOR CH,CH MOV SI,OFFSET SEN3+2 MOV AX,[SI] CLD REPNZ SCASB JNZ LAB2 LEA DX,FOUND MOV AH,9 INT 21H MOV AX,1 JMP EXIT LAB2: LEA DX,NFOUND MOV AH,9 INT 21H MOV AX,0 EXIT: POP SI RET STRIND ENDP ;字符串删除 STRDEL PROC ;入口参数DI PUSH AX PUSH CX PUSH SI PUSH DI DEC DI MOV CL,SEN3+1 XOR CH,CH PUSH CX ADD CX,DI MOV SI,CX POP CX CLD REP MOVSB MOV DX,OFFSET SEN1+2 MOV AH,9 INT 21H CALL ENTER_1 POP DI POP SI POP CX POP AX RET STRDEL ENDP ;字符串插入 STR_INSERT PROC ;入口参数DI PUSH AX PUSH CX PUSH SI PUSH DI DEC DI PUSH DI MOV SI,DI MOV CL,SEN4+1 XOR CH,CH PUSH CX ADD CX,DI MOV DI,CX POP CX CLD REP MOVSB POP DI MOV SI,OFFSET SEN4+2 MOV CL,SEN4+1 XOR CH,CH CLD REP MOVSB MOV DX,OFFSET SEN1+2 MOV AH,9 INT 21H CALL ENTER_1 POP DI POP SI POP CX POP AX RET STR_INSERT ENDP ;字符串比较 STRCMP PROC ;入口参数SI(串1),DI(串2) PUSH CX CLD PUSH SI MOV CX,1 LP1: LODSB CMP AL,'$' JE LP1_1 INC CX JMP SHORT LP1 LP1_1: POP SI REPE CMPSB JA L1 JB L2 LEA DX,EQUE MOV AH,9 INT 21H JMP SHORT RETURN L1: LEA DX,BIG MOV AH,9 INT 21H JMP SHORT RETURN L2: LEA DX,SMA MOV AH,9 INT 21H RETURN: POP CX RET STRCMP ENDP ;字符串复制 STRCPY PROC ;入口参数SI(源),DI(目的),cx CLD REP MOVSB MOV BYTE PTR[DI],'$' MOV DX,OFFSET STR3 MOV AH,9 INT 21H CALL ENTER_1 RET STRCPY ENDP ;大小写转换 STRCV PROC ;入口参数SI,cx PUSH AX LP2: MOV AL,[SI] CMP AL,'a' JB LP2_1 CMP AL,'z' JA LP2_1 SUB AL,20H MOV [SI],AL JMP LP2_2 LP2_1: CMP AL,'A' JB LP2_2 CMP AL,'Z' JA LP2_2 ADD AL,20H MOV [SI],AL LP2_2: INC SI LOOP LP2 MOV BYTE PTR[SI],'$' MOV DX,OFFSET SEN2+2 MOV AH,9 INT 21H CALL ENTER_1 POP AX RET STRCV ENDP CODE ENDS END MAIN
程序运行结果截图如下: