2013-03-04 120 views
0

我是新来的汇编语言,我收到一个奇怪的错误。该程序应该显示用户输入的整数的4个最低有效位。它适用于大于8的数字,但对于小于或等于8的数字,它会输出数字。对于8输出8000而不是1000,五输出0401.我不明白为什么,有人可以帮忙吗?汇编语言奇怪的错误

 .data 
inPrompt: .asciiz "Enter an integer: " 
outLab:  .asciiz "Least significant 4 bits of int entered are " 
############################ code segment ################################ 
     .text 
     .globl main 
main: 
     li $v0, 4 
     la $a0, inPrompt   
     syscall     # print input prompt 

     li $v0, 5 
     syscall     # read input integer 

     move $t0, $v0 

     li $v0, 4 
     la $a0, outLab   
     syscall 

     li $v0, 1 

     andi $a0, $t0, 8    
       syscall 

     andi $a0, $t0, 4    
       syscall 

     andi $a0, $t0, 2    
       syscall 

     andi $a0, $t0, 1   
       syscall 
      ########################################################## 

       li $v0, 10    # exit 
       syscall 

回答

0

的问题是,你被有效计算和打印数量的添加剂分解(2的幂的因子),而不是它的比特。

简单地说,例如用于“位4”
  andi $a0, $t0, 4
将导致寄存器A0存储...
- ..the值4如果在寄存器T0的值具有的加法因子4(例如4,5,6,7,12,13等)

- ...如果T0中的值不具有加法因子4(例如0,1,2 ,3,8,9,10等)。

这解释了为什么50401因为5 is 4 + 1或者更准确地说,5 is 0 * 8 + 4 + 0 * 2 + 1

你需要做的是两件事情一个:

  • 测试,如果andi操作的结果结果非零,在这种情况下,在调用系统调用之前将1载入$ a0
  • [按位由位的相应数量(3次测试“4比特”时,为“8位”进行测试时,两次当测试“2比特”时和一次)]移位andi操作的结果

的第一个建议会导致类似下面的,代替“安迪+系统调用”群体:

  andi $a0, $t0, 4 
      blez $a0, outBit4 # bit is zero output integer value 0 
      li $a0, 1   # bit is one ouptut integer value 1 (repl 4 by 1) 
    outBit4: syscall 

编辑
在保持该计划下控制线16 ...(顺便说一句,这要求和其他提示表明homework所以我是l提供一般思路而不是给出代码)
有几种缩短代码的方法,但考虑到使用9条线的设置,16条LoC要求有点艰难:提示用户输入,获取输入和保存并输出答案的开始...

最常见的方法是使用一个(或多个嵌套)循环。在这种情况下,单个循环就足够了,基本上你需要重复4次几乎相同的事情,所以以增加一些LoC来管理循环本身为代价(即增加参数和检测循环结束条件),你可以编写以参数化的方式处理单个工作单元的片段,并在循环内部具有此逻辑。

一个稍微相关的方法是使用子程序,其中重复的逻辑写入子程序,然后可以多次调用,通过不同的参数来实现参数化行为。

我之前提到过,因为它们在汇编语言中的使用非常普遍,而且实际上与编程相关。然而,就目前的'基于'逻辑而言,我恐怕这两种方法都不会使事情发生在16C以下。您可能需要使用循环结构位移逻辑。

+0

我试图实现你的第一个建议,但我只允许使用16行代码,我无法管理它。因为如果它是零,我需要输出这两个,所以我需要两个分支?对于你的第二个建议,你是指sll还是sra? – 2013-03-04 06:47:49

+0

@EmilyAnnHall a)如果它是0,它也输出给定的建议片段;不需要'else':在这两种情况下我们输出,唯一的区别是,如果零,我们跳过设置值为1. b)第二个建议意味着'SRL',即右移逻辑(尽管因为我们只有正值,'SRA'会有同样的效果)c)保持东西在16行以下,请参阅编辑。 – mjv 2013-03-04 07:11:48

+0

你的第二个建议完全奏效!你真了不起,我真的很感谢你的帮助。 – 2013-03-04 07:21:27