assembly 如何在汇编8086中表达一个复杂的操作

velaa5lx  于 2023-04-30  发布在  其他
关注(0)|答案(1)|浏览(110)

嗨,伙计们,我希望你们做得很好。我正在自学组装。我想知道如何表达一个复杂的数学表达式。enter image description here
我试过这么做。我尝试为每个数字分配一个寄存器,但穆尔指令保存了Result。有没有人知道我该如何一步一步地表达这个完整的表达?enter image description here
我在抄写练习时犯了一个错误,公式如下:

9udxz4iz

9udxz4iz1#

要将复杂的数学表达式转换为汇编语言,有8个简单的步骤:
a)使用“纸笔数学”将表达式简化为最简单的形式。举一个随机的例子,如果复杂的表达式是“x =(y+3)2 + 4/2 + 2”,你可以这样做:

x = (y+3)*(y+3) + 4/2 + 2
      = y*y + 3*y + 3*y + 9 + 4
      = y*y + 6*y + 13
      = (y+6)*y + 13

B)通过用中间变量替换片段,将(简化的)表达式拆分成多个小表达式;使得每个小表达式有一个运算符。例如,“x =(y+6)*y + 4”将变为:

temp1 = y + 6
temp2 = temp1 * y
x = temp2 + 13

c)写评论。对于上面的例子,它可能看起来像:

;Calculate x = (y+6)*y + 4

        ;temp1 = y + 6
        ;temp2 = temp1 * y
        ;x = temp2 + 13

d)在注解中添加开始和结束条件。这可能来自调用约定(如果它是一个单独的函数),也可能依赖于以前的代码(如果它是一个更大的函数的一部分)。对于上面的例子,它可能看起来像:

;Calculate x = (y+6)*y + 13

        ;bx = y

        ;temp1 = y + 6
        ;temp2 = temp1 * y
        ;x = temp2 + 13

        ;ax = (y+6)*y + 13

e)在注解中添加有关范围和数据类型的信息。请注意,当您获得经验,这可能是可选的;但这是避免bug(整数溢出等)的好方法。对于上面的例子,它可能看起来像:

;Calculate x = (y+6)*y + 13

        ;bx = y            (integer, range -100 to +100)

        ;temp1 = y + 6     (integer, range -94 to +106)
        ;temp2 = temp1 * y (integer, range -9400 to +10600)
        ;x = temp2 + 13    (integer, range -9396 to +10604)

        ;ax = (y+6)*y + 13 (integer, range -9396 to +10604)

f)找到合适的说明,做什么的评论说。对于上面的例子,它可能看起来像:

;Calculate x = (y+6)*y + 13

                    ;bx = y                    (integer, range -100 to +100)

    lea ax,[bx+6]   ;ax = temp1 = y + 6        (integer, range -94 to +106)
    imul bx         ;dx:ax = temp2 = temp1 * y (integer, range -9400 to +10600)
    add ax,13       ;ax = x = temp2 + 13       (integer, range -9396 to +10604)

                    ;ax = x = (y+6)*y + 13     (integer, range -9396 to +10604)

g)测试它是否工作(汇编程序是否给予你一个错误?它在执行时是否会给予您正确的结果?)
(h)寻找机会来优化或改进它。对于上面的例子(来自Peter下面的评论),imul bl(而不是imul ax,bx)将正常工作,避免了对dx的破坏,如果在此代码之前或之后的代码需要dx,这可能会使事情变得更容易/更快,并使代码更干净。

相关问题