我汇编初学,写了个程序,有问题,请各位高手指教

sleilei 2003-05-03 08:30:22
题目:用命令行参数实现两个一位数的加减乘除,
例如:
C:\>math 3*4
回车后显示:
3*4=12
我的程序如下:
.model small
.stack
.data
buf db 5 dup(?)
.code
start: cld
mov si,80h
lodsb
mov cl,al
xor ch,ch
mov ax,@data
mov es,dx
mov di,offset buf
push cx
rep movsb
pop cx
push es
push ds
mov si,offset buf
jcxz over
next: lodsb
mov dl,al
mov ah,2h
int 21h
loop next
mov dl,"="
mov ah,2h
int 21h
mov si,offset buf
inc si
mov dl,[si]
sub dl,30h
mov dh,[si+2]
sub dh,30h
cmp buf[si+1],'+'
je addp
jmp over
cmp buf[si+1],'-'
je subp
cmp buf[si+1],'*'
je mulp
cmp buf[si+1],'/'
je divp
addp: add dl,dh
jmp disp
subp: sub dl,dh
jmp disp
mulp: mul dl,dh
jmp disp
divp: div dl,dh
jmp disp
disp: add dl,30h
mov ah,2h
int 21h
over: mov ah,4ch
int 21h
end start
这个程序有问题,请大家帮我改改。
还有一个问题,如果想将题目改成两个4位的整数的四则运算该怎么写?高手们帮帮我,谢谢大家。
...全文
35 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
蚊子王 2003-05-06
  • 打赏
  • 举报
回复
to 01010:你们水园的恩怨,不要带到这里
yunzhizgj 2003-05-05
  • 打赏
  • 举报
回复
你编的程序要注名哪种芯片,
这种程序教科书上太多了,没多大价值
蚊子王 2003-05-05
  • 打赏
  • 举报
回复
用tasm编译:tasm math.asm
tlink /t math.obj

两个数字位数不限制,当然在32位数范围(2^32),运算结果也在这个范围。
还有,我没有考虑负数,都是以正数来考虑,如果是减法,第一操作数小于第二操作数,则溢出,比如1-2=4294967295
蚊子王 2003-05-05
  • 打赏
  • 举报
回复
.model tiny
.386
;---------------------------------------------------------------------------
.code
org 100h
;---------------------------------------------------------------------------
@@start:
cld
mov si,80h
lodsb
movzx cx,al
jcxz @@exit
call getData ;取第一操作数(在ebx)
mov ebp,ebx ;第一操作数在ebp
movzx di,al ;保存操作符在di
call getData ;取第二操作数(在ebx)
call Operate ;运算,结果保存在esi
mov eax,ebp
call PutData
mov ah,2h
mov dx,di
int 21h
mov eax,ebx
call PutData
mov ah,2h
mov dl,'='
int 21h
mov eax,esi
call PutData
@@exit:
mov ah,4ch
int 21h

;---------------------------------------------------------------------------
Operate proc
cmp di,'+'
jz @add
cmp di,'-'
jz @sub
cmp di,'*'
jz @mul
cmp di,'/'
jz @div
jmp @@exit ;非法操作符,退出
@add:
mov esi,ebp
add esi,ebx
ret
@sub:
mov esi,ebp
sub esi,ebx
ret
@mul:
mov eax,ebp
mul ebx
mov esi,eax
ret
@div:
mov eax,ebp
sub edx,edx
div ebx
mov esi,eax
ret
Operate endp

;---------------------------------------------------------------------------
getData proc
xor ebx,ebx
xor eax,eax
@skip: ;skip space
lodsb
dec cx
cmp al,' '
jz @skip
cmp al,9
jz @skip
;
test cx,cx
jl @@exit
cmp al,'9'
ja @@exit ;数字非法,则退出
cmp al,'0'
jb @@exit
@getDataBeg:
sub al,'0'
imul ebx,ebx,10
add ebx,eax
dec cx
jl @getDataEnd
lodsb
cmp al,'9'
ja @getDataEnd
cmp al,'0'
jb @getDataEnd
jmp @getDataBeg
@getDataEnd:
ret
getData endp

