用汇编实现任意长度的两个整数相加

    技术2022-05-11  127

    ;两个整数是用非压缩型的BCD码存储的 ;任意长度的两个数的加法 ;输入的非数字字符将被忽略 dseg segment  msg1  db "Please input the first number:",0dh,0ah,"$"  msg2 db "Please input the second number:",0dh,0ah,"$"  remsg db "The reslut is:$"  msg3 db "Any ket to quit$"  b1_len dw 0  buf_1 db 100 dup(0)  b2_len dw 0  buf_2 db 100 dup(0) dseg ends ;######################################################## cseg segment  assume cs:cseg,ds:dseg ;****************************************** main proc far  ;start of the program  mov  dx,dseg  mov  ds,dx  lea  dx,msg1  mov  ah,09  int  21h    lea  bx,buf_1 ;input the first number  call input    call newline  lea  dx,msg2  mov  ah,09  int  21h    lea  bx,buf_2 ;input the second number  call input  call  adder    call newline  lea  dx,remsg  mov  ah,09  int  21h  lea  bx,buf_1  call show    call newline  lea  dx,msg3  mov  ah,09  int  21h  call ktq  ;any Key To Quit exit:  mov  ah,4ch  int  21h  ret main endp ;****************************** newline proc near ;回车换行  push ds  push dx  push ax    mov  dl,0ah  mov  ah,02  int  21h    mov  dl,0dh  mov  ah,02  int  21h    pop  ax  pop  dx  pop  ds  ret newline endp ;************************ input proc near  ;bx:数组首地址,第一个元素方长度  push ds  push ax  push dx  ;----------------------------------------  xor  si,si  ;clear si to zero  inc  si next:  cmp  si,100  je  over  ;over  mov  ah,01  int  21h  cmp  al," "  je  over  ;input over  cmp  al,0dh  je  over  cmp  al,"0"  ;忽略其他字符  jb  next  cmp  al,"9"  ja  next  sub  al,30h  ;to 十进制       ;  非压缩型BCD码  mov  [bx+si],al  inc  si  jmp  next  over:  dec  si  mov  word ptr [bx-1],si ;save length  ;--------------------------------------  pop  dx  pop  ax  pop  ds  ret input endp ;****************** show proc near  ;bx:数组首地址  push ds  push ax  push dx  ;-----------  mov  cx,[bx-1] ;length of the array  xor  si,si  inc  si nextsh:  mov  ah,02  mov  dl,byte ptr [bx+si]  add  dl,30h  ;to ASSII  int  21h  inc  si  loop nextsh  ;-----------  pop  dx  pop  ax  pop  ds  ret show endp ;******************* ;未完成 adder proc near ;buf_1,buf_2分别是数组的首地址                 ;结果放到buf_1数组中                 ;进位CF  push ds  push ax  push dx  ;----------------------------------------------  mov  si,word ptr [buf_1-1]  ;si存放bx的长度  mov  cx,si  mov  di,word ptr [buf_2-1]  ;di存放bp的长度  xor  dl,dl                  ;clear dl  cmp  cx,di  mov  word ptr [buf_1-1],cx  jae  continue               ;cx存放两个数组中较大一个的长度  mov  cx,word ptr [buf_2-1]  mov  word ptr [buf_1-1],cx  ;修改结果的长度 continue:  mov  al,dl  xor  dl,dl                  ;clear dl to zero  cmp  si,0  je  si_z  add  al,[buf_1+si]  dec  si  jmp  L_DI si_z:  add  al,0 L_DI:  cmp  di,0  je  di_z  add  al,byte ptr [buf_2+di]  dec  di  aaa  adc  dl,0  jmp  conti di_z:  add  al,0  aaa  adc  dl,0  ;^^^^ conti:  mov  bx,cx  mov  [buf_1+bx],al  loop continue  ;----------------------------------  pop  dx  pop  ax  pop  ds  ret adder endp ;******************* ktq proc near  mov  ah,08  int  21h  ret ktq endp ;******************** cseg ends ;###############################################################  end  main

    最新回复(0)