;计算 a * b,其中a b的位数可以在 1 - 2^8 之间,默认位数为 50;注意 a,b 必须为正数否则结果不正确;****************************************************************** .model small.const MAX equ 50 ;乘数的最大位数.data a db MAX,MAX dup(0) b db MAX,MAX dup(0) r db MAX+MAX+1 dup(0) txta db 'Enter a:$' txtb db 'Enter b:$' result db 'a * b = $' enter db 13,10,'$'.code ;------------------------------------------------------------------;子程序,在屏幕上打印回车;------------------------------------------------------------------PtEnter proc near mov dx,offset enter mov ah,09h int 21h retPtEnter endp ;------------------------------------------------------------------;在提示下输入数据,提示信息为 si ,数据输入到 di;------------------------------------------------------------------GetData proc near mov dx,si mov ah,09h int 21h mov dx,di mov ah,0ah int 21h call PtEnter retGetData endp ;------------------------------------------------------------------;主过程;------------------------------------------------------------------main proc far mov ax,@data mov ds,ax ; 从键盘接收输入,注意这里没有对输入进行检查 mov si,offset txta mov di,offset a call GetData mov si,offset txtb mov di,offset b call GetData ;准备从 a 中取数 mov si,offset a inc si mov ax,0 mov al,byte ptr[si] mov byte ptr[si],0dh ;设置哨兵 add si,ax ;准备从 b 中取数 mov di,offset b inc di mov dx,0 mov dl,byte ptr[di] mov byte ptr[di],0dh ;设置哨兵 add di,dx ;初始化结果 r mov bx,offset r add bx,ax add bx,dx inc bx mov byte ptr[bx],'$' dec bx ;开始计算 mov ch,10scana: mov cl,byte ptr[si] dec si cmp cl,0dh jz putout sub cl,30h push di push bx mov dx,0scanb: mov al,byte ptr[di] dec di cmp al,0dh jz next sub al,30h mul cl add ax,dx add al,byte ptr[bx] div ch ;ch 里存的是10 计算时 ch 不变 mov dl,al ;商在 al 里作为下次计算的进位 mov byte ptr[bx],ah dec bx jmp scanb ; 最后的进位处理next: cmp dl,0 jz dlzero mov al,dl mov byte ptr[bx],al jmp dlnotzerodlzero: inc bxdlnotzero:mov dx,bx pop bx pop di dec bx jmp scana putout: mov bx,dx push bx ; 将结果转换为 ascii 码形式nextr: mov al,byte ptr[bx] cmp al,'$' jz printr add al,30h mov byte ptr[bx],al inc bx jmp nextr ; 输出结果printr: pop bx mov dx,offset result mov ah,09h int 21h mov dx,bx mov ah,09h int 21h ; 返回 DOS mov ah,4ch int 21hmain endp end main

评论