1. Limited time only! Sign up for a free 30min personal tutor trial with Chegg Tutors
    Dismiss Notice
Dismiss Notice
Join Physics Forums Today!
The friendliest, high quality science and math community on the planet! Everyone who loves science is here!

Assembly, basically coding a loop

  1. Apr 5, 2010 #1
    1. The problem statement, all variables and given/known data

    The goal of this problem is to write a MIPS function flipimage which flips an image
    horizontally. For example, a simple image is shown on the left, and its flip is shown on
    the right.
    A picture is composed of individual dots, or pixels, each of which will be represented by
    a single byte. The entire two-dimensional image is then stored in memory row by row.
    For example, we can store a 4 x 6 picture in memory starting at address 1000 as follows:
    • The first row (consisting of 6 pixels) is stored at addresses 1000-1005.
    • The second row is stored at addresses 1006-1011.
    • The third row is stored at 1012-1017
    • The last row is stored at addresses 1018-1023.
    (a) Write a MIPS function fliprow to flip a single row of pixels. The function has two
    arguments, passed in $a0 and $a1: the address of the row and the number of pixels in that
    row. There is no return value. Be sure to follow all MIPS calling conventions

    3. The attempt at a solution
    So, this is what I have but I'm not sure if this is right or if I'm approaching this all wrong.

    # $a0 - address of row
    # $a1 - number of pixels in row
    # $t2 - counter variable
    # $t0 - num pixels/ 2
    # $t1 - end address of row
    # $t6 - pixel from left half
    # $t7 - pixel from right half

    add $t2, $0, $0 # set the counter variable to 0
    srl $t0, $a1, 1 # divide the number of pixels by 2 which is the number of times we need
    # loop to flip it
    add $t1, $0, $a1 # put the number of pixels into t1
    add $t1, $a0, $t1 # add to the beginning address to get to the end address

    lb $t6, 0($a0) # load the byte into t6 (left half)
    lb $t7, 0($t1) # load the byte into $t7 ( right half)
    sb $t6, 0($t1) # store t6 at position t1, basically swap
    sb $t7, 0($a0) # store t7 at position a0, swapping
    addi $a0, $a0, 1 # get the address of the next pixel by adding 8
    addi $t1, $t1, -1 # get the address of the previous pixel from end by adding -8
    addi $t2,$t2, 1 # increment the counter by 1
    bne $t0, $t2, loop # while the counter is not equal to half the number of pixels loop

    Can someone please tell me if this seems to be right? And if not where I'm going wrong? An explination would really help too, I'm new to assembly so it's not completely clear to me. Thank you so much
    Last edited: Apr 5, 2010
  2. jcsd
  3. Apr 5, 2010 #2


    User Avatar
    Staff Emeritus
    Science Advisor
    Homework Helper
    Education Advisor

    You have the basic idea, but there are several mistakes. For one thing, you should address bytes, not bits, so you want to loop on the number of bytes. Second, you load bytes but then you store words. Also, your calculations seem to be off. When you swap the first row, you do three swaps: 1000<->1005, 1001<->1004, 1002<->1003. Make sure your variables have the right values; it's a common error to be off by 1. Finally, I'm not familiar with MIPS calling conventions, but I don't think you've considered that yet.
  4. Apr 5, 2010 #3
    oops, the lw and sw's were my stupid mistake. I don't really need to store anything with the calling conventions because I'm not calling anything else from thsi function. How would I go about getting to each byte that needs to be loaded? I figured if i just added 8 to the address it would get me to the next byte location. Is this incorrect? Also where am I doing a third swap? I don't see where you see it. I fixed the loads/stores above, thank you
  5. Apr 5, 2010 #4


    User Avatar
    Staff Emeritus
    Science Advisor
    Homework Helper
    Education Advisor

    You don't address by bit; you address by byte. Each address corresponds to the location of a byte, so if you increment the address by one, you have the address of the next byte.

    The three swaps I mentioned are the ones that are supposed to happen when you flip the first row. My point was you should make sure your routine actually does those swaps, rather than, say, 1000<->1006, etc. When you enter the routine, $a0 will contain 1000, and $a1 will contain 6. Right before you enter the loop for the first time, what values are in $t0, $t1, and $t2? Are they correct?
  6. Apr 5, 2010 #5
    Oh I see, i corrected it to increment by 1. I didn't realize it was addressed by bytes.

    When you said three swaps I thought you meant that my program was doing 3 each time it looped. I understand what you mean now. I'm pretty sure $t0, $t1, and $t2 are correct. Once its done byte wise I just added the number of bytes which is the number of pixels to the starting address which gives me the ending address in $t1. $t2 starts at 0 which is correct and $t0 is the number of pixels divided by 2 and if i'm correct, if the number is odd it should still return an even number for example 5/2 returns 2 So I don't see anything wrong with those.... unless theres something i'm completely missing
  7. Apr 5, 2010 #6


    User Avatar
    Staff Emeritus
    Science Advisor
    Homework Helper
    Education Advisor

    If $a0 is 1000 and $a1 is 6, what will be in $t1. Is it the address of the last pixel of the first row as you want it to be?
  8. Apr 5, 2010 #7
    ohhh that makes more sense. Sorry, I don't know why, i just didn't see it. So, I guess the last address would be the beginning plud the number of pixels minus 1
Know someone interested in this topic? Share this thread via Reddit, Google+, Twitter, or Facebook