⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 7e21.asm

📁 设计多字节减法运算程序,要求程序能显示运算数据和结果数据(16进制).
💻 ASM
字号:
;设计多字节减法运算程序,要求程序能显示运算数据和结果数据(16进制).
;数据按逆序存放:先低位后高位
;多字节减法:9900664488H-885522H=?

;PUBLIC D1,D2,N1,N2
;EXTRN  EX21:FAR
;EXTRN  EX22:FAR
DATA   SEGMENT PARA  PUBLIC 'DATA'
  D1   DB   88H,44H,66H,00H,99H
       N1=$-D1
  D2   DB  22H,55H,88H
       N2=$-D2
  D3   DB   20  DUP(?)
DATA   ENDS

STACK  SEGMENT
 STA   DW  100 DUP(?)
STACK  ENDS

CODE   SEGMENT  PARA PUBLIC 'CODE'
       ASSUME  CS:CODE,DS:DATA,SS:STACK  
MAIN   PROC    FAR  
 START:  MOV   AX,DATA
         MOV   DS,AX
         MOV   AX,STACK
         MOV   SS,AX
         MOV   AX,100
         MOV   SP,AX
         MOV   SI,OFFSET  D1
         ADD   SI,N1-1        ;SI指向被减数的高位
         MOV   CX,N1          ;            
         CALL  EX21           ;显示被减数 
         CALL  PP2            ;换行
         MOV   SI,OFFSET D2          
         ADD   SI,N2-1        ;SI指向减数的高位字节
         MOV   CX,N2
         CALL  EX21           ;显示被减数
         CALL  PP2   
         CALL  EX22
         LEA   SI,D1
         ADD   SI,N1-1        ;SI指向被减数的高位
         MOV   CX,N1
         CALL  EX21 
         MOV   AH,4CH
         INT   21H       
         RET

;--------回车与换行------  
PP2   PROC NEAR 
      PUSH  DX
      PUSH  AX
      MOV   DL,0DH
      MOV   AH,2
      MOV   DL,0AH
      INT   21H
      pop   DX
      POP   AX
      RET
PP2   ENDP

;-------多字节减法----
EX22  PROC  NEAR
       
      LEA   SI,D1                ;指向被减数
      LEA   DI,D2                ;指向减数
      MOV   BX,N1                ;送被减数长度 
      MOV   CX,N2                ;减数字节数
 MM:  MOV   AL,[DI]
         SBB    [SI],AL          ;带借位减 
         INC    DI               ;指向下一个字节 
         INC    SI
         DEC    BX                 
         LOOP   MM        
 M1:     JZ     M2                ;为零转M2
         JNC    M2                ;无进位转M2
         SBB    BYTE PTR [SI],0   ;否则,被减数减0
         INC    SI                ;指向被减数下一个字节
         DEC    BX                ;被减数总字节数减一
         JMP    M1           
M2: RET 
EX22   ENDP

;-----多字节数对16进指数的显示
;入口:SI指向要显示的数据,CX=显示的字节数
;出口:DI指向已转换好的ASCII数
EX21  PROC  NEAR
         PUSH  AX          
   DO:   MOV      AL,[SI]             ;取一个字节到AL 
         CALL     EX2_16              ;调转换子程序
         DEC      SI                  ;指向下个数 
         LOOP     DO
         POP   AX             
         RET
EX21    ENDP
         
;--------2 exchange 16-----
;将一个8位2进制数转换为2个16进指数ASCII码并显示
;入口:AL=数据

 EX2_16 PROC    NEAR
        PUSH     CX              ;保护现场
        PUSH     BX
        PUSH     DX
 G1:   MOV      BL,2             ;需转换2次
       MOV      BH, AL           ;AL中的数暂存BH
       MOV      CL, 4            ;置移位位数
       ROL      AL, CL           ;循环左移4位
G2:    AND      AL, 0FH          ;得到低4位
       CMP      AL,10            ; BL <10?
       JB       S                 ; BL<10,转
       ADD      AL,07H           ;大于10,加7
  S:   ADD      AL,30H
;--------显示一个ASCII码 --------
         MOV      DL,AL          ;送ASCII码
         MOV      AH,2
         INT      21H             ;显示一个ASCII码 
       MOV   AL,BH
       DEC   BL                  
       JNZ   G2                ;2个数没转换完,继续
;恢复现场
       POP   DX
       POP   BX 
       POP   CX
       RET                     ;子程序返回
 EX2_16   ENDP
MAIN   ENDP   
 CODE      ENDS
           END    START

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -