用汇编语言编写程序段,实现从键盘输入十个一位10进制数后累加以非压缩BCD码形式存放在AH和AL中.

2024-10-31 07:28:09
推荐回答(2个)
回答1:

code    segment
        assume cs:code
        org 100h
start:
        jmp bbb
lfcr    db 13,10,'$'

bbb:
        push cs
        pop ds

        call inputnum
        mov ah,9
        lea dx,lfcr
        int 21h

        lea si,array
        mov ch,0
        mov cl,byte ptr[num]
        mov ax,0
lp:
        add ax,word ptr[si]
        daa       ;  十进制加法调整指令
        inc si
        inc si
        loop lp

        call dispnum

        mov ah,4ch
        int 21h

dispnum proc near
    ;   将要显示的数据放入AL中
    mov dl,al   ; 将AL暂存在DL中
    and al,0Fh  ; 取AL的低4位
    mov bl,al   ; 非压缩的bcd码
    add bl,30h  ; 转成ASCii码
    
    mov al,dl   ; 取回AL 并经以下4次右移取出AL的高4位
    shr al,1
    shr al,1
    shr al,1
    shr al,1
    mov bh,al    ; 非压缩的bcd码
    add bh,30h   ; 转成ASCii码
    mov ax,bx    ; 非压缩的两位数的ASCii码存放在AX中
    
    mov byte ptr[y+4],al
    mov byte ptr[y+3],ah

    mov ah,9
    lea dx,y
    int 21h
    ret
y   db 10,13,0,0,0,'$'
dispnum endp

inputnum proc near
      ; 输入的数据以一个空格分隔,以回车符结束输入
      lea di,array  ;将数组第一个元素的有效地址置入DI
      mov byte ptr[num],0
stin:
      mov ax,0
      push ax
again1:
      mov ah,1
      int 21h
      mov byte ptr[char],al
      cmp al,13
      je line0
      cmp al,' '
      je line0
      sub al,30h
      mov ah,0
      mov si,ax
      pop ax
      mov cl,10
      mov ch,0
      mul cx
      add ax,si
      push ax
      jmp again1
line0:
      pop ax
      mov word ptr[di],ax
      inc byte ptr[num]
      cmp byte ptr[char],13
      je stinend
      inc di
      inc di
      jmp stin
stinend:
      ret
array dw 100 dup(0)
num   db 0
char  db ?
inputnum endp

code    ends
        end start

回答2:

data segment
  buf db 1,2,3,4,5,6,7,8,9,0
r   dw 0
f   db 0dh,0ah,'$'
data ends

code segment
  assume cs:code, ds:data
start:
  mov ax,data
  mov ds, ax

;read 10 8bit number base 10
  mov cx, 10
mov si, 0
  mov ah,1
L1:
  int 21h

;  sub al, 30h
mov buf[si], al
inc si
loop L1

;sum the 10 number
;you can do this at previous loop
  mov cx, 10
  mov si,0
  mov ax,0
L2:
  add al,buf[si]
aaa
inc si
loop L2
;到这里,执行完毕之后,ah存储高位,al存放低位
  mov r,ax

  lea dx, f
mov ah,9
int 21h

  mov dl,byte ptr r+1
mov ah,2
add dl,30h
int 21h

  mov dl,byte ptr r
add dl,30h
int 21h

  mov ah,4ch
int 21h
code ends
end start