English 中文(简体)
是否可看出在方案中使用 st子?
原标题:Can t figure out use of stack in program?
  • 时间:2011-10-21 20:41:44
  •  标签:
  • stack
  • mips

Ok, so my task was to modify this code to count both upper and lower case vowels. The point of the program is to demonstrate the use of stack to preserve data across function calls:

##
## vowel.a - prints out number of vowels in  
##         - the string str
##
##  a0 - points to the string
##

#################################################
#                                               #
#                 text segment                  #
#                                               #
#################################################

            .text           
            .globl __start 
   __start:         # execution starts here


            la $a0,str
            jal vcount      # call vcount

            move $a0,$v0
            li $v0,1
            syscall         # print answer


            la $a0,endl
            li $v0,4
            syscall         # print newline

            li $v0,10
            syscall         # au revoir...

           #------------------------------------------------
           # vowelp - takes a single character as a
           # parameter and returns 1 if the character 
           # is a (lower case) vowel otherwise return 0.
           #        a0 - holds character
           #        v0 - returns 0 or 1
           #------------------------------------------------

           vowelp:  li $v0,0
           beq  $a0, a ,yes
           beq  $a0, e ,yes
           beq  $a0, i ,yes
           beq  $a0, o ,yes
           beq  $a0, u ,yes
           jr $ra
           yes:     li $v0,1
           jr $ra


           #------------------------------------------------
           # vcount - use vowelp to count the vowels in a
           # string.
           #        a0 - holds string address
           #        s0 - holds number of vowels
           #        v0 - returns number of vowels
           #------------------------------------------------

           vcount:  
           sub $sp,$sp,16   # save registers on stack
           sw $a0,0($sp)
           sw $s0,4($sp)
           sw $s1,8($sp)
           sw $ra,12($sp)

           li $s0,0 # count of vowels
           move $s1,$a0     # address of string

           nextc:   lb $a0,($s1)    # get each character
           beqz $a0,done    # zero marks end
           jal vowelp       # call vowelp 
           add $s0,$s0,$v0  # add 0 or 1 to count
           add $s1,$s1,1    # move along string
           b nextc
           done:    move $v0,$s0    # use $v0 for result

           lw $a0,0($sp)    # restore registers
           lw $s0,4($sp)
           lw $s1,8($sp)
           lw $ra,12($sp)
           add $sp,$sp,16
           jr $ra


    #################################################
    #                                               #
    #               data segment                    #
    #                                               #
    #################################################


           .data
     str:   .asciiz "long time ago in a galaxy far away"
     endl:  .asciiz "
"

     ##
     ## end of file vowel.a

我经过修改的法典如下:

    ##
    ## vowel.a - prints out number of vowels in  
    ##         - the string str
    ##
    ##      a0 - points to the string
    ##

    #################################################
    #                                               #
    #               text segment                    #
    #                                               #
    #################################################

            .text           
            .globl __start 
    __start:                # execution starts here

            la $a0,str
            jal vcount      # call vcount

            move $a0,$v0
            li $v0,1
            syscall         # print answer

            la $a0,endl
            li $v0,4
            syscall         # print newline

            move $a0,$t0
            li $v0,1
            syscall

            la $a0,endl
            li $v0,4
            syscall

            li $v0,10
            syscall         # au revoir...

            vowell: li $v0,0
            beq  $a0, a ,yes
            beq  $a0, e ,yes
            beq  $a0, i ,yes
            beq  $a0, o ,yes
            beq  $a0, u ,yes
            jr $ra
            yes:    li $v0,1
                    jr $ra
            vowelu:
            li $v0,0
            beq $a0, A ,yes
            beq $a0, E ,yes
            beq $a0, I ,yes
            beq $a0, O ,yes
            beq $a0, U ,yes
                    jr $ra

            vcount:
            sub $sp,$sp,20
            sw $a0,0($sp)
            sw $s0,4($sp)
            sw $s1,8($sp)
            sw $ra,12($sp)
            sw $s2,16($sp)

            li $s0,0
            li $s2,0
            move $s1,$a0

            nextc:
            lb $a0,($s1)
            beqz $a0,done
            jal vowell
            add $s0,$s0,$v0
            jal vowelu
            add $s2,$s2,$v0
            add $s1,$s1,1
            b nextc
            done:
            move $v0,$s0
            move $t0,$s2

            lw $a0,0($sp)
            lw $s0,4($sp)
            lw $s1,8($sp)
            lw $ra,12($sp)
            lw $s2,16($sp)
            add $sp,$sp,20
            jr $ra

            .data
            str:    .asciiz "Long Time Ago in a Galaxy Far Far Away"
            endl:   .asciiz "
