Qtspim (эмулятор MIPS) появляется дополнительный код?

Я установил Qtspim, чтобы опробовать некоторые команды MIPS. Я написал несколько текстовых файлов, сохраненных с расширением ".asm", с некоторыми командами. Вот один из них:

.text
.globl main
main:
    addi $t0, $zero, 3
    addi $t1, $zero, 5
    add $t2, $t0, $t1
li  $v0, 10
syscall

Однако, когда я пытаюсь выполнить команду "Reinitialize and Load File" в Qtspim, текст, отображаемый в разделе "text" программы, не соответствует моему текстовому файлу. Мой код находится в середине этого, но с кучей дополнительного кода, которого не было в моем файле. Почему это? Я загружаю это как-то неправильно? Что это за другой код?

   User Text Segment [00400000]..[00440000]
   [00400000] 8fa40000  lw $4, 0($29)            ; 183: lw $a0 0($sp) # argc 
   [00400004] 27a50004  addiu $5, $29, 4         ; 184: addiu $a1 $sp 4 # argv 
   [00400008] 24a60004  addiu $6, $5, 4          ; 185: addiu $a2 $a1 4 # envp 
   [0040000c] 00041080  sll $2, $4, 2            ; 186: sll $v0 $a0 2 
   [00400010] 00c23021  addu $6, $6, $2          ; 187: addu $a2 $a2 $v0 
   [00400014] 0c100009  jal 0x00400024 [main]    ; 188: jal main 
   [00400018] 00000000  nop                      ; 189: nop 
   [0040001c] 3402000a  ori $2, $0, 10           ; 191: li $v0 10 
   [00400020] 0000000c  syscall                  ; 192: syscall # syscall 10 (exit) 
   [00400024] 20080003  addi $8, $0, 3           ; 2: addi $t0, $zero, 3 
   [00400028] 20090005  addi $9, $0, 5           ; 3: addi $t1, $zero, 5 
   [0040002c] 01095020  add $10, $8, $9          ; 4: add $t2, $t0, $t1 
   [00400030] 3402000a  ori $2, $0, 10           ; 5: li $v0, 10 
   [00400034] 0000000c  syscall                  ; 6: syscall 

   Kernel Text Segment [80000000]..[80010000]
   [80000180] 0001d821  addu $27, $0, $1         ; 90: move $k1 $at # Save $at 
   [80000184] 3c019000  lui $1, -28672           ; 92: sw $v0 s1 # Not re-entrant and we can't trust $sp 
   [80000188] ac220200  sw $2, 512($1)           
   [8000018c] 3c019000  lui $1, -28672           ; 93: sw $a0 s2 # But we need to use these registers 
   [80000190] ac240204  sw $4, 516($1)           
   [80000194] 401a6800  mfc0 $26, $13            ; 95: mfc0 $k0 $13 # Cause register 
   [80000198] 001a2082  srl $4, $26, 2           ; 96: srl $a0 $k0 2 # Extract ExcCode Field 
   [8000019c] 3084001f  andi $4, $4, 31          ; 97: andi $a0 $a0 0x1f 
   [800001a0] 34020004  ori $2, $0, 4            ; 101: li $v0 4 # syscall 4 (print_str) 
   [800001a4] 3c049000  lui $4, -28672 [__m1_]   ; 102: la $a0 __m1_ 
   [800001a8] 0000000c  syscall                  ; 103: syscall 
   [800001ac] 34020001  ori $2, $0, 1            ; 105: li $v0 1 # syscall 1 (print_int) 
   [800001b0] 001a2082  srl $4, $26, 2           ; 106: srl $a0 $k0 2 # Extract ExcCode Field 
   [800001b4] 3084001f  andi $4, $4, 31          ; 107: andi $a0 $a0 0x1f 
   [800001b8] 0000000c  syscall                  ; 108: syscall 
   [800001bc] 34020004  ori $2, $0, 4            ; 110: li $v0 4 # syscall 4 (print_str) 
   [800001c0] 3344003c  andi $4, $26, 60         ; 111: andi $a0 $k0 0x3c 
   [800001c4] 3c019000  lui $1, -28672           ; 112: lw $a0 __excp($a0) 
   [800001c8] 00240821  addu $1, $1, $4          
   [800001cc] 8c240180  lw $4, 384($1)           
   [800001d0] 00000000  nop                      ; 113: nop 
   [800001d4] 0000000c  syscall                  ; 114: syscall 
   [800001d8] 34010018  ori $1, $0, 24           ; 116: bne $k0 0x18 ok_pc # Bad PC exception requires special checks 
   [800001dc] 143a0008  bne $1, $26, 32 [ok_pc-0x800001dc] 
   [800001e0] 00000000  nop                      ; 117: nop 
   [800001e4] 40047000  mfc0 $4, $14             ; 119: mfc0 $a0 $14 # EPC 
   [800001e8] 30840003  andi $4, $4, 3           ; 120: andi $a0 $a0 0x3 # Is EPC word-aligned? 
   [800001ec] 10040004  beq $0, $4, 16 [ok_pc-0x800001ec]
   [800001f0] 00000000  nop                      ; 122: nop 
   [800001f4] 3402000a  ori $2, $0, 10           ; 124: li $v0 10 # Exit on really bad PC 
   [800001f8] 0000000c  syscall                  ; 125: syscall 
   [800001fc] 34020004  ori $2, $0, 4            ; 128: li $v0 4 # syscall 4 (print_str) 
   [80000200] 3c019000  lui $1, -28672 [__m2_]   ; 129: la $a0 __m2_ 
   [80000204] 3424000d  ori $4, $1, 13 [__m2_]   
   [80000208] 0000000c  syscall                  ; 130: syscall 
   [8000020c] 001a2082  srl $4, $26, 2           ; 132: srl $a0 $k0 2 # Extract ExcCode Field 
   [80000210] 3084001f  andi $4, $4, 31          ; 133: andi $a0 $a0 0x1f 
   [80000214] 14040002  bne $0, $4, 8 [ret-0x80000214]; 134: bne $a0 0 ret # 0 means exception was an interrupt 
   [80000218] 00000000  nop                      ; 135: nop 
   [8000021c] 401a7000  mfc0 $26, $14            ; 145: mfc0 $k0 $14 # Bump EPC register 
   [80000220] 275a0004  addiu $26, $26, 4        ; 146: addiu $k0 $k0 4 # Skip faulting instruction 
   [80000224] 409a7000  mtc0 $26, $14            ; 148: mtc0 $k0 $14 
   [80000228] 3c019000  lui $1, -28672           ; 153: lw $v0 s1 # Restore other registers 
   [8000022c] 8c220200  lw $2, 512($1)           
   [80000230] 3c019000  lui $1, -28672           ; 154: lw $a0 s2 
   [80000234] 8c240204  lw $4, 516($1)           
   [80000238] 001b0821  addu $1, $0, $27         ; 157: move $at $k1 # Restore $at 
   [8000023c] 40806800  mtc0 $0, $13             ; 160: mtc0 $0 $13 # Clear Cause register 
   [80000240] 401a6000  mfc0 $26, $12            ; 162: mfc0 $k0 $12 # Set Status register 
   [80000244] 375a0001  ori $26, $26, 1          ; 163: ori $k0 0x1 # Interrupts enabled 
   [80000248] 409a6000  mtc0 $26, $12            ; 164: mtc0 $k0 $12 
   [8000024c] 42000018  eret                     ; 167: eret 

1 ответ

Решение

Это выглядит хорошо для меня. Код перед вашим кодом - это просто некоторые вещи, которые SPIM вставляет для имитации вашей программы, связанной с crt0. Как вы можете видеть по адресу 00400014 есть jal инструкция, которая будет называть ваш main функция.

Код, следующий за вашим кодом (текстовый сегмент ядра), является другой областью памяти, и вам обычно не о чем беспокоиться.

Другие вопросы по тегам