Инструкция по сборке, чтобы разыменовать указатель на символ и вернуть результат - PullRequest
1 голос
/ 27 сентября 2019

В упражнении из моей книги по CS запрашивается короткий (x86-64) фрагмент сборки для функции, которая принимает в качестве аргумента указатель на символ и возвращает (первый) символ, указанный им.

Предложенное решениев книге следующее:

movq (%rdi), %rax
movb (%rax), %al

Я бы подумал, что одной инструкции будет достаточно:

movb (%rdi), %al

Являются ли эти два эквивалента?Чего мне не хватает?

1 Ответ

2 голосов
/ 27 сентября 2019

В вашем первом фрагменте происходят две разыменования указателя:

movq (%rdi), %rax
movb (%rax), %al

То есть 8-байтовая ячейка памяти, указанная rdi, загружается в rax.Затем 1-байтовая ячейка памяти, указанная rax, загружается в al.Вы можете думать об этом как о полном разыменовании указателя на указатель на char (т. Е. char **).

В то время как в вашем втором фрагменте, movb (%rdi), %al, естьразыменование одного указателя, т. е. 1-байтовое местоположение, на которое указывает rdi, загружается в al.Вы можете думать об этом как о разыменовании указателя на char (то есть, char *).

...