📄 51.lst
字号:
0128 7D00 384 MOV R5,#0
012A 12014C 385 LCALL MDS ;计算结果的符号和两个操作数的绝对值
012D 12004E 386 LCALL MULD ;计算两个绝对值的乘积
0130 8014 387 SJMP MDSE ;用补码表示结果
388
A51 MACRO ASSEMBLER 51 06/29/2007 15:34:54 PAGE 7
389 ;(11)标号:DIVS 功能:双字节二进制有符号数除法(补码)
390
391 ;入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
392 ;出口信息:OV=0时商在R2、R3中,OV=1时溢出。
393 ;影响资源:PSW、A、B、R1~R7 堆栈需求: 5字节
394
0132 12014C 395 DIVS: LCALL MDS ;计算结果的符号和两个操作数的绝对值
0135 C0D0 396 PUSH PSW ;保存结果的符号
0137 12009A 397 LCALL DIVD ;计算两个绝对值的商
013A 30D203 398 JNB OV,DVS1 ;溢出否?
013D D0E0 399 POP ACC ;溢出,放去结果的符号,保留溢出标志
013F 22 400 RET
0140 D0D0 401 DVS1: POP PSW ;未溢出,取出结果的符号
0142 7C00 402 MOV R4,#0
0144 7D00 403 MOV R5,#0
0146 20D51A 404 MDSE: JB F0,MDS2 ;用补码表示结果
0149 C2D2 405 CLR OV ;结果为正,原码即补码,计算成功
406
014B 22 407 RET
014C C2D5 408 MDS: CLR F0 ;结果符号初始化
014E EE 409 MOV A,R6 ;判断第二操作数的符号
014F 30E70B 410 JNB ACC.7,MDS1 ;为正,不必处理
0152 B2D5 411 CPL F0 ;为负,结果符号取反
0154 CF 412 XCH A,R7 ;第二操作数取补,得到其绝对值
0155 F4 413 CPL A
0156 2401 414 ADD A,#1
0158 CF 415 XCH A,R7
0159 F4 416 CPL A
015A 3400 417 ADDC A,#0
015C FE 418 MOV R6,A
015D EA 419 MDS1: MOV A,R2 ;判断第一操作数或运算结果的符号
015E 30E716 420 JNB ACC.7,MDS3 ;为正,不必处理
0161 B2D5 421 CPL F0 ;为负,结果符号取反
0163 ED 422 MDS2: MOV A,R5 ;求第一操作数的绝对值或运算结果的补码
0164 F4 423 CPL A
0165 2401 424 ADD A,#1
0167 FD 425 MOV R5,A
426
0168 EC 427 MOV A,R4
0169 F4 428 CPL A
016A 3400 429 ADDC A,#0
016C FC 430 MOV R4,A
016D EB 431 MOV A,R3
016E F4 432 CPL A
016F 3400 433 ADDC A,#0
0171 FB 434 MOV R3,A
0172 EA 435 MOV A,R2
0173 F4 436 CPL A
0174 3400 437 ADDC A,#0
0176 FA 438 MOV R2,A
0177 C2D2 439 MDS3: CLR OV ;运算成功
0179 22 440 RET
441
442 ;(12)标号:SH2 功能:双字节二进制无符号数开平方(快速)
443
444 ;入口条件:被开方数在R2、R3中。
445 ;出口信息:平方根仍在R2、R3中,整数部分的位数为原数的一半,其余为小数。
446 ;影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
447
017A EA 448 SH2: MOV A,R2
017B 4B 449 ORL A,R3
017C 7001 450 JNZ SH20
017E 22 451 RET ;被开方数为零,不必运算
452
017F 7F00 453 SH20: MOV R7,#0 ;左规次数初始化
0181 EA 454 MOV A,R2
A51 MACRO ASSEMBLER 51 06/29/2007 15:34:54 PAGE 8
0182 54C0 455 SH22: ANL A,#0C0H ;被开方数高字节小于40H否?
0184 7035 456 JNZ SQRH ;不小于40H,左规格化完成,转开方过程
0186 C3 457 CLR C ;每左规一次,被开方数左移两位
0187 EB 458 MOV A,R3
0188 33 459 RLC A
0189 92D5 460 MOV F0,C
018B C3 461 CLR C
018C 33 462 RLC A
018D FB 463 MOV R3,A
018E EA 464 MOV A,R2
018F 92E7 465 MOV ACC.7,C
0191 A2D5 466 MOV C,F0
0193 33 467 RLC A
0194 33 468 RLC A
0195 FA 469 MOV R2,A
0196 0F 470 INC R7 ;左规次数加一
0197 80E9 471 SJMP SH22 ;继续左规
472
473 ;(13)标号: SH4 功能:四字节二进制无符号数开平方(快速)
474
475 ;入口条件:被开方数在R2、R3、R4、R5中。
476
477 ;出口信息:平方根在R2、R3中,整数部分的位数为原数的一半,其余为小数。
478 ;影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
479
0199 EA 480 SH4: MOV A,R2
019A 4B 481 ORL A,R3
019B 4C 482 ORL A,R4
019C 4D 483 ORL A,R5
019D 7001 484 JNZ SH40
019F 22 485 RET ;被开方数为零,不必运算
01A0 7F00 486 SH40: MOV R7,#0 ;左规次数初始化
01A2 EA 487 MOV A,R2
01A3 54C0 488 SH41: ANL A,#0C0H ;被开方数高字节小于40H否?
01A5 7014 489 JNZ SQRH ;不小于40H,左规格化完成
01A7 7E02 490 MOV R6,#2 ;每左规一次,被开方数左移两位
01A9 C3 491 SH42: CLR C ;被开方数左移一位
01AA ED 492 MOV A,R5
01AB 33 493 RLC A
494
01AC FD 495 MOV R5,A
01AD EC 496 MOV A,R4
01AE 33 497 RLC A
01AF FC 498 MOV R4,A
01B0 EB 499 MOV A,R3
01B1 33 500 RLC A
01B2 FB 501 MOV R3,A
01B3 EA 502 MOV A,R2
01B4 33 503 RLC A
01B5 FA 504 MOV R2,A
01B6 DEF1 505 DJNZ R6,SH42 ;被开方数左移完两位
01B8 0F 506 INC R7 ;左规次数加一
01B9 80E8 507 SJMP SH41 ;继续左规
01BB EA 508 SQRH: MOV A,R2 ;规格化后高字节按折线法分为三个区间
01BC 2457 509 ADD A,#57H
01BE 4014 510 JC SQR2
01C0 2445 511 ADD A,#45H
01C2 4009 512 JC SQR1
01C4 2424 513 ADD A,#24H
01C6 75F0E3 514 MOV B,#0E3H ;第一区间的斜率
01C9 7C80 515 MOV R4,#80H ;第一区间的平方根基数
01CB 800C 516 SJMP SQR3
01CD 75F0B2 517 SQR1: MOV B,#0B2H ;第二区间的斜率
01D0 7CA0 518 MOV R4,#0A0H ;第二区间的平方根基数
519
01D2 8005 520 SJMP SQR3
A51 MACRO ASSEMBLER 51 06/29/2007 15:34:54 PAGE 9
01D4 75F08D 521 SQR2: MOV B,#8DH ;第三区间的斜率
01D7 7CD0 522 MOV R4,#0D0H ;第三区间的平方根基数
01D9 A4 523 SQR3: MUL AB ;与区间基点的偏移量乘区间斜率
01DA E5F0 524 MOV A,B
01DC 2C 525 ADD A,R4 ;累加到平方根的基数上
01DD FC 526 MOV R4,A
01DE F5F0 527 MOV B,A
01E0 A4 528 MUL AB ;求当前平方根的幂
01E1 CB 529 XCH A,R3 ;求偏移量(存放在R2R3中)
01E2 C3 530 CLR C
01E3 9B 531 SUBB A,R3
01E4 FB 532 MOV R3,A
01E5 EA 533 MOV A,R2
01E6 95F0 534 SUBB A,B
01E8 FA 535 MOV R2,A
01E9 D3 536 SQR4: SETB C ;用减奇数法校正一个字节的平方根
01EA EC 537 MOV A,R4 ;当前平方根的两倍加一存入R5R6中
01EB 33 538 RLC A
01EC FE 539 MOV R6,A
540
01ED E4 541 CLR A
01EE 33 542 RLC A
01EF FD 543 MOV R5,A
01F0 EB 544 MOV A,R3 ;偏移量小于该奇数否?
01F1 9E 545 SUBB A,R6
01F2 F5F0 546 MOV B,A
01F4 EA 547 MOV A,R2
01F5 9D 548 SUBB A,R5
01F6 4006 549 JC SQR5 ;小于,校正结束,已达到一个字节的精度
01F8 0C 550 INC R4 ;不小于,平方根加一
01F9 FA 551 MOV R2,A ;保存新的偏移量
01FA ABF0 552 MOV R3,B
01FC 80EB 553 SJMP SQR4 ;继续校正
01FE EC 554 SQR5: MOV A,R4 ;将一个字节精度的根存入R2
01FF CA 555 XCH A,R2
0200 13 556 RRC A
0201 92D5 557 MOV F0,C ;保存最终偏移量的最高位
0203 EB 558 MOV A,R3
0204 FD 559 MOV R5,A ;将最终偏移量的低八位存入R5中
0205 7C08 560 MOV R4,#8 ;通过(R5R6/R2)求根的低字节
561
0207 C3 562 SQR6: CLR C
0208 EB 563 MOV A,R3
0209 33 564 RLC A
020A FB 565 MOV R3,A
020B C3 566 CLR C
020C ED 567 MOV A,R5
020D 9A 568 SUBB A,R2
020E 20D502 569 JB F0,SQR7
0211 4002 570 JC SQR8
0213 FD 571 SQR7: MOV R5,A
0214 0B 572 INC R3
0215 C3 573 SQR8: CLR C
0216 ED 574 MOV A,R5
0217 33 575 RLC A
0218 FD 576 MOV R5,A
0219 92D5 577 MOV F0,C
021B DCEA 578 DJNZ R4,SQR6 ;根的第二字节计算完,在R3中
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -