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

📄 wenjia.asm

📁 一个无符号的加法器小程序
💻 ASM
字号:
data segment
str1 db 20
     db ?
     db 20 dup(?)
str2 db 20
     db ?
     db 20 dup(?)
str4 db 'input bei jiashu:$'  
str5 db 'input jiashu:$'
str6 db "the result is:"
str3 db 20 dup(?),'$'
data ends
  
  

code segment
assume cs:code,ds:data
start:
     mov ax,data
     mov ds,ax
     mov es,ax
    
     mov ah,0        
     mov al,3        ;文本 16*8
     int 10h 
      

     mov ah,2        ;置框表类型 
     mov bh,0        ;页数
     mov dh,10       ;行数   
     mov dl,25       ;列数
     int 10h
 
    
     mov ah,9             ;显示字符串
     mov dx,offset str4
     int 21h
 
    
     mov ah,0ah           ;输入被加数
     mov dx,offset str1
     int 21h


     mov ah,2        ;置框表类型   
     mov bh,0        ;页数
     mov dh,12       ;行数   
     mov dl,25       ;列数
     int 10h
 
    
     mov ah,9             ;显示字符串
     mov dx,offset str5
     int 21h
 
    
     mov ah,0ah           ;输入加数
     mov dx,offset str2
     int 21h

     mov si,offset str1+2
     mov cl,str1+1
     mov ch,0

again1:
   mov al,[si]          ;将字符1转化为数据
   and al,0fh
   mov [si],al
   inc si
   loop again1

   mov di,offset str2+2
   mov cl,str2+1
   mov ch,0

again2:
   mov al,[di]          ;将字符2转化为数据
   and al,0fh
   mov [di],al
   inc di
   loop again2
   
   mov si,offset str1+1    ;1长度偏移地址
   mov di,offset str2+1    ;2长度偏移地址 
   mov bl,str1+1           ;1长度
   cbw                     ;将BL扩展为BX  
   adc si,bx               ;移到被加数第一个参与数的地址
   
   mov al,str2+1           
   cbw    
   adc di,ax               ;移到加数第一个参与数的地址              
   cmp bl,al               ;比较二者长短
   jae cha                 ;被加数长的就跳到CHA
   xchg si,di              ;若加数长,则交换操作数
   xchg bl,al              ;交换指令

cha:
   push bx                 ;将长的长度进栈
   sub bl,al               
   mov dx,bx               ;两长度之差
   mov ch,0                
   pop bx
   lea bx,str3[bx]         ;取得和的偏移地址
   mov cx,ax               ;循环次数
   clc                     ;进位位置0

lop1:
   
   mov al,[di]             ;短
   add al,[si]             ;加
   cmp al,0ah              ;判断是否>=10
   jae lp1                 ;有进位则跳到LP1
   or al,30h
   mov [bx],al             ;无进位则将内容放到和中
   
   dec si                  ;从左到右
   dec di
   dec bx
   loop lop1
   mov byte ptr[bx],0
   
   mov cx,dx
   jcxz done               ;cx=0循环结束跳转
   jmp lop2

lp1:
   sub al,0ah              
   or al,30h
   mov [bx],al
   dec di
   dec si
   dec bx
   add byte ptr[si],1      ;进位加一个字节
   loop lop1 
                            
   mov cx,dx               ;将余下未加的
   jcxz done 
      
lop2:
   
    mov al,byte ptr[si]         
    cmp al,0ah             ;判断进位
    jae lp2
   
    
    or al,30h
    mov [bx],al            ;无进位则直接搬下来
    dec bx
    dec si
   
    loop lop2
    jmp done

    mov cx,dx              
lp2:
    
    sub al,0ah            ;有进位时
    or al,30h
    mov [bx],al
    dec di
    dec si
    dec bx
    add byte ptr[si],1    ;进位加一
    cmp si,1             
    jz lp3               
    cmp di,1
    jz lp3                ;有进位
    
    loop lop2

lp3:
    mov byte ptr[bx],1    
    mov al,byte ptr[bx]   
    or al,30h
    mov byte ptr[bx],al   ;结束
     
    

done:
   mov ah,2
   mov bh,0
   mov dh,14
   mov dl,25
   int 10h


   mov ah,09h
   mov dx,offset str6
   int 21h


   mov ah,2
   mov bh,0
   mov dh,14         ;行数
   mov dl,45         ;列数
   int 10h
   
   mov ah,4ch
   int 21h
   
code ends
     end start 
                 

⌨️ 快捷键说明

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