200 likes | 365 Views
5.4 常见程序设计举例. 1. 十进制数算术运算的码制转换. 开始. 开始. 输入 10 进制数. 输入 10 进制数. 以 BCD 码形式保存. 转换成 2 进制数. 进行算术运算. 进行算术运算. BCD 码调整. 结果转换成 10 进制数显示. 逐个显示 BCD 码. 结束. 结束. 5.4 常见程序设计举例. 2. 常用进制数据输入的程序实现 ① 16 进制数输入 → 2 进制数存储 算法: D n-1 *16 n-1 +……+D0*16 0 ② 10 进制数输入 → 2 进制数存储
E N D
5.4 常见程序设计举例 1.十进制数算术运算的码制转换 开始 开始 输入10进制数 输入10进制数 以BCD码形式保存 转换成2进制数 进行算术运算 进行算术运算 BCD码调整 结果转换成10进制数显示 逐个显示BCD码 结束 结束
5.4 常见程序设计举例 • 2.常用进制数据输入的程序实现 • ① 16进制数输入 → 2进制数存储 • 算法:Dn-1*16n-1+……+D0*160 • ②10进制数输入 → 2进制数存储 • 算法:Dn-1*10n-1+……+D0*100 • ③2进制数输入 → 2进制数存储 • 算法:Dn-1*2n-1+……+D0*20
5.4 常见程序设计举例 例:从键盘输入一个四位的16进制数,以2进制形式保存到BX中 INP_HXB PROC NEAR XOR BX, BX MOV CX, 4 NEXT_INP: MOV AH, 01H INT 21H CMP AL, 61H ;'a'-'z' JGE UPPER CMP AL, 41H ;'A'-'Z' JGE LOWER SUB AL, 30H ;'0'-'9' JMP ADJUST UPPER: SUB AL, 61H ADD AL, 10
5.4 常见程序设计举例 LOWER: SUB AL, 41H ADD AL, 10 ADJUST: CBW ;BX=BX*16+AX XCHG AX, BX MOV DX, 16 MUL DX XCHG AX, BX ADD BX, AX LOOP NEXT_INP RET INP_HXB ENDP ;替换代码 PUSH CX MOV CL, 4 SHL BX, CL ADD BX, AX POP CX 16进制输入,若输入为:1234,则(BX)=0001001000110100B/1234H; 10进制输入,若输入为:1234,则(BX)=0000010011010010B/04D2H。
5.4 常见程序设计举例 • 3.常用进制数据输出的程序实现 • ① 2进制数存储 → 16进制数显示 • 方法1:显示时将2进制数每4位分成一组,按组求对应的ASCII码送显示即可。 • 方法2:除16取余。将2进制数除以16,得到第一个商和余数,此第一个余数就是所求的16进制数的个位;再用第一个商除以16,得到第二个商和余数,此第二个余数就是所求16进制数的十位;重复这一过程直至商为0,此时的余数就是所求16进制数的最高位。所得余数依次入栈,显示时依次出栈并转换成ASCII码即可。
5.4 常见程序设计举例 • 方法3:将2进制数除以所求16进制数最高位的权值(如,4位16进制数最高位权值为4096),得到一个商和余数,此第一个商就是所求的16进制数的最高位;再用第一个余数除以次高位的权值,得到第二个商和余数,此第二个商就是所求16进制数的次高位;重复这一过程直至权值为1,此时的商就是所求16进制数的个位,将所得商依次转换为ASCII码送显示即可。
5.4 常见程序设计举例 例:将BX中的16位2进制数转换成4位16进制数送出显示 方法1: DISP_BXH PROC NEAR MOV CL,4 MOV CH,4NEXT_DISP: ROL BX, CL ;从高到低依次析取MOV AL,BL AND AL,0FH ADD AL,30H CMP AL,3AH JL OUTP ADD AL,07H ;是A~F,要多加7
5.4 常见程序设计举例 OUTP: MOV DL,AL MOV AH,02H INT 21H DEC CH CMP CH,0 JA NEXT MOV DL,’H’ ;显示字母“H” MOV AH,2 INT 21H RETDISP_BXH ENDP
5.4 常见程序设计举例 方法2: DISP_BXH PROC NEARMOV SI, 16 XOR CX, CX MOV AX, BX NEXT:MOV DX,0 DIV SI ;商在AX中,余数在DX中 PUSH DX;余数压栈 INC CX CMP AX,0;商为0则完成转换 JNZ NEXT OUTP:POP DX;出栈 ADD DL,30H MOV AH,2 INT 21H LOOP OUTP RET DISP_BXH ENDP
5.4 常见程序设计举例 方法3: DISP_BXH PROC NEAR MOV CX, 4096 CALL HEX_DIV MOV CX, 256 CALL HEX_DIV MOV CX, 16 CALL HEX_DIV MOV CX, 1 CALL HEX_DIV RETDISP_BXH ENDP HEX_DIV PROC NEAR MOV AX, BX MOV DX, 0 DIV CX MOV BX, DX MOV DL, AL ADD DL, 30H MOV AH, 02H INT 21H RET HEX_DIV ENDP 16进制显示,设(BX)=0001001000110100B/1234H,则显示结果为:1234H; 10进制显示,若(BX)=0001001000110100B/1234H,则显示结果为:4460。
5.4 常见程序设计举例 ②2进制数存储 → 10进制数显示 方法1:除10取余。 方法2:除权值取商。 ③2进制数存储 → 2进制数显示 方法1:按位显示。 方法2:除2取余。 方法3:除权值取商。 ④对有符号数显示的扩展应用CMP BX,0JGE ZSMOV DL,’-’MOV AH,2INT 21HZS:CALL DISP_BXD
5.4 常见程序设计举例 • 实验一思考题:写出将BX中存储的4位BCD转换成二进制码的汇编程序段。 • 算法:(((X3*10+X2)*10+X1)*10+X0 XOR AX,AX MOV DX,4 NEXT: MOV CL,10 MUL CL PUSH BX MOV CL,4 ROL BX,CL AND BX,000FH ADD AX,BX POP BX DEC DX JNZ NEXT HLT
5.4 常见程序设计举例 • 实验二思考题:输入一个一位十六进制数字(由0-9,A~F组成),然后显示该数字的十进制值。重复上述过程,直至输入值为Q时结束程序。要求能判断不符合要求的输入,并提示输入不合法。 • DSEG SEGMENT • STRERROR DB 'ERROR',0DH,0AH,'$' ;显示错误信息 • DSEG ENDS • CSEG SEGMENT • ASSUME CS:CSEG,DS:DSEG • START: • MOV AX,DSEG • MOV DS,AX • INPT: • MOV AH,01H • INT 21H • CMP AL,51H • JZ EXIT ;输入字符等于‘Q' • CMP AL,30H • JL ERROR ;输入字符小于‘0'
5.4 常见程序设计举例 • CMP AL,3AH • JL SHOW ;输入字符在'0'和'9'之间 • CMP AL,41H • JL ERROR ;输入字符在'9'和'A'之间 • CMP AL,47H • JL UPPER ;输入字符在'A'和'F'之间 • ERROR: • MOV DL,20H ;显示空格 • MOV AH,02H • INT 21H • MOV AH,9 ;输出字符串'ERROR' • LEA DX,STRERROR • INT 21H • JMP INPT • UPPER: • SUB AL, 07H ;大写转换:41H-0AH=37H
5.4 常见程序设计举例 • SHOW: • XOR BX,BX • SUB AL,30H • MOV BL,AL ;什么要转存至BL? • MOV DL,20H ;显示空格 • MOV AH,02H • INT 21H • MOV SI, 10 ;二进制转十进制 • XOR CX, CX • MOV AX, BX • NEXT: • MOV DX, 0 • DIV SI ;商在AX中,余数在DX中 • PUSH DX ;余数压栈 • INC CX • CMP AX, 0 ;商为0则完成转换 • JNZ NEXT
5.4 常见程序设计举例 • OUTP: • POP DX ;出栈 • ADD DL, 30H • MOV AH,2 • INT 21H • LOOP OUTP • MOV DL,0AH ;显示回车换行 • INT 21H • MOV DL,0DH • INT 21H • JMP INPT • EXIT: • MOV AX,4C00H • INT 21H • CSEG ENDS • END START
5.4 常见程序设计举例 • 实验三:用汇编语言编写学生成绩统计程序:键盘输入学生成绩到SCORE中(0<=分数<=100,设有10个学生成绩分别是56,69,84,82,73,88,99,63,100,80)。编程将它们由大到小排序,存回到原来的SCORE变量中;并统计低于60分、60~69、70~79、80~89、90~99及100分的人数,分别存放在S5、S6、S7、S8、S9、S10单元中,并在屏幕输出显示。 • 参见源程序
5.4 常见程序设计举例 • 实验三思考题:编写计算N!的程序。数值N(N<=8)由键盘输入,结果在屏幕上输出 。 • 参见源程序
5.4 常见程序设计举例 DAT1 34 例5-10:用乘法指令实现32位二进制数的相乘 DATA SEGMENT DAT1 DW 1234H, 2345H DAT2 DW 5678H, 6789H RESULT DW 4 DUP(?) DATA ENDS STACK SEGMENT PARA STACK DW 20 DUP(0) STACK ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, SS:STACK START: MOV AX, DATA MOV DS, AX MOV AX, DAT1+2 MUL DAT2+2 MOV RESULT+6, AX MOV RESULT+4, DX 12 45 23 DAT2 78 56 89 67 RESULT RESULT+2 RESULT+4 RESULT+6
5.4 常见程序设计举例 DAT1 34 MOV AX, DAT1 MUL DAT2+2 ADD RESULT+4, AX ADC RESULT+2, DX ADC RESULT, 0 MUL DAT2 ADD RESULT+4, AX ADC RESULT+2, DX ADC RESULT, 0 MOV AX, DAT1 MUL DAT2 ADD RESULT+2, AX ADC RESUTL, DX MOV AH, 4CH INT 21H CODE ENDS END START 12 45 23 DAT2 78 56 89 67 RESULT RESULT+2 RESULT+4 RESULT+6