gpt4 book ai didi

assembly - 仅使用 inc dec 和 jnz 命令实现 c=a*b

转载 作者:行者123 更新时间:2023-12-04 14:03:16 26 4
gpt4 key购买 nike

在我的一次采访中,我在"new"原始程序集中遇到了一个非常复杂的问题(为什么 QA 在告诉我他们的 QA 基于 Python 的测试时需要 assembly 知识......?),它是这样的:

假设您的汇编语言仅包含以下指令:

  • 'inc REG' : 给给定的寄存器加一。
  • 'dec REG' : 将给定的寄存器减一。
  • 'jnz LABEL' : 如果前一条指令的结果不为零,则跳转到给定的 LABEL。
  • 'HELT' : 停止运行。

  • 任务:A 和 B 寄存器保存非负值。
    程序应该计算 A*B 的值并将结果定位在 C 中。
    此外,该语言包含寄存器 C、D、...、Z,您可以假设这些寄存器在程序开始时被初始化为零。

    这里有几点需要更多注意,比如你必须提前考虑到 A 和/或 B 值可能为零......并且乘以零是......零......这太难了......

    附言由于这个问题,我没有达到 'my_atoi()' 问题的实现.. :-(

    谢谢 !

    最佳答案

    我不会给出完整的答案,但这里的关键是你必须定义一个 mov自己作息。假设 dec X哪里X持有 0 产生一个负(或非常大)的数字,可以这样做:

    MOV_AD:     ; copy value in A to D, using E as scratch space
    inc A ; must be non-zero for jnz to work below
    COPYLOOP:
    inc D
    inc E
    dec A
    jnz COPYLOOP
    dec D ; undo the first inc A in D

    ; E now contains the initial value of A + 1
    MOVBACK: ; move value in E back to A
    inc A
    dec E
    jnz MOVBACK
    dec A ; undo the first inc A

    WIPE_E: ; wipe the scratch space
    dec E
    jnz WIPE_E

    一旦你有了合适的 mov在例程中,您可以将加法实现为重复递增,将乘法实现为重复加法。在这两种情况下,您都需要 inc获取技巧 jnz工作,在乘法例程中,你需要以减法结束。

    关于assembly - 仅使用 inc dec 和 jnz 命令实现 c=a*b,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12881474/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com