1 / 20

5.4 常见程序设计举例

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 进制数存储

katima
Télécharger la présentation

5.4 常见程序设计举例

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 5.4 常见程序设计举例 1.十进制数算术运算的码制转换 开始 开始 输入10进制数 输入10进制数 以BCD码形式保存 转换成2进制数 进行算术运算 进行算术运算 BCD码调整 结果转换成10进制数显示 逐个显示BCD码 结束 结束

  2. 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

  3. 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

  4. 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. 5.4 常见程序设计举例 • 3.常用进制数据输出的程序实现 • ① 2进制数存储 → 16进制数显示 • 方法1:显示时将2进制数每4位分成一组,按组求对应的ASCII码送显示即可。 • 方法2:除16取余。将2进制数除以16,得到第一个商和余数,此第一个余数就是所求的16进制数的个位;再用第一个商除以16,得到第二个商和余数,此第二个余数就是所求16进制数的十位;重复这一过程直至商为0,此时的余数就是所求16进制数的最高位。所得余数依次入栈,显示时依次出栈并转换成ASCII码即可。

  6. 5.4 常见程序设计举例 • 方法3:将2进制数除以所求16进制数最高位的权值(如,4位16进制数最高位权值为4096),得到一个商和余数,此第一个商就是所求的16进制数的最高位;再用第一个余数除以次高位的权值,得到第二个商和余数,此第二个商就是所求16进制数的次高位;重复这一过程直至权值为1,此时的商就是所求16进制数的个位,将所得商依次转换为ASCII码送显示即可。

  7. 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

  8. 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

  9. 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

  10. 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。

  11. 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

  12. 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

  13. 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'

  14. 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

  15. 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

  16. 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

  17. 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单元中,并在屏幕输出显示。 • 参见源程序

  18. 5.4 常见程序设计举例 • 实验三思考题:编写计算N!的程序。数值N(N<=8)由键盘输入,结果在屏幕上输出 。 • 参见源程序

  19. 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

  20. 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

More Related