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

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

每次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事实上是:第一次遍历先指向最后一个字符,然后向前遍历;第二次遍历指向倒数第二个字符,然后向前遍历;。。。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-12-08
推DS
小斧头,斧头
PUSH AX
COM程序通常使用,储存在DS:0000一个INT 20H指令,执行上面的代码,以便使用RETF INT 20H ,从而使该程序结束。
第2个回答  2012-12-06
所以专业,你为什么不读书了吗?

数据寄存器累加器,通用寄存器。累加器保存的计算结果,通用寄存器保存数据。
代码段,当然,是保存当前正在运行的代码;
数据段的数据保存在当前程序;
保存的返回地址和程序参数(地址堆栈段)子程序调用;
的其他部分也保存数据,但一般保存的批处理计算的结果。
第3个回答  2012-11-24
基本的框架如下自己分析下不难理解!

REPET:
PUSH SI
PUSH CX
PUSH CX
POP DX
......
NEXT1: POP DX
POP SI
DEC SI
DEC DX
MOV CX,DX
JNZ REPET本回答被网友采纳
第4个回答  2012-11-26
第一次是保存CX,第二次是将CX值传递给DX

汇编中push指令后面可以直接加数字吗?
push指令后面可以压入立即值,但限于一字节,即0-255push1push12push可以压入内存,但必须指定型别pushwordptr[100]pushdwordptr[100]push可以压入任何16或32位暂存器(ip除外)使用格式为:PUSHDATA比如:PUSH 50当SP=0100H时,执行该语句后0100H这个地址中就存入了50这个数据。与之对应的是POP语句,...

push是什么指令
push指令就是汇编语言指令 栈。

push汇编
在汇编指令中,PUSH和POP是两种重要的堆栈操作。PUSH用于将数据压入堆栈,其格式为PUSH OPRD,其中OPRD是一个16位的操作数,可以是寄存器或存储器的值。执行PUSH时,首先执行(SP) -= 2,然后将OPRD的值存储在新的栈顶位置,这一过程可以用[(SS)*16+(SP)] = OPRD或[SS:SP] = OPRD来理解。例...

汇编语言中的PUSH的用法
PUSH的操作过程是: (SP)<--(SP)-2,((sp))<--OPRD 即先修改堆栈指针SP(压入时为自动减2),然后,将指定 的操作数送入新的栈顶位置。此处的((SP))<--OPRD,也可以理解为:[(SS)*16+(SP)]<--OPRD 或 [SS:SP]<--OPRD 示例: PUSH DX PUSH BP PUSH CS PUSH DATA1 PUSH ALFA...

关于汇编语言中的PUSH问题。
PUSH CX在堆栈保存CX,循环利用CX,结合LOOP COMP实现整个字符系列遍历检测(所谓的内循环)取出CX赋予DX,--DX,检测是否为零,即是否还有字符需要检测 【事实上push,pop这些操作你只需当它是参数传递与保存即可】事实上 第二行与第三行push cx,pop dx完全没意义,可以去掉 事实上,在NEXT1子指令...

关于PUSH的问题,求汇编帝!!!
eax就是CPU的一个元件,无什么地址可言(当然这只是我的理解),就是负责传递数据,所以 push eax就是把里面装的值压入堆栈。汇编都是直观的,是这样就是这样,mov eax,12345678 push eax 只是把12345678压入。如果压入值, 汇编会很直观地直接这样显示 [eax] 而不是 eax ...

汇编push 问题
这是由于你指定的SS=0200H太小,这是DOS系统内核区。当你用PUSH指令往这个段里写数据时,实际是在破坏DOS系统。在DOS系统核心已被破坏得不知什么样子的情况下,出现各种异常都有可能。使用DEBUG时,要注意一点:不带参数直接启动DEBUG时的DS、ES、SS的值已经指向了用户可用内存的最低端。实验过程中,...

汇编语言关于PUSH的问题
sp指针指向0100 但是【栈底】为2000:00FF,所以push后sp指向00FE 即物理地址为2000:00FE

汇编push和pop指令
学习使用汇编语言中的push和pop指令进行栈操作,了解栈的基本概念以及这两条指令在栈操作中的作用。push指令用于将寄存器中的数据压入栈中,pop指令则用于从栈中弹出数据到寄存器中。具体操作如下:push寄存器:将指定寄存器的内容压入栈顶。pop寄存器:从栈顶弹出数据到指定寄存器中。下面通过一段汇编代码...

汇编语言 PUSH 用法疑问
如果,16进制的数是一A - F之间的字母开头的话,必须在前面加上0 即push 0FFFFh,push不一定是将16位源操作数压入栈,32位的程序,就是压入32位的数值

相似回答