关于汇编语言中的PUSH问题。

REPET:PUSHSIPUSHCXPUSHCX;CX为内循环计数POPDX;DX为外循环计数DECCXJENEXT1;是最后一个字符,不再找重复字符MOVAL,[SI]... REPET: PUSH SI
PUSH CX
PUSH CX ;CX为内循环计数
POP DX ;DX为外循环计数
DEC CX
JE NEXT1 ;是最后一个字符,不再找重复字符
MOV AL,[SI]
CMP AL,0
JE NEXT1 ;若为空字符,则跳过
COMP: DEC SI ;A
CMP AL,[SI]
JNE GOON ;为非重复字符
MOV BYTE PTR[SI],0 ;查出与该字符重复的所有字符,并用0替换
GOON: LOOP COMP
NEXT1: POP DX
POP SI
DEC SI
DEC DX
MOV CX,DX
JNZ REPET ;对所有重复字符都进行查找
上面的代码是找出重复字符,然后把重复字符代替为0,请问为什么一开始要进行两次PUSH CX
展开
 我来答
huanghaohongso
推荐于2018-05-04 · TA获得超过2万个赞
知道小有建树答主
回答量:968
采纳率:50%
帮助的人:353万
展开全部
每次REPET开始,CX是需要检测的字符数,SI是需要检测字符系列一端地址
如对字符系列检测时:abcdefaceda

首次进入,CX=11,SI指向第一个字符
PUSH CX在堆栈保存CX,
循环利用CX,结合LOOP COMP实现整个字符系列遍历检测(所谓的内循环)
取出CX赋予DX,--DX,检测是否为零,即是否还有字符需要检测
【事实上push,pop这些操作你只需当它是参数传递与保存即可】事实上
第二行与第三行push cx,pop dx完全没意义,可以去掉
事实上,在NEXT1子指令系列中
可以不用DX,直接使用 POP CX, 掉DEC DX与MOV CX,DX,将JNZ REPET 改为LOOP REPET

顺便说一句,事实上该程序的SI事实上是:第一次遍历先指向最后一个字符,然后向前遍历;第二次遍历指向倒数第二个字符,然后向前遍历;。。。
iro52238
2012-12-08 · TA获得超过1.2万个赞
知道大有可为答主
回答量:3万
采纳率:0%
帮助的人:2972万
展开全部
推DS
小斧头,斧头
PUSH AX
COM程序通常使用,储存在DS:0000一个INT 20H指令,执行上面的代码,以便使用RETF INT 20H ,从而使该程序结束。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
Zendvrgan
2012-12-06 · TA获得超过2580个赞
知道大有可为答主
回答量:9249
采纳率:0%
帮助的人:2553万
展开全部
所以专业,你为什么不读书了吗?

数据寄存器累加器,通用寄存器。累加器保存的计算结果,通用寄存器保存数据。
代码段,当然,是保存当前正在运行的代码;
数据段的数据保存在当前程序;
保存的返回地址和程序参数(地址堆栈段)子程序调用;
的其他部分也保存数据,但一般保存的批处理计算的结果。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
_fmlyht
2012-11-24 · TA获得超过2359个赞
知道大有可为答主
回答量:2398
采纳率:0%
帮助的人:1839万
展开全部
基本的框架如下自己分析下不难理解!

REPET:
PUSH SI
PUSH CX
PUSH CX
POP DX
......
NEXT1: POP DX
POP SI
DEC SI
DEC DX
MOV CX,DX
JNZ REPET
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhxiufan
2012-11-26 · 知道合伙人软件行家
zhxiufan
知道合伙人软件行家
采纳数:14923 获赞数:38385
国家科技进步奖

向TA提问 私信TA
展开全部
第一次是保存CX,第二次是将CX值传递给DX
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式