哪位师兄帮我分析一下是哪里的问题

h662b 2003-09-14 09:34:02


这是一个表达式的扫描计算程序
data1 segment
list_char db "please input",0dh,0ah,"$";提示符输入表达式
error db "erroe out",0dh,0ah."$"
mather_char db 200 dup (0),"$" ;保存表达式
mather_char_back db 200 dup(0),"$";
xkhmathe_char db "$" ; 小括号标志
dkhmathe_char db "$"; 大括号标志位
xkh db 0 ;小括号计数器
dkh db 0; 大括号计数器
bx_pop db 0;
data1 ends

cs_begin segment
assume ds:data1,cs;cs_begin,cs:data1

begin:
mov ax,data1
mov ds,ax
mov dx,offset list_char ;显示提示信息。
mov ah,09h
int 21h
mov di,offset mather_char;取保存表达式的内存地址。
next1:
mov ah,01h;输入表达式
int 21h
mov [di],al
inc di
cmp al," "
jne next1
mov ah,09h;显示表达式
mov dx,offset mather_char
int 21h
mov di,offset mather_char;取首地址
mov bx,offset mather_char_back
mov si,offset bx_pop; 保存bx地址
mov [si],bx
comp_char:

mov dx, mather_char_back
mov ah,09h
int 21h

cmp [di],"(" ;比较运算符号转移到相应的程序。
jz cxkh_pro
cmp[di],")"
jz zxkh_pro
cmp [di],"["
jz dkh_pro
cmp [di],"]"
jz zdkh_pro
cmp [di],'*"
jz chen_pro
cmp [di],"/"
jz chu_pro
cmp [di],"+"
jz jea_pro
cmp [di],"-"
jz jian_pro
cmp [di]," "
jz reset3
;**********************8
mov al,[di];不是运算符号,则保存数值。
mov [bx],al
add[di],1
jmp comp _char
cxkh_pro:
mov al,[di]
mov [bx],al;
mov si,offset xkh;是”(“计数器加1
add [si],1
mov si,offset xhmathe_char;标志位改为0
mov [si],0
jmp reset
zxkh_pro:
mov si,offset xkh;是“)”计数器减1
dec [si]
mov si,offset xkhmathe_char;标志位改为1
mov [si],1
jmp reset
dkh_pro:
mov al,[di]
mov [bx],al
mov si,offset dkh;是”[“计数器加1
add [si],1
mov si,offset dkhmathe_char;标志位改为0
mov [si],0
jmp reset
zdkh_pro:
mov si,offset dkh;是“]”计数器减1
dec [si]
mov si,offset dkhmathe_char;标志位改为1
mov [si],1
jmp reset
chen_pro:
inc di ;乘法子程序
mov al,[bx]
mov cl,[di]
mul cl
mov [bx],al;乘积结果放在AX中,把AX乘积为16位转化为8位没完成。
jmp reset
chu_pro:
inc di
mov ax,[bx];除法子程序,除积的商加余数转化为8位没完成。
mov cl,[di]
div cl
mov [di],al
jmp reset

jea_pro:
inc di
inc di
cmp [di],"/";加法子程序
jz in_pop
cmp [di],"*"
jz in_pop
dec di
mov al,[bx]
add al,[di]
mov [bx],al
jmp a123
in_pop:
dec di
dec di
inc bx;保存数据。
mov al,[di]
mov [bx],al
a123:
jmp reset

jian_pro:
inc di ;减法子程序
inc di
cmp [di],"/"
jz in_pop2
cmp [di],"*"
jz in_pop2
dec di
mov al,[bx]
sub al.[di]
mov[bx],al
jmp a123
in_pop2:
dec di
dec di ;保存数据。
inc bx
mov al,[di]
mov [bx],al
a123:
jmp reset

:*************************************
reset:
mov si,offset xkhmathe_char;小括号标志位为1
cmp [si],1
jz re2; 为真转向 re2
mov si,offset dkhmathe_char; 大括号标志位1
cmp [si],1
jne not_1;为假转向not_1
re2:
call reset2;完成括号内的数值运算。
not_1:
inc di
cmp [di]," ";表达式没结束转向cmp_char,结束调用reset3
jne cmp_char
call reset3
goend:



mov dx,offset mather_char_back ;显示mather_char_back内容。
mov ah,09h
int 21h
jmp go_end
reset2 proc ;过程定义括号内的运算
reset22:
mov cl,[bx];
dec bx
cmp [bx],"+"
jz jia_reset
cmp [bx],"-"
jz a_jian_b
cmp [bx],"("
jz ret2
cmp [bx],"["
jz ret2
a_jian_b:
dec bx ;加法程序;
sub al,cl
mov [bx],al
jmp reset22
jia_reset:
dec bx ;减法子程序
add cl,[bx]
mov [bx],cl
jmp reset22
ret2:
mov [bx],cl
ret
reset2 endp


reset3 proc ;表达式扫描结束,则调用子程序。来完成最后的加减运算。
mov cl,[bx] ;这时只有加减运算
dec bx
cmp [bx],"+"
jz jia_reset3
cmp [bx],"-"
ajiand:
dec bx
mov al,[bx];减法子程序
sub al,cl
mov [bx],al
mov si,offset bx_pop
mov ax,[si]
cmp ax,[bx]
jz ret_pro
jmp ajiand3
jia_reset3:
dec bx
add cl,[bx];加法子程序
mov [bx],cl
mov si,offset bx_pop
mov ax,[si]
cmp ax,[bx]
jz ret_pro
ajiab:
jmp reset3
ret_pro:
ret
resert3 endp
go_end:
mov ah,4ch
int 21h
cs_begin ends
end begin





...全文
42 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
h662b 2003-09-29
  • 打赏
  • 举报
回复
没有人愿意帮我吗
kxiangwei 2003-09-17
  • 打赏
  • 举报
回复
研究一下告诉你!
h662b 2003-09-17
  • 打赏
  • 举报
回复
谁有反汇编程序我买,请和h662b@vip.cn99.com联系。谢谢了!
ptys 2003-09-16
  • 打赏
  • 举报
回复
u p
kxiangwei 2003-09-15
  • 打赏
  • 举报
回复
这段汇编有什么错误提示。
h662b 2003-09-15
  • 打赏
  • 举报
回复
孔兄是comp_char分枝程序这段程序不能退出,进入了一个死寻环,不能输出结果。
另外mather_char第一个字节会改变。

6,849

社区成员

发帖
与我相关
我的任务
社区描述
Windows 2016/2012/2008/2003/2000/NT
社区管理员
  • Windows Server社区
  • qishine
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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