使用ONLY inc dec和jnz命令实现c = a*b

Ada*_*dam 6 assembly

在我的一次采访中,我在一个'新的'原始集合中遇到了一个非常复杂的问题(当他们告诉我他们基于Python的QA测试时,为什么地狱QA需要汇编知识?),这就是这样的:

假设您的汇编语言仅包含以下说明:

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

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

这里有几点需要更多关注,比如你必须事先考虑A和\或B值可能为零..并且多个零是......零...这真是该死的...

PS因为这个问题我没有达到'my_atoi()'问题的实现.. :-(

谢谢 !

Fre*_*Foo 5

我不打算给出完整的答案,但关键在于你必须自己定义一个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
Run Code Online (Sandbox Code Playgroud)

一旦你有了适当的mov例程,你可以实现加法作为重复的增量和乘法重复加法.在两者中,你需要使用inc技巧才能开始jnz工作,而在乘法例程中,你需要以减法结束.