汇编网首页登录博客注册
masmaster的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
文章收藏

[2010-09-16 09:19] 习题4.33

图片载入中
请编写一个可实现两个在0-65535范围内的整数进行加减乘除运算的小型工具。

答:
;-----------------------------------------------------;
assume        cs:code,ds:data,ss:stack
data        segment
errmsg        db        'Input error or out of compass$'
vara        dw        0                         ;值a
varb        dw        0                         ;值b
sign        db        0                         ;符号
tab        dw        10000,1000,100,10,1       ;转换表
data        ends
stack        segment stack                     ;栈段
        dw 128 dup (0)
stack        ends
code        segment
start:
        mov ax,data                       ;数据段
        mov ds,ax
;处理命令行中的算术表达式
;并对非法字符做出处理
;es:82h
        mov cx,es:80h
        and cx,0fh        
        dec cx
        lea bx,es:82h
        mov si,0                ;si=lengthof vara
        mov di,0                ;di=lengthof varb
tj1:        
        mov al,es:[bx]
        cmp al,'0'
        jb a
        cmp al,'9'
        ja _err
        inc si
        inc bx
        jmp tj1
a:        cmp al,'+'
        jz fh
        cmp al,'-'
        jz fh
        cmp al,'*'
        jz fh
        cmp al,'/'
        jz fh
        jmp _err
fh:        mov sign,al
tj2:        inc bx
        mov al,es:[bx]
        cmp al,0dh
        jz tc
        cmp al,'0'
        jb _err
        cmp al,'9'
        ja _err
        inc di
        jmp tj2
tc:        
;处理完毕
        push di                ;值b个数在DI中
        push si                ;值a个数在SI中
;将值a做ASCII到BCD的转换并将结果存放至单元vara中
        pop cx                ;recover vara
        dec cx
        lea bx,es:82h
        add bx,cx
        mov si,offset tab
        add si,8
        inc cx
        mov di,0
loada:
        mov al,es:[bx]
        sub al,30h
        xor ah,ah
        mul word ptr [si]
        jc _err
        add vara,ax
        dec bx
        sub si,2
        inc di
        loop loada
;将值b做ASCII到BCD的转换并将结果存放至单元varb中
        pop cx                ;recover varb
;        dec cx
        lea bx,es:82h
        add bx,di
        add bx,cx
        mov si,offset tab
        add si,8
loadb:        
        mov al,es:[bx]
        sub al,30h
        xor ah,ah
        mul word ptr [si]
        jc _err
        add varb,ax
        dec bx
        sub si,2
        loop loadb
;开始计算,检查sign
;begin counter
        cmp sign,2bh  ;加法
        jz _add
        cmp sign,2dh  ;减法
        jz _sub
        cmp sign,2ah  ;乘法
        jz _mul        
        cmp sign,2fh  ;除法
        jz _div
;加法运算
;High 16bit in DX,Low 16bit in AX
_add:        
        xor ax,ax
        xor dx,dx
        mov ax,vara
        add ax,varb
        adc dx,0
        jmp disp
;减法运算
;result in ax
_sub:        
        xor ax,ax
        mov ax,vara
        cmp ax,varb
        ja a_b
        sub varb,ax
        xchg ax,varb
        jmp _neg
a_b:        sub ax,varb        
        xor dx,dx
        jmp disp
_neg:        
        push ax
        mov dl,'-'
        mov ah,2
        int 21h
        pop ax                        
        xor dx,dx
        jmp disp
;乘法运算
;High 16bit in DX,Low 16bit in AX
_mul:
        xor ax,ax
        xor dx,dx
        mov ax,vara
        mul varb
        jmp disp
;除法运算
;result in ax
_div:
        xor ax,ax
        xor dx,dx
        mov ax,vara
        div varb
        xor dx,dx
        jmp disp
;显示运算结果
disp:
        call show      ;调用显示子程序
        jmp over                        
;出错信息
_err:        mov dx,offset errmsg
        mov ah,9
        int 21h
over:
;返回DOS前清理命令行缓冲
        lea bx,es:81h
clean:        cmp byte ptr es:[bx],0
        jz ol
        mov byte ptr es:[bx],0
        inc bx
        jmp clean
ol:          
        mov ah,4ch            ;返回DOS
        int 21h
;------------------------------------------------;
;子程序
;显示十进制数
show        proc
        mov bx,10
        mov si,0
_divdw:
        push ax
        mov ax,dx
        xor dx,dx
        div bx
        mov cx,ax
        pop ax
        div bx
        add dl,30h
        push dx
        inc si
        mov dx,cx
        cmp ax,10
        jb _ok
        jmp _divdw
_ok:        
        and ax,0fh
        cmp ax,0
        jz _pop
        add al,30h
        push ax
        inc si
_pop:        mov cx,si
_disp:
        pop dx
        mov ah,2
        int 21h
        loop _disp
        ret
show        endp
;
code        ends
end        start
;-----------------------------------------------------;
评论次数(0)  |  浏览次数(1727)  |  类型(汇编习题集) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码