Сравнение регистров 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 для той же функции.

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