"

我不理解底是谁。 这个方案分别储存在0和0中,因此点是什么? 看起来它只是最终恢复原来的价值观。 究竟是怎么做的,只是证明它有可能吗?

最佳回答

我不熟悉科索沃警察部队大会,但总的来说,每个平台都有公约,说明应当如何行事。 其中一项公约通常是由万国邮联登记为非常规公约。 这两项公约合在一起构成了《阿拉伯比较法》。

想这样做: 当你有一个只有几个分区的方案时,它很容易追踪“耶哈”的情况,这种例行破坏每当你称之为X”。 但是,随着你方案的增长,这变得非常困难。 很难改变使用新登记册的职能——然后必须检查每一次要求这种例行工作的地点,以确保它不会在整个电话中依赖登记册。 每一个要求这些例行公事的例行公事等等。 改变一种常用的公用事业功能,而你必须核实整个方案;这样,就是mad。

这方面有两个可维持的解决办法:打电话者可以节省其使用的所有登记册,或打电话者可节省所有登记册的变化。 通常,你期望代码在电话链中更加复杂(并使用较少的登记册),因此,被点人可能拥有较小的储蓄装置。 此外,职能要求的数量通常超过职能数目,因此,退休人员的储蓄也减少了编码。 它像MIPS那样遵循这一逻辑,要求被传唤者拯救登记册。 有时,在拥有大量登记册(如电力总会)的建筑中,有一些被认为是“临时”的,因此,被点人不必予以挽救;这是两种做法的结合。

问题回答

我对科索沃警察部队不了解很多情况,但我假定这一想法类似于x86。

同你所说的话一样,最后的LW正在恢复原来的价值。 之所以出现这种情况,是因为你可以把另一个职能(接受风格)称为一种功能,而不是担心失去被分配用于记忆的帽子上的变数和价值(像激光器等)。

例如,请说,你在一段时间用一行的整页案文重新编辑。 页: 1 现在,当你履行计票数量的职责时,你不想担心失去这一价值,从而推向了 st。 你的誓言将发挥应有的作用,使用它想要的登记册,然后完成(取决于你的方法)将价值从 st到原地。 这样,内部职能就把我带上外部功能,而你没有通过所谓的方法的功能来篡改你的登记册。

在最常用的MIPS电话公约中

  • the temporary registers $t0,$t1,...,$t9 can be destroyed (i.e. changed and not restored) when you call a function.
  • the $s0,$s1,...,$s7 (callee saved) registers must remain unchanged after you call a function. The function you call will typically store the value of the callee saved registers on the stack if it needs to use these registers. The callee saved registers will be restored from the stack right before the function returns.




相关问题
Having many stacks with different types

I m making a C program that needs to use two stacks. One needs to hold chars, the other needs to hold doubles. I have two structs, node and stack: struct node { double value; struct node *...

定型语言是否具有范围概念?

定型语言是否具有范围概念? 在我看来,如果职能参数被放在职能执行之前的位置上,这些参数就会以不正统的方式出现。

Stack memory fundamentals

Consider this code: char* foo(int myNum) { char* StrArray[5] = {"TEST","ABC","XYZ","AA","BB"}; return StrArray[4]; } When I return StrArray[4] to the caller, is this supposed to work? ...

negative number in the stack

I am a new student in the compilers world ^_^ and I want to know is legal represent negative number in the stack. For example: infix: 1-5=-4 postfix: 15- The statements are: push(1) push(5) x=...

热门标签