8086汇编语言限幅处理代码

来源:百度知道 编辑:UC知道 时间:2024/05/11 15:45:16
我希望不使用无条件转移指令,而利用堆栈完成一个限幅操作:
/ 64H (x>100)
XF=- x (-100<x<100)
\ -64H (x<-100)
我写了段代码,希望将SI中的数据限幅后存入DI并返回主程序。这段代码是否可行?
我主要是对利用RET N废除堆栈冗余数据后是否能正常返回主程序心理没底。

XF PROC NEAR
N = 2
XOR AX,AX
MOV AL,[SI]
PUSH AX
MOV AL,64H
PUSH AX
MOV AL,9CH
PUSH AX
MOV AL,[SI]
CMP AL,-64H
JL LX2
CMP AL,64H
JG LX1
POP AX
N = N-1
LX1: POP AX
N = N-1
LX2: POP AX
MOV [DI],AL
RET N
XF ENDP
我之前表述有误,数据确实是在SI和DI指向的内存单元中。我的目的不是改变寻址方式提高运行效率。只是单纯为了改变一个思路写程序而已。因为访问堆栈也是访问内存单元,不存在提高效率的问题。
这个过程分支程序,目的是让主程序循环调用执行批量限幅。还望高手继续指点。

你的表述有问题.从代码里看,你的数据在SI指向的单元里,而不是SI里.结果也不是存入DI,而是DI指向的单元.既然你不用无条件转移语句,你又使用了条件转移语句,这中间的差异你是怎么考虑的?如果这样的话,堆栈也可以不用以提高你的程序执行速度.具体等晚上回来再跟你讨论.
---------------------------------------
不好意思 ,最近忙,到今天才腾出手来.我仔细看了你的代码,可以确信:实现不了你的预期.原因在于你的一些细节处理出现了问题.下面慢慢分析:
先画出你几次压栈所形成的堆栈空间分布:
ADDR1: ------ 你代码中的第一个问题就是
| 9C | 忘记了堆栈操作的单位是字
------ 这样,N取2和N-1表达都不合适
| 00 | 你取成了字数,
------ 实际的N应该是字节单位
| 64 |
------
| 00 | 你代码的第二个问题是
------ 忽视了堆栈操作的特性
| X低| "先进后出"
------ 所以代码里面的几次出
| X高| 栈动作达成不了你希望的
------ 效果
粘贴你的部分代码如下:
JG LX1 ;
POP AX ;此时弹出的预计是-100<=X<=100,堆栈
;中分布在最下面,前面得加两条POP语句
N = N-1 ;这样 N=0才对,然后要加JMP语句跳到
;最后,我假设是EXIT标号
LX1: POP AX ;此时弹出的是X>100,堆栈中分布
;在中间,所以前面要加一条POP语句
N = N-1 ;,且N=2,同样要加JMP语句跳到EXIT.
LX2: