Assembly 使用XLAT命令计算函数

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

对于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,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的另一种方法。)