Адресация
индексация, SPIM: работа с байтами. Секции .text и .data
- Адресация.
- Адресация — обращение к элементу данных по его адресу. Существует несколько способ интерпретации битов инструкции для указания местоположения данных:
- Неявная адресация
- Непосредственная
- Прямая
- Регистровая
- Косвенная
- Базовая
- Относительная
- Индексная
- ...
- Секции(сегменты)
- В программе принято отделять данные от кода. Секция есть непрерывный диапазон адресов, все данные в которых считаются с некоторой точки зрения однородными.
- Некоторые процессоры аппаратно поддерживают подобное разделение.
- Для определения секций в языке ассемблера MARS служат директивы: ".text" и ".data".
- Ассемблер MARS не позволяет определять данные в секции .text.
- директивы определения данных: ".word", ".half", ".byte", ".asciiz", ".ascii"
- метки
- точка входа, директива ".globl"
- Команды загрузки и сохранения:
- lw, lh, lhu, lb, lbu
- sw, sh, sb
- lbu
1 ## poly.asm -- complete program 2 ## 3 ## evaluate 5x^2 -12x + 97 4 ## 5 ## Register Use: 6 ## 7 ## $10 base register, address of x 8 ## $11 x 9 ## $12 value of the polynomial 10 ## $13 temporary 11 12 .text 13 .globl main 14 15 main: 16 lui $10,0x1001 # Init base register 17 lw $11,0($10) # Load x 18 19 ori $12,$0,97 # Initialize the accumulator 20 # during the "load delay slot" 21 22 ori $13,$0,12 # evaluate second term 23 mult $11,$13 # 12x 24 mflo $13 # assume 32 bit result 25 subu $12,$12,$13 # accumulator = -12x +97 26 27 # evaluate third term 28 mult $11,$11 # x^2 29 mflo $11 # assume 32 bit result 30 ori $13,$0,5 # 5 31 mult $11,$13 # 5x^2 32 mflo $13 # 33 addu $12,$12,$13 # accumulator = 5x^2-12x+97 34 35 sw $12,4($10) # Store result in poly 36 37 .data 38 x: .word 17 # Edit this line to change the value of x 39 poly: .word 0 # Result is placed here. 40 41 ## End of file
- Команды перехода:
- j, jr
- beq, bne, bltz, bgez
1 ## $8 --- A, two's comp. integer 2 ## $9 --- sign bit of A 3 ## $10 --- base register for .data section 4 5 .text 6 .globl main 7 8 main: 9 # Get A 10 lui $10,0x1001 # Init base register 11 lw $8,0($10) # Load A 12 sll $0,$0,0 13 14 # Is A Negative? 15 srl $9,$8,31 # Shift sign bit to position 0 16 beq $0,$9,done # sign bit == zero, done 17 sll $0,$0,0 18 19 # Store -A 20 subu $8,$0,$8 # negate A 21 sw $8,0($10) # save it 22 23 done: sll $0,$0,0 # target of the branch 24 25 .data 26 A: .word -14 27 28 ## End of File
- Работа с байтами.
1 ## endian.asm 2 ## 3 ## copy $9 to memory in big-endian order 4 ## 5 ## Register Use: 6 ## $8 --- first byte of the tape buffer 7 ## $9 --- 4-byte integer 8 9 .text 10 .globl main 11 12 main: 13 lui $9,0x1234 # put data in $9 14 ori $9, $9, 0x5678 # 15 lui $8,0x1001 # $8 is base register 16 sb $9,3($8) # least significant byte 17 srl $9,$9,8 # move next byte to low order 18 sb $9,2($8) # bits 8-15 19 srl $9,$9,8 # move next byte to low order 20 sb $9,1($8) # bits 16-23 21 srl $9,$9,8 # move next byte to low order 22 sb $9,0($8) # most significant byte 23 24 .data 25 tape: # base register points here 26 .space 1024 # tape buffer (1K bytes) 27
- Массивы.
1 ## addIntArray.asm 2 ## 3 ## Sum all integers, the positive integers, 4 ## and the negative integers in an array. 5 6 ## Registers: 7 ## $8 -- count 8 ## $9 -- pointer to the array entry 9 ## $10 -- current array entry 10 ## $11 -- sum of all integers 11 ## $12 -- sum of negative integers 12 ## $13 -- sum of positive integers 13 ## $14 -- pos. or neg. flag 14 ## $15 -- length of the array 15 16 .text 17 .globl main 18 # Initialize 19 main: ori $8,$0,0 # count = 0 20 ori $11,$0,0 # sum = 0 21 ori $12,$0,0 # neg = 0 22 ori $13,$0,0 # pos = 0 23 lui $9,0x1001 # point at SIZE 24 25 lw $15,0($9) # get SIZE 26 addiu $9,$9,4 # point to first entry 27 28 # while count < SIZE do 29 loop: beq $8,$15,done 30 sll $0,$0,0 # branch delay 31 32 # get entry, add to sum 33 lw $10,0($9) # get entry 34 sll $0,$0,0 # load delay 35 addu $11,$11,$10 # add to sum 36 37 # test neg. or pos. 38 slti $14,$10,0x0 # set $14 if entry is neg 39 bne $14,$0,neg # branch if negative 40 sll $0,$0,0 # branch delay 41 addu $13,$13,$10 # positive: add to PLUS 42 j ifend 43 sll $0,$0,0 # branch delay 44 45 neg: addu $12,$12,$10 # negative: add to NEG 46 47 ifend: addiu $8,$8,1 # count++ 48 addiu $9,$9,4 # point at next entry 49 j loop 50 sll $0,$0,0 # branch delay 51 52 # finish 53 done: sll $0,$0,0 # target for branch 54 55 .data 56 size: .word 4 57 array: .word 1, 2, -2, -1
- Аресация MIPS: