汇编练习三

练习一:统计复数的个数

DTSEG SEGMENT  
MES1  DB    'The result is:$'  
NUMB  DB 12H,88H,82H,89H,33H,90H,01H,10H,0BDH,01H  
DTSEG ENDS  
  
CDSEG SEGMENT  
      ASSUME CS:CDSEG,DS:DTSEG  
START:MOV AX,DTSEG  
      MOV DS,AX  
        
      MOV   DX,OFFSET MES1  
      MOV   AH,09H  
      INT   21H  
      MOV BL,0H  
      MOV CX,0AH  
      MOV SI,OFFSET NUMB  
NEXT: MOV AX,[SI]  
      AND AX,80H  ;判断是否是负数
      CMP AX,0H  
      JG  MIN  
      JMP CON  
MIN:  INC BL  
CON:  INC SI  
      LOOP NEXT  
      CALL SHOW   
      MOV AH,4CH  
      INT 21H  
             
SHOW    PROC    NEAR  
       PUSH AX  
       PUSH DX  
       MOV  AL,BL  
       AND  AL,0F0H         ;取高4位  
       SHR  AL,4  
       CMP  AL,0AH          ;是否是A以上的数  
       JB   C2        
       ADD  AL,07H        
C2:    ADD  AL,30H        
       MOV  DL,AL           ;show character   
       MOV  AH,02H  
       INT  21H  
       MOV  AL,BL  
       AND  AL,0FH          ;取低4位  
       CMP  AL,0AH  
       JB   C3  
       ADD  AL,07H  
C3:    ADD  AL,30H  
       MOV  DL,AL           ;show character   
       MOV  AH,02H  
       INT  21H  
       POP  DX  
       POP  AX  
       RET  
       ENDP   
CDSEG ENDS  
      END START  

联系2:找出最大最小值

; You may customize this and other start-up templates; 
; The location of this template is c:\emu8086\inc\0_com_template.txt


STACK1  SEGMENT STACK  
         DW 256 DUP(?)  
STACK1  ENDS  
  
DDATA   SEGMENT  
MES1    DB 'The least number is:$'  
MES2    DB 0AH,0DH,'The largest number is:$'  
NUMB    DB 0D9H,07H,8BH,0C5H,0EBH,04H,9DH,0F9H  
DDATA   ENDS  
  
CODE SEGMENT  
    ASSUME CS:CODE,DS:DDATA  
      
START: MOV  AX,DDATA  
       MOV  DS,AX  
  
       MOV  SI,OFFSET NUMB  
       MOV  CX,0008H  
       ;JCXZ A4  
       MOV  BH,[SI]  
       MOV  BL,BH  ;BL记录最小值,BH记录最大值
A1:    LODSB            ;AL=DS:[SI],SI=SI+1 取串指令  
       CMP  AL,BH  
       JBE  A2  
       MOV  BH,AL  
       JMP  A3  
A2:    CMP  AL,BL  
       JAE  A3  
       MOV  BL,AL  
A3:    LOOP A1  
  
A4:    MOV  DX,OFFSET MES1  ;show mes1  
       MOV  AH,09H        
       INT  21H   
  
       MOV  AL,BL       ;show the least number  
       AND  AL,0F0H     ;get the highest 4 bits  
       SHR  AL,4  
       CMP  AL,0AH        
       JB   C2        
       ADD  AL,07H        
C2:    ADD  AL,30H        
       MOV  DL,AL       ;show character   
       MOV  AH,02H  
       INT  21H  
       MOV  AL,BL  
       AND  AL,0FH      ;get the lowest 4 bits  
       CMP  AL,0AH  
       JB   C3  
       ADD  AL,07H  
C3:    ADD  AL,30H  
       MOV  DL,AL       ;show character   
       MOV  AH,02H  
       INT  21H  
  
       MOV  DX,OFFSET MES2  ;show mes2  
       MOV  AH,09H        
       INT  21H   
  
       MOV  AL,BH       ;show the largest number  
       AND  AL,0F0H     ;get the highest 4 bits  
       SHR  AL,4  
       CMP  AL,0AH        
       JB   C22       
       ADD  AL,07H        
C22:   ADD  AL,30H        
       MOV  DL,AL       ;show character   
       MOV  AH,02H  
       INT  21H  
       MOV  AL,BH  
       AND  AL,0FH      ;get the lowest 4 bits  
       CMP  AL,0AH  
       JB   C33  
       ADD  AL,07H  
C33:   ADD  AL,30H  
       MOV  DL,AL       ;show character   
       MOV  AH,02H  
       INT  21H  
  
       MOV  AX,4C00H    ;go back to dos  
       INT  21H  
CODE ENDS  
       END START  

练习3:双精度加法计算

要求计算X+Y=Z,将结果Z输出到屏幕上,其中X=001565A0H,Y=0021B79EH。实验利用累加器AX,先求低十六位和,并存入地址存储单元,后求高16位和,再存入高址存储单元。由于地位可能向高位有进位,因而高位相加语句需用ADC指令,则地位相加有进位时,CF=1,高位字相加时,同时加上CF中的1。在80386以上微机中可以直接使用32位寄存器和32位加法指令完成。  
;二进制双精度加法运算  
  
STACK1  SEGMENT STACK  
         DW 256 DUP(?)  
STACK1  ENDS  
  
DATA SEGMENT  
MES1    DB  'The result is:$'  
XL      DW  65A0H  
XH  DW  0015H  
YL  DW  0B79EH  
YH  DW  0021H  
DATA    ENDS  
  
CODE SEGMENT  
       ASSUME CS:CODE,DS:DATA  
START: MOV  AX,DATA  
       MOV  DS,AX  
  
       MOV  DX,OFFSET MES1  ;将MES1偏移地址给DX  
       MOV  AH,09H      ;将MES1中的内容输出到屏幕  
       INT  21H  
       MOV  AX,XL  
       ADD  AX,YL  
       MOV  BX,AX  
       MOV  AX,XH  
       ADC  AX,YH  
       PUSH BX           ;入栈保存BX  
       CALL SHWORD          ;先去执行SHWORD  
       POP  BX              ;返回继续执行BX出栈处理  
       MOV  AX,BX           ;此时AX中是低16位之和  
       CALL SHWORD          ;再次调用SHWORD  
  
       MOV  AX,4C00H  
       INT  21H  
  
SHWORD  PROC    NEAR  
       MOV  BL,AH           ;保持高16位的高8位  
       CALL SHOW            ;显示结果  
       MOV  BL,AL           ;保持高16位的低8位  
       CALL SHOW            ;显示结果  
       RET    
       ENDP  
          
SHOW    PROC    NEAR  
       PUSH AX              ;保持AX  
       PUSH DX              ;保存DX  
       MOV  AL,BL  
       AND  AL,0F0H         ;AL与0F0H相与取高4位  
       SHR  AL,4  
       CMP  AL,0AH          ;是否是A以上的数  
       JB   C2        
       ADD  AL,07H                  ;A以上的数加07H折显示的是字母     
C2:    ADD  AL,30H        
       MOV  DL,AL           ;show character   
       MOV  AH,02H  
       INT  21H  
       MOV  AL,BL  
       AND  AL,0FH          ;AL与0FH相与取低4位  
       CMP  AL,0AH  
       JB   C3  
       ADD  AL,07H  
C3:    ADD  AL,30H  
       MOV  DL,AL           ;show character   
       MOV  AH,02H  
       INT  21H  
       POP  DX  
       POP  AX  
       RET  
       ENDP   
CODE ENDS  
       END START  

猜你喜欢

转载自blog.csdn.net/liudongdong19/article/details/80612334
今日推荐