Пытаясь понять пример SYSCALL 5, порядок литералов% placeholder сбивает с толку - PullRequest
0 голосов
/ 08 января 2019

Я изучаю MIPS64 и использую симулятор EduMIPS64.

Я понимаю инструкции следующего примера, я пытался выполнить его цикл за циклом, но я не понимаю, как компилятор знает, какое число или строка соответствует соответствующему заполнителю и как все относится к format_str, так что в конце раздела .code достаточно указать адрес format_str в r14

Я знаю, что системные вызовы ожидают, что адрес их параметров хранится в регистре R14, но как все остальные относятся к этому адресу (format_str)?

Для каждого %s, %d или %i заполнителя, SYSCALL 5 ожидает параметр, начиная с адреса предыдущего. Когда SYSCALL находит заполнитель для целочисленного параметра, он ожидает, что соответствующий параметр является целочисленным значением, если, если он находит заполнитель для строкового параметра, он ожидает в качестве параметра адрес строки.

Я пытался понять это по представлению в памяти, но безуспешно.

            .data
format_str: .asciiz "%dth of %s:\n%s version %i.%i is being tested!"
s1:         .asciiz "June"
s2:         .asciiz "EduMIPS64"
fs_addr:    .space  4
            .word   5
s1_addr:    .space  4
s2_addr:    .space  4
            .word   0
            .word   5
test:
            .code
            daddi   r5, r0, format_str
            sw      r5, fs_addr(r0)
            daddi   r2, r0, s1
            daddi   r3, r0, s2
            sd      r2, s1_addr(r0)
            sd      r3, s2_addr(r0)
            daddi   r14, r0, fs_addr
            syscall 5
            syscall 0

Спасибо.

1 Ответ

0 голосов
/ 08 января 2019

Симулятору на самом деле не нужно ничего знать о заполнителях.

Он знает, где строка формата и все другие значения находятся в моделируемой памяти (fs_addr), потому что вы передали этот адрес в r14. Таким образом, симулятор может просто взять этот адрес и сопоставить его с соответствующим адресом в памяти хост-машины, преобразовать первые два слова по этому адресу в const char* и va_list, а затем вызвать vprintf.

Я не знаю, действительно ли этим занимается EduMIPS64, но это похоже на одно из более простых решений.


Это показывает, что каждый из заполнителей в вашем примере соответствует:

"%dth of %s:\n%s version %i.%i is being tested!"
 |       |    |           |  | 
 |       |    |           |  +-+
 |       |    |           +-+  |
 |       |    +----------+  |  |
 |       +-------------+ |  |  |
 +--------->.word   5  | |  |  | 
                       | |  |  |
s1_addr:    .space  4<-+ |  |  |
s2_addr:    .space  4<---+  |  |
            .word   0<------+  |
            .word   5<---------+
...