在我的一次采访中,我在一个'新的'原始集合中遇到了一个非常复杂的问题(当他们告诉我他们基于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()'问题的实现.. :-(
谢谢 !
我不打算给出完整的答案,但关键在于你必须自己定义一个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工作,而在乘法例程中,你需要以减法结束.
| 归档时间: |
|
| 查看次数: |
1382 次 |
| 最近记录: |