Assembly 使用XLAT命令计算函数
对于0到10的x值,我需要计算这个函数F=2x*x+4x+8。我画了一个流程图,然后写了下面的代码。但它并没有给出我运行后想要的值。我检查了AL寄存器,它在一小段时间内显示F8,但随后它消失了,我不明白为什么。当x=10时,F8是正确的输出Assembly 使用XLAT命令计算函数,assembly,x86,emu8086,Assembly,X86,Emu8086,对于0到10的x值,我需要计算这个函数F=2x*x+4x+8。我画了一个流程图,然后写了下面的代码。但它并没有给出我运行后想要的值。我检查了AL寄存器,它在一小段时间内显示F8,但随后它消失了,我不明白为什么。当x=10时,F8是正确的输出 org 100h SQUR_TABLE DB 0,1,4,9,16,25,36,49,64,81,100 MOV AL,0AH ; X MOV BL,4 MUL BL ;4X MOV CX
org 100h
SQUR_TABLE DB 0,1,4,9,16,25,36,49,64,81,100
MOV AL,0AH ; X
MOV BL,4
MUL BL ;4X
MOV CX,8
ADD AX,CX ;AX+8
MOV CX,AX
MOV BX, OFFSET SQUR_TABLE
MOV AL,0AH
XLAT
MOV [SI],AL ;X^2
MOV AL,[SI]
MOV DL,2
MUL DL ;2X^2
ADD AX,CX ;2X^2 + 4X + 8
ret
这肯定是我很久以来见过的实现一个简单函数的最复杂的方法。您不是在这里以代码的形式运行表吗?您已经在使用
mul
(其中shl
乘以2或1会更有效),那么为什么要使用查找表进行平方运算呢?无论如何,请将db
放在退出流程的ret
之后。如果你仍然有问题,请详细描述“一点时间”的含义。你坚持单步走吗?当然,如果你继续在DOS退出系统中执行更多指令,就会有东西覆盖AL。请返回。@EOF先生,我需要使用XLAT命令。问题最重要的部分是使用这个命令。我也像你一样,我们不需要这个命令来取平方,但我被告知只使用这个函数:/哦,如果你只需要使用xlat
,你仍然可以简化其余的,以避免mul
。在real 8086中,mul
相当慢,因此xlat实际上可能更快,即使这意味着另一次内存访问。但是shl reg,1的速度非常快。(或addax,ax
是将寄存器乘以2的另一种方法。)