汇编语言上机实验(一)程序

这是我编写的上次的上机实验的程序

首先给一个简单的流程图:

下面是代码:

DATA SEGMENT
    BUFFER_A DB 14, ?, 14 DUP(?)  ;输入缓冲区
    BUFFER_B DB 14, ?, 14 DUP(?)  ;输入缓冲区
    PRINT_A DB 'To Input A: ', '$' ;输出字符串A提示
    PRINT_B DB 'To Input B: ', '$' ;输出字符串B提示
    PNT_a DB 'A: ', '$'   ;输出A
    PNT_b DB 'B: ', '$'   ;输出B
    PNT_1 DB '1', '$'   ;输出1
    ERROR_info DB 'To many input ', '$' ;输出错误提示信息--输入太多
    erro_info DB 'Please input number', '$';输出错误提示信息--输入不是数字
    PRINT_exit db 'Press Any Key to Exit...', '$'
    CLRF DB 0DH, 0AH, '$'
DATA ENDS

STACKS SEGMENT
   ; DW 64 DUP('ST')
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATA,SS:STACKS
MAIN PROC FAR
 
 MOV AX, DATA
 MOV DS, AX
 
 MOV AH, 9  ;输出提示信息,请输入A的值
 LEA DX, PRINT_A
 INT 21H
 
 MOV AH, 0AH  ;输入A的值
 LEA DX, BUFFER_A
 INT 21H
 
 MOV AH, 9  ;输出回车换行
 LEA DX, CLRF
 INT 21H

 MOV CL, BUFFER_A + 1 ;取接受到A的字符个数存在CX中
 CMP CL, 10  ;检查是否超过设定位数
 JGE ovdrflow  
 
 XOR CH, CH
 
 XOR DX, DX  ;DX清0
 
 LEA SI, BUFFER_A + 2  ;SI指向接受到A的第一个字符
 MOV AH, 2
A3: MOV DL, [SI]     ;取输入A的字符最后一位
 CMP DL, 57  ;检查是否是数字
 JG erro
 CMP DL, 48
 JL erro
 INC SI
 LOOP A3
 
 XOR AX, AX
 MOV AL, DL ;对最后一位除2,看A是否是奇数
 MOV BL, 2  ;
 DIV BL
 
 XOR BH, BH
 CMP AH, BH
 JNE AISJ  ;A是奇数跳转

 ;下面输入B 
 MOV AH, 9  ;输出提示信息 输入B
 LEA DX, PRINT_B
 INT 21H
 
 MOV AH, 0AH  ;输入B的值
 LEA DX, BUFFER_B
 INT 21H
 
 MOV AH, 9  ;输出回车换行
 LEA DX, CLRF
 INT 21H
 
 MOV CL, BUFFER_B + 1 ;取接受到B的字符个数存在CL中
 CMP CL, 10  ;检查是否超过设定位数
 JGE ovdrflow  
 XOR CH, CH
 
 XOR DX, DX  ;DX清0
 
 LEA SI, BUFFER_B + 2  ;SI指向接受到B的第一个字符
 MOV AH, 2
Ab: MOV DL, [SI]      ;取输入B的字符最后一位
 CMP DL, 57  ;检查是否是数字
 JG erro
 CMP DL, 48
 JL erro
 INC SI
 LOOP Ab
 
 XOR AX, AX
 MOV AL, DL  ;对最后一位除2
 MOV BL, 2  ;
 DIV BL
 
 XOR BH, BH
 CMP AH, BH
 JNE BISJ_aiso
 JMP output
 
 ;下面输入B
AISJ:  MOV AH,  9  ;输出提示信息 输入B
 LEA DX, PRINT_B
 INT 21H
 
 MOV AH, 0AH  ;输入B的值
 LEA DX, BUFFER_B
 INT 21H
 
 MOV AH, 9  ;输出回车换行
 LEA DX, CLRF
 INT 21H
 
 MOV CL, BUFFER_B + 1 ;取接受到B的字符个数存在CL中
 CMP CL, 10    ;检查是否超过设定位数
 JGE ovdrflow  
 XOR CH, CH
 
 XOR DX, DX  ;DX清0
 
 LEA SI, BUFFER_B + 2  ;SI指向接受到B的第一个字符
 MOV AH, 2
