Почему я не могу присвоить значение блока PID регистра FS для беззнакового целого? - PullRequest
0 голосов
/ 08 мая 2019

Краткое описание (32-битная сборка)

Почему это приводит к неправильной ошибке операнда?

unsigned int GetPID() {

    unsigned int id;
    __asm {
        mov id, fs:[0x20];
    }
    return id;

а не это?

unsigned int GetPID() {

    unsigned int id;
    __asm {
        mov ebx, fs:[0x20];
        mov id, ebx;
    }
    return id;
}

Я новичок в использовании ассемблера в C, и я хотел бы получить некоторые пояснения о том, как все работает, когда я его использую.

Примечание. Я знаю, что использовать эту функцию, чтобы получить текущий идентификатор процесса, плохо. Это всего лишь эксперимент, я также изучаю операционные системы.

Дополнительный вопрос: можно ли написать половину функции в скобках? а затем закончить функцию с C? или каждая функция должна быть либо всей C, либо всей сборкой?

Ответы [ 3 ]

5 голосов
/ 08 мая 2019

Сборка Intel не поддерживает MOV из памяти в память.id - это ячейка памяти.Вы можете только MOV из памяти в регистр или наоборот.

Тем не менее, проверьте встроенную компилятор __readfsdword.

2 голосов
/ 08 мая 2019

а не это? Потому что регистр используется для батутирования значения; без этого батута код операции может выглядеть примерно так: movl -4 [ebp], fs: [0x20]. Вы еще не вышли из леса - в большинстве реализаций ebx - это регистр, сохраняемый вызываемым пользователем, поэтому, повредив его, вы вызовете ошибку где-нибудь в стеке вызовов. Это особенно неприятно для отладки, потому что все следы GetPID могут быть удалены (переписаны в стеке) до того, как повреждение будет обнаружено.

нормально, чтобы написать функцию ?: мое мнение таково, что все C или все сборки лучше: они более понятны и более удобны в обслуживании. Даже со спецификацией gcc -ограничений, вставка - это грандиозный удар между версиями компилятора и ошибками в различных версиях. Кто хочет, чтобы это запеклось в вашем источнике? Модуль сборки должен соответствовать только соответствующему ABI [обычно хорошо опубликованному], и дает хорошее место, чтобы сказать: «Это зависит от машины».

0 голосов
/ 08 мая 2019

Давным-давно я обнаружил, что написание встроенных ассемблеров в .c файлах всегда было ошибкой. Вместо того, чтобы иметь короткий список очевидных мест, которые вы должны изменить при портировании на новый процессор, вы в конечном итоге разбросаны повсюду. Я позволил себе переписать вашу функцию в .asm файле для вас:

.486
.MODEL FLAT
.CODE
PUBLIC _GetPID
_GetPID PROC
    mov eax, fs:[0x20]
    ret
_GetPID ENDP
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...