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

📄 asmd.asm

📁 这是我自己用asm编写的汇编语言-(十位数加减法)。
💻 ASM
字号:
dat segment
    a db 10 dup(0)
    b db 10 dup(0)
    z db 11 dup(0)
    c db 20 dup(0)
    d db ?
    e db "输入十位以内的算术运算式",0ah,0dh,"$"
    f db "输入错误,请重新$"
    g db "继续运算吗?(y/n)[n]$"
dat ends
cod segment
    assume cs:cod,ds:dat
start:
    mov ax,dat
    mov ds,ax                     ;置段寄存器
;_______________________________________________________
begin:                            ;以下清除a,b,c(qingling)
    mov cx,10
    mov bx,0
cls0:
    mov a[bx],0
    mov b[bx],0
    mov z[bx],0
    mov [c+10][bx],0
    inc bx
    loop cls0
    mov z+10,0
    mov cx,10
    mov bx,0
 qc:
    mov c[bx],0
    inc bx
    loop qc
    mov ah,9                    ;显示提示信息字符串e
    lea dx,e
    int 21h
;_______________________________________________________
    mov cx,10                   ;以下输入a
    mov bx,0
    mov ah,1
ina:
    int 21h
    cmp al,"+"
    je  c1
    cmp al,"-"
    je  c1
    cmp al,"*"                  ;判断是否为"*"号
    je  c1
    cmp al,"/"
    jne la1
    mov d,al                    ;"*"号保存
    jmp movea                   ;转到移动a
la1: 
    cmp al,30h                  ;判断是数字
    jb err                      ;否转错误自理
    cmp al,39h
    ja err
    and al,0fh                  ;是转化为数值并存入a 
    mov a[bx],al
    inc bx                      ;修改地址
    loop ina                    ;循环输入
    int 21h                     ;输入运算符
    cmp al,"+"
    je  d1
    cmp al,"-"
    je  d1
    cmp al,"*"                  ;判断是否为运算符
    je  d1                     ;否转错误处理
    cmp al,"/"
    jne err
d1:  
    mov d,al                    ;是保存
    jmp inb                    ;转输入b
;____________________________________________________
err:
    mov dl,0ah
    mov ah,2
    int 21h
    mov dl,0dh
    int 21h
    mov ah,9
    lea dx,f
    int 21h
    jmp begin                   ;错误处理
;____________________________________________________
c1:
   mov d,al
movea:
    mov dx,10
    sub dx,cx
    mov si,cx
    mov cx,dx
    dec bx
mova:
    mov al,a[bx]
    mov a[bx][si],al
    mov a[bx],0
    dec bx
    loop mova                  ;循环移位a
;____________________________________________________

inb:                           ;输入b
    mov cx,10
    mov bx,0
    mov ah,1
inb1:
    int 21h
    cmp al,"="                 ;判断是否为"="号
    jne lb1
    jmp mov_b                  ;是转移动b
lb1:
    cmp al,30h                ;否判断是否为字符
    jb err                     ;不是转错误处理
    cmp al,39h
    ja err
    and al,0fh                 ;是转化为数字并保存
    mov b[bx],al
    inc bx                     ;修改地址
    loop inb1                  ;循环输入
    int 21h                    ;输入"="
    cmp al,"="                 ;判断是否为等号
    jne  err
    mov al,d                ;否转错误处理
    cmp al,"+"
    je  j_add
    cmp al,"-"
    je  j_sub
    cmp al,"*"
    je  d2
    cmp al,"/"
    jne err
    jmp bj
 d2:
    jmp c_mul
mov_b:                         ;移位b
    mov dx,10
    sub dx,cx
    mov si,cx
    mov cx,dx
    dec bx
movb:
    mov al,b[bx]
    mov b[bx][si],al
    mov byte ptr b[bx],0
    dec bx
    loop movb
    cmp d,"+"
    je  j_add
    cmp d,"-"
    je  j_sub
    cmp d,"*"
    je  w3
    cmp d,"/"
    je  w4
    jmp err
 w3:
    jmp c_mul
 w4:
    jmp bj
;____________________________________________________
j_add:
    mov cx,10
    mov bx,9
    clc
j_ad:
    mov al,a[bx]
    adc al,b[bx]
    aaa
    mov [c+10][bx],al
    dec bx
    loop j_ad
    adc [c+9],0           
    jmp out_c             ;加法运算