Ab_j: MOV DL, [SI]      ;取输入B的字符最后一位
 CMP DL, 57  ;检查是否是数字
 JG erro
 CMP DL, 48
 JL erro
 INC SI
 LOOP Ab_j
 
 XOR AX, AX
 MOV AL, DL  ;对最后一位除2
 MOV BL, 2  ;
 DIV BL
 
 XOR BH, BH
 CMP AH, BH ;看余数是否为0
 JNE BISJ_aisj
 JMP output

BISJ_aiso:  LEA SI, BUFFER_A + 1 ;SI指向A的第一个字符
   
   LEA DI, BUFFER_B + 1 ;DI指向B的第一个字符
   
   MOV CL, 10  ;A,B交换
   XOR CH, CH
Rev:   MOV AL, [SI]
   MOV AH, [DI]
   MOV [SI], AH
   MOV [DI], AL
   INC SI
   INC DI
   LOOP Rev
   JMP output

BISJ_aisj:  XOR AL, AL  ;清空AL
   MOV CL, BUFFER_A + 1
   XOR CH, CH
   LEA SI, BUFFER_A + 2
getLAST_A:  MOV DL, [SI]  ;取A的最后一个字符
   INC SI
   LOOP getLAST_A
    
   DEC SI
    
   MOV CL, BUFFER_A + 1
loop_a:   INC DL    ;对最后一位加1
    CMP DL, 58
    JL copy_a
    MOV AL, 48
    MOV [SI], AL ;改为0
    DEC SI   ;SI向前移
    MOV DL, [SI]
    LOOP loop_a
copy_a:   MOV [SI], DL
    CMP CX, 0
    JNE out1
    
    XOR BX, BX
    MOV BL, 1
    
    ;处理B
        
out1:   XOR AL, AL  ;清空AL
    MOV CL, BUFFER_B + 1
    XOR CH, CH
    LEA SI, BUFFER_B + 2
getLAST_B:  MOV DL, [SI]  ;取A的最后一个字符
    INC SI
    LOOP getLAST_B
    
    DEC SI
    
    MOV CL, BUFFER_B + 1
loop_b:   INC DL  ;对最后一位加1
    CMP DL, 58
    JL copy_b
    MOV AL, 48
    MOV [SI], AL ;改为0
    DEC SI   ;SI向前移
    MOV DL, [SI]
    LOOP loop_b
copy_b:   MOV [SI], DL
    CMP CX, 0
    JNE output

    MOV BH, 1
 
 
output: MOV AH, 9  ;输出A提示信息
  LEA DX, PNT_a
  INT 21H
  
  CMP BL, 1
  JNE zhijie_a
  
  MOV AH, 9
  XOR DX, DX
  LEA DX, PNT_1
  INT 21H
  
zhijie_a: MOV CL, BUFFER_A + 1 ;取A字符个数存在CX中
   XOR CH, CH
 
  XOR DX, DX
  LEA SI, BUFFER_A + 2   ;SI指向接受到的第一个字符
  MOV AH, 2
Aa_o:  MOV DL, [SI]      ;
  ;ADD DL, 1
  INT 21H      ;输出A的值
  INC SI
  LOOP Aa_o
  
  MOV AH, 9  ;输出回车换行
  LEA DX, CLRF
  INT 21H
  
  MOV AH, 9  ;输出提示信息B
  LEA DX, PNT_b
  INT 21H
  
  CMP BH, 1
  JNE zhijie_b
  
  MOV AH, 9
  XOR DX, DX
  LEA DX, PNT_1
  INT 21H
  
zhijie_b:  MOV CL, BUFFER_B + 1 ;取B的字符个数存在CX中
    XOR CH, CH
 
  XOR DX, DX
  LEA SI, BUFFER_B + 2   ;SI指向接受到的第一个字符
  
  MOV AH, 2
Ab_o:  MOV DL, [SI]    
  INT 21H    ;输出B的值
  INC SI
  LOOP Ab_o
 
  MOV AH, 9   ;输出回车换行
  LEA DX, CLRF
  INT 21H
  JMP procend

erro: MOV AH, 9
  LEA DX, erro_info
  INT 21H
  JMP procend

ovdrflow: MOV AH, 9
   LEA DX, ERROR_info
   INT 21H
  
procend: MOV AX, 4C00H
   INT 21H
 
MAIN ENDP
CODES ENDS
    END MAIN

这个只是我们的第一道练手题,后面还有更多的题目,以后再给。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值