编写汇编程序,在无符号数组中查找从键盘输入的无符号数,若存在则输出该数在数组中的位置和该数,若不存在则输出错误信息。

提示:以下是本篇文章正文内容,下面案例可供参考


提示:以下是本篇文章正文内容,下面案例可供参考

代码如下(示例):

DATA SEGMENT
    data1    dw      0,1,2,3233,4,5,6,7,8,9   
    INPUTTIPS        DB                 'Please input score,divid with "  ":$'
ERRORTIPS        DB          'input ERROR!,please try again!$'
tips             DB           'not find$'
sii1            dB         0

ENDTIPS         DB                    'results:$'

DATA ENDS

STACK SEGMENT
       DB                 200   DUP(0) 
STACK ENDS

CODE SEGMENT
    ASSUME CS:CODE,DS:DATA,SS:STACK
START:
    MOV AX,DATA
              MOV DS,AX
              MOV AX,STACK
              MOV SS,AX
        CALL BEGIN
            

            
            
            CALL INPUT;    显示results 
                
            CALL NEXT   
            call PRINT 
    
    ;此处输入代码段代码
    MOV AH,4CH
    INT 21H

;========================BEGIN=============================
BEGIN PROC NEAR
 
                                MOV DX,OFFSET INPUTTIPS ;显示提示输入
                                MOV AH,09H ;09h表示显示字符串
                                INT 21H ;调用dos
 
                                XOR AX,AX                                
                                XOR BX,BX
                                XOR CX,CX
                                XOR SI,SI
                                XOR DI,DI  ;寄存器清零
 
                       
                RET
BEGIN ENDP
;==========================INPUT==========================
INPUT PROC NEAR                  
                MOV AH,1  ;键盘输入并回显 al等于输入字符
                                INT 21H    ;从键盘输入数据
                                CMP AL,0DH ;回车键为0DH
                                JZ ENDINPUT     ;zf(零标志位)=1跳转,是否为回车键
                               
 
               CMP AL,30H
                                JB   ERROR;左小于右跳转
               CMP AL,39H
               JA    ERROR;左大于右跳转,0-9的ascii码为30h到39h
 
                                SUB AL,30H ;变为真数
                                MOV CL,4 
                                SHL BX,CL ;左移四位.变为BCD码(二进码十进数)四位二进制表示1位十进制
                                ADD BL,AL
                                JMP INPUT
ENDINPUT:             
 
                                MOV DX,OFFSET ENDTIPS ;显示输出提示
                                MOV AH,09H
                                INT 21H    ;DI得到个数,DI保持不变化
                JMP INPUTEND
ERROR:             mov dx,offset ERRORTIPS
                mov ah,09h
                int 21h
                CALL NEXT
                jmp START
              
    
INPUTEND:                RET
INPUT ENDP
;========================PRINT========================
PRINT PROC NEAR    
            MOV SI,0        
            ADD sii1,1
            
            call BCD_TO_HEN
            MOV CX,10
            
            
            mov si,offset data1

    LMAX:    
            
            
            CMP BX,[si]
            
                    JE NEXT1 
                ADD sii1,1
                ADD SI,2
            LOOP LMAX
    NEXT1:
            ;ADD SI,1
            ;LOOP LMAX
            ;XOR BX,BX
            ;MOV bx,sii1
               ; CALL PRINTINT
                ;MOV AL,sii1
                ;ADD AL,30H
              ;call PRINTINT
                
               
              call PRINTINT
                add sii1,30H
                CMP sii1,30H
                                JB   next2;左小于右跳转
               CMP sii1,39H
               JA    next2;左大于右跳转,0-9的ascii码为30h到39h
               MOV DL,sii1
               MOV AH,02h
               INT 21h
            
            
            RET
next2:
        
        mov dx,offset tips
        mov AH,09h
        int 21h
        ret
PRINT ENDP 

              
;========================换行========================
NEXT: 
    mov dl,0ah;换行对应ASCII码
    mov ah,02h
    int 21h
    mov    dl,0dh;回车对应的ASCII码
    mov    ah,02h;输出DL内容
    int    21h
    ret
;==========

;========================BCD转换为十六进制========================
BCD_TO_HEN PROC NEAR
 
        PUSH CX
        PUSH AX  
        PUSH DX 
        PUSH SI
        PUSH DI 
        XOR DX, DX
        
        MOV AX, BX 
        PUSH AX
        AND AX,0F000H;取千位数
        MOV CL, 4    ;移位取出十位数
        SHR AX, CL
        MOV DH, AH
        POP AX  
        
        PUSH AX
        AND AX, 0F00H  ;取百位数
        MOV DL, AH 
        POP AX  
        
        PUSH AX
        MOV AX, DX
        AAD                                  
        MOV DI, 100  ;乘100
        MUL DI                                 
        MOV SI, AX
        POP AX 
        
        PUSH AX       
        MOV CL, 4    ;移位取出十位数
        SHR AX, CL
        AND AX, 000FH  
        MOV DH, AL
        POP AX  
        
        PUSH AX
        AND AX, 000FH   ;取AL低四位,个位数
        MOV DL, AL 
        POP AX 
        
        MOV AX, DX
        AAD 
        ADD AX, SI
        
        MOV BX, AX ;转换结果给BX         
        
        POP DI
        POP SI
        POP DX      
        POP AX 
        POP CX
        RET
BCD_TO_HEN ENDP
;========================4位十六进制转换为BCD========================           
HEN_TO_BCD PROC NEAR
        PUSH AX
                PUSH CX
        PUSH DX
        XOR DX,DX
        MOV AX,BX
        MOV BX,0000H
                MOV CX,1000
                DIV CX
        
        
        MOV CL,4
        AND AX,000FH
        ADD BX,AX
        ROL BX,CL
        
       
                MOV AX,DX ;余数再放到AX里面
                MOV CL,100
                DIV CL
        PUSH AX
                AND AX,000FH
        ADD BX,AX
        MOV CL,4
        ROL BX,CL
        POP AX
 
                MOV AL,AH;余数再除10
                AND AX,00FFH
                MOV CL,10
                DIV CL
               AND AL,0FH
        ADD BL,AL
        MOV CL,4
        ROL BX,CL
 
                ADD BL,AH
 
              POP DX
                POP CX
                POP AX
         RET
HEN_TO_BCD ENDP

;====================打印16进制数为BCD整数====================
PRINTINT PROC NEAR
            PUSH BX
            PUSH CX
                PUSH AX
                PUSH DX
 
            MOV AX,BX   
            CALL HEN_TO_BCD ;结果在转换为BCD码
             MOV DL,BH
             MOV CL,4
                        SHR DL,CL
                        ADD DL,30H
                        CMP DL,30H 
                        JZ l1
                        MOV AH,02H;输出千位数
                        INT 21H
        
l1:            MOV DL,BH   ;输出百位数
                       AND DL,0FH
                       ADD DL,30H
                       CMP DL,30H 
                        JZ l2
                       MOV AH,02H
                       INT 21H
l2:                MOV DL,BL       ;输出十位数
                            MOV CL,4
                            SHR DL,CL
                            ADD DL,30H
                            CMP DL,30H 
                        JZ l3
                           MOV AH,02H
                            INT 21H
l3:                        MOV DL,BL   
                        and dl,0FH    ;输出个位数
                            ADD DL,30H
                            MOV AH,02H
                            INT 21H
        MOV DL,20H ;输出空格
                                MOV AH,02H
                                INT 21H
            
 
            POP DX
            POP AX                                                                                         
                    POP CX
            POP BX
                    RET       
PRINTINT ENDP




CODE ENDS
    END START

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值