- [somniumchase] 我一运行就说没有数字 01/01 11:44
- [游客] 为什么啊 08/07 15:36
- [游客] 如果想快一些 就改下面这里 dx值改成1H delay: push ax 04/19 02:53
- [lshhjx] 注释在程序中很重要,楼主不知道吗? 12/08 13:40
- [biaggi] 看不明白,在下還須學習 11/06 08:11
- [游客] 我运行的时候直接显示Unkown filename跳出了- -请问怎么改 06/16 21:44
- [游客] 勿庸置疑,注释是好习惯。与人方便自己方便。 04/12 10:33
- [游客] 老实说,看着真心累呀! 04/07 18:37
- [游客] 很无语,初学者就多看书,不要动不动要别人注释,基础打好了,再自己注释,这样比别人帮你注释好得多 12/17 19:43
- [dgkepu] 初学者:不懂,希望有多点注释带着学习学习! 12/07 20:52
- [游客] windows 7是一个64Bit操作系统,它不兼容DOS,无法识别16Bit系统。重装系统wind 02/28 21:05
- [游客] windows 7是一个64Bit操作系统,它不兼容DOS,无法识别16Bit系统。重装系统wind 02/28 21:05
- [466987333] 你好,高手,我想请教一个问题。 我用的是win7操作系统,32位的,里面没有找masm目录,是不是 12/12 17:30
- [lanfioncc] 那个太高级了。。。我还有点看不懂。。不过谢谢!!! 11/27 11:23
- [yc2010] 实验16中的 table: dw sub1,sub2,sub3,sub4 可不可以改成呢? 09/11 09:08
- [yc2010] mov bl,ah mov bh,0 add bx,bx ----------->这里为 09/07 21:03
- [yc2010] 为什么要add bx,bx呢? 09/07 20:55
- [yc2010] 那是不是像table[bx],ds[bx]....等(内存单元)都是表示一个字节呢? 09/06 21:10
- [masmaster] 杨季文的《80X86汇编语言程序设计教程》 09/01 12:52
- [游客] to masmaster shl左移4位,那al传进来的4,5,6位背景色不就没了. 为什 09/01 11:00
[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
;-----------------------------------------------------;
答:
;-----------------------------------------------------;
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) |
类型(汇编习题集) |
收藏此文 |