;____________________________________________________
j_sub:
    mov cx,10
    mov bx,0
  x:
    mov al,a[bx]
    cmp al,b[bx]
    jb  j_sub2
    ja  j_sub1
    inc bx
    loop x
j_sub1:
    mov cx,10
    mov bx,9
    clc
j_su1:
    mov al,a[bx]
    sbb al,b[bx]
    aas
    mov [c+10][bx],al
    dec bx
    loop j_su1
    jmp out_c                           
j_sub2:
    mov ah,2
    mov dl,2dh
    int 21h
    mov cx,10
    mov bx,9
    clc
j_su2:
    mov al,b[bx]
    sbb al,a[bx]
    aas
    mov [c+10][bx],al
    dec bx
    loop j_su2  
    jmp out_c          ;减法运算
;____________________________________________________
c_mul:
    mov bx,9
 m1:
    mov di,10
    mov si,9
    mov [z+1][si],0
    mov cx,10
 m2:
    mov al,a[si]
    mul b[bx]
    aam
    add al,[z+1][si]
    aaa
    mov [z+1][si],al
    mov z[si],ah
    dec si
    loop m2
    mov cx,11
    mov si,10
    clc
 m3:
    mov al,c[di][bx]
    adc al,z[si]
    aaa
    mov c[di][bx],al
    dec di
    dec si
    loop m3
    cmp bx,0
    jne w2
    jmp out_c
 w2:
    dec bx
    jmp m1               ;乘法运算
;_____________________________________________________
bj:
    mov cx,10
    mov bx,0
 l1:
    mov al,a[bx]
    cmp al,b[bx]
    ja  j_subd
    jb  outcd
    inc bx
    loop l1
    mov cx,10
    mov bx,0
 l2:
    mov al,a[bx]
    cmp al,0
    jne j_subd
    inc bx
    loop l2
    jmp outcd
j_subd:
    mov cx,10
    mov bx,9
    clc
 l3:
    mov al,a[bx]
    sbb al,b[bx]
    aas
    mov a[bx],al
    dec bx
    loop l3
j_addd:
    mov bx,9
    clc
    mov al,c[bx]
    adc al,1
    aaa
    mov c[bx],al
    dec bx
    mov cx,9
 l4:
    mov al,c[bx]
    adc al,0
    aaa
    mov c[bx],al
    dec bx
    loop l4
    jmp bj
outcd:
    mov cx,10
    mov bx,0
    mov ah,2
 l5:
    mov al,c[bx]
    cmp al,0
    jne l6
    inc bx
    loop l5
    mov dl,30h
    int 21h
    jmp sys
 l6:
    mov dl,c[bx]
    or  dl,30h
    int 21h
    inc bx
    loop l6
sys:
    mov cx,10
    mov bx,0
 k2:
    mov al,a[bx]
    cmp al,0
    jne k3
    inc bx
    loop k2
    jmp ts
 k3:
    push cx
    mov cx,6
 k4:
    mov dl,"*"
    int 21h
    loop k4
    pop cx
 k5:
    mov dl,a[bx]
    or  dl,30h
    int 21h
    inc bx
    loop k5
    jmp ts
;____________________________________________________                    
out_c:
    mov cx,20                  ;输出结果
    mov ah,2
    mov bx,0
cmp0:
    mov al,c[bx]
    cmp al,0                   ;无效数字不输出
    jne out_c1
    inc bx
    loop cmp0
    mov dl,30h
    int 21h
    jmp ts
out_c1:
    mov dl,c[bx]
    or dl,30h
    int 21h                    ;输出有效数字
    inc bx
    loop out_c1
    mov dl,0ah
    int 21h
    mov dl,0dh
    int 21h
;_______________________________________________________
ts:
    mov ah,9                   ;显示选择信息
    lea dx,g
    int 21h
    mov ah,7                   ;输入一个字符
    int 21h
    cmp al,"y"                 ;判断是否为Y或y
    jne cmpy
    jmp hc
cmpy:
    cmp al,"Y"
    jne exit_dos               ;否返回操作系统
hc:
    mov ah,2
    mov dl,0ah
    int 21h
    mov dl,0dh
    int 21h
    jmp begin                  ;是重新开始运算
;_____________________________________________________
exit_dos:
    mov ah,4ch
    int 21h                    ;返回操作系统
;_____________________________________________________
cod ends
    end start






⌨️ 快捷键说明

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