Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MIPS assembly: how to declare integer values in the .data section?

Tags:

assembly

mips

I'm trying to get my feet wet with MIPS assembly language using the MARS simulator.

My main problem now is how do I initialize a set of memory locations so that I can access them later via assembly language instructions?

For example, I want to initialize addresses 0x1001000 - 0x10001003 with the values 0x99, 0x87, 0x23, 0x45. I think this can be done in the data declaration (.data) section of my assembly program but I'm not sure of the syntax. Is this possible?

Alternatively, in the .data section, how do I specify storing the integer values in some memory location (I don't care where, but I just want to reference them somewhere). So I'm looking for the C equivalent of "int x = 20, y=30, z=90;" I know how to do that using MIPS instructions but is it possible to declare something like that in the .data section of a MIPS assembly program?

like image 279
Barney Avatar asked Apr 12 '10 03:04

Barney


People also ask

How big is an integer in MIPS?

an integer requires 1 word (4 bytes) of storage.

What is .word in MIPS?

A word generally means the number of bits that can be transferred at one time on the data bus, and stored in a register. In the case of MIPS, a word is 32 bits, that is, 4 bytes. Words are always stored in consecutive bytes, starting with an address that is divisible by 4.


2 Answers

You don't usually initialize specific memory locations; each section (including .data) is positioned at link time, and relocations are resolved then

To make a relocation on a data entry, you choose a name and put name: before it, so you can refer to it by name later. You specify a data block using .size value. For example:

.data
    x: .word 20
    y: .word 30
    z: .word 90

Then you can use the labels in your assembly:

.text
    lw $t0, x
like image 63
Michael Mrozek Avatar answered Oct 26 '22 04:10

Michael Mrozek


so if I declared x: .word 701 y: .word 701 then .text bge y, x, endin the main body of the program, the condition would accept the integer variables x and y thus allowing the end method to be completed?

I believe this is wrong, specifiying x or y inside your mips program will only return you the base address of x and y. For example, if you typed

addi $t0,y,8

Would give you $t0 = 10000010 (assuming address of y begins at 10000000)

The correct way to compare 2 values from 2 word with labels x and y would be something like

.data
x: .word 701
y: .word 701

.text
main:
   lw $t0,x              #loads $t0 with 701
   lw $t1,y              #loads $t1 with 701
   bge $t0,$t1,end       #compares $t0 and $t1, if equal, jump to address [end]

end:
   #the code segment for end label
like image 26
Gary Tan Avatar answered Oct 26 '22 04:10

Gary Tan