Сравнение регистров Intel и Arm с помощью Swift / lldb
При проверке регистров функции Swift iOS я не понимал, почему не могу создать простое отображение определенных регистров arm64 на регистры x86/64. Я всегда смотрел на вход в функцию.
Я попробовал следующее сопоставление, но это не сработало.
ОТВЕТИТЬ @JasonMolenda ниже.
У ЛЛДБ было удобство $arg
переменная для этой самой цели.
(lldb) reg read $arg5
x4 = 0x0000000000000020
(lldb) po $arg3
1
(lldb) p/x $arg3
(unsigned long) $4 = 0x0000000000000001
Теперь вам не нужно помнить сопоставления между x86/64 и arm64:o)
1 ответ
Если вы просто смотрите на соглашения о вызовах и регистры при входе / выходе из функции (не в середине), то да, они подходят для соглашения о вызовах System V. в x86-64.
См. Каковы соглашения о вызовах для системных вызовов UNIX и Linux на i386 и x86-64 для ознакомления с кратким описанием соглашения о вызовах функций (и см. https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI для получения полной информации о ABI, включая то, как маленькие и большие структуры и значения FP передаются / возвращаются по значению.)
Согласно https://en.wikipedia.org/wiki/Calling_convention, стандартное соглашение о вызовах AArch64 передает аргументы в x0..x7
, а также возвращается в x0
, (Из этого супер-краткого резюме не ясно, насколько большой аргумент может быть возвращен в регистрах, может ли 16-байтовая структура быть возвращена в x1:x0.)
Но внутри функции все зависит от компилятора, и он даже не пытается подобного кода.
Вы компилируете отдельные двоичные файлы для отдельных архитектур. При компиляции для x86-64 компилятор, вероятно, даже не пытается создать asm, похожий на AArch64, просто применить правило "как если" и сделать asm, который реализует функцию максимально эффективно для x86-64.
Различная настройка эвристики приведет к разным встраиваниям и другим решениям генерации кода.
AArch64 имеет больше архитектурных регистров, чем x86-64. Очевидно, что не может быть отображения 1:1, даже если вы используете компилятор x86-64, который пытался создать ассемблер x86-64, который выглядел как ассемблер AArch64 для той же функции.