;---------------------------------------------------------------------------
putData proc
sub cx,cx
mov ebp,10
@push:
sub edx,edx
div ebp
push dx
inc cx
or eax,eax
jnz @push
@put:
pop dx
add dl,'0'
mov ah,2h
int 21h
dec cx
jnz @put
;
ret
putData endp

;---------------------------------------------------------------------------

end @@start
蚊子王 2003-05-05
  • 打赏
  • 举报
回复
.model tiny
.386
;-------------------------------------------------------------------------------
.code
org 100h
;-------------------------------------------------------------------------------
@@start:
cld
mov si,80h
lodsb
movzx cx,al
jcxz @@exit
call getData ;取第一操作数(在ebx)
mov ebp,ebx ;第一操作数在ebp
movzx di,al ;保存操作符在di
call getData ;取第二操作数(在ebx)
call Operate ;运算,结果保存在esi
mov eax,ebp
call PutData
mov ah,2h
mov dx,di
int 21h
mov eax,ebx
call PutData
mov ah,2h
mov dl,'='
int 21h
mov eax,esi
call PutData
@@exit:
mov ah,4ch
int 21h

;-------------------------------------------------------------------------------
Operate proc
cmp di,'+'
jz @add
cmp di,'-'
jz @sub
cmp di,'*'
jz @mul
cmp di,'/'
jz @div
jmp @@exit ;非法操作符,退出
@add:
mov esi,ebp
add esi,ebx
ret
@sub:
mov esi,ebp
sub esi,ebx
ret
@mul:
mov eax,ebp
mul ebx
mov esi,eax
ret
@div:
mov eax,ebp
sub edx,edx
div ebx
mov esi,eax
ret
Operate endp

;-------------------------------------------------------------------------------
getData proc
xor ebx,ebx
xor eax,eax
@skip: ;skip space
lodsb
dec cx
cmp al,' '
jz @skip
cmp al,9
jz @skip
;
test cx,cx
jl @@exit
cmp al,'9'
ja @@exit ;数字非法,则退出
cmp al,'0'
jb @@exit
@getDataBeg:
sub al,'0'
imul ebx,ebx,10
add ebx,eax
dec cx
jl @getDataEnd
lodsb
cmp al,'9'
ja @getDataEnd
cmp al,'0'
jb @getDataEnd
jmp @getDataBeg
@getDataEnd:
ret
getData endp

;-------------------------------------------------------------------------------
putData proc
sub cx,cx
mov ebp,10
@push:
sub edx,edx
div ebp
push dx
inc cx
or eax,eax
jnz @push
@put:
pop dx
add dl,'0'
mov ah,2h
int 21h
dec cx
jnz @put
;
ret
putData endp

;-------------------------------------------------------------------------------

end @@start
sleilei 2003-05-05
  • 打赏
  • 举报
回复
谢谢回复,问题一解决我马上给分
蚊子王 2003-05-05
  • 打赏
  • 举报
回复
我大致看了一下,你的这个程序思路大致如下:先把命令行读到buff里,然后从BUFF里读取数值和操作符,再根据操作符进行运算。但有几处错误:
1、17和18行写的是:
push es
push ds
你这里原意是把ES(当时存的是DATA段值)赋给DS,但写错了,应该是
push es
pop ds
2、48行和50行是:
mulp: mul dl,dh
divp: div dl,dh
这个属于语法错误,汇编里没有这样的乘法和除法的,多看看书吧。

对于你的程序,我一会儿有空,给你重新写一下(我写的直接支持多位数的运算--当然在没有溢出前提下)
sleilei 2003-05-04
  • 打赏
  • 举报
回复
有没有会的啊,怎么回事啊,这只是个初学者问题啊,不会吧
dsft 2003-05-04
  • 打赏
  • 举报
回复
你写程序加注释好不好,养成好习惯,看起来多麻烦!
sleilei 2003-05-03
  • 打赏
  • 举报
回复
TO pifulu(匹夫)
谢谢,终于有人回复了
pifulu 2003-05-03
  • 打赏
  • 举报
回复
让我想想
sleilei 2003-05-03
  • 打赏
  • 举报
回复
来人啊,帮帮忙吧
sleilei 2003-05-03
  • 打赏
  • 举报
回复
不会吧,没一个人帮忙,100分不够多吗,着不是个复杂问题啊

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