Зачем сборка компилятора C программы в этом? - PullRequest
0 голосов
/ 26 июня 2018

Я не понимаю, почему компилятор C51 (в Keil) конвертирует исходный код C в этот код языка ассемблера: (так как p - указатель на неподписанный символ)

;   p++;
            ; SOURCE LINE # 216
    MOV     R3,pDisplay?253
    INC     pDisplay?253+02H
    MOV     A,pDisplay?253+02H
    MOV     R2,pDisplay?253+01H
    JNZ     ?C0090
    INC     pDisplay?253+01H

Поскольку R3 и R2 не использовались в следующих строках программы.
Почему компилятор делает эти строки
MOV R3,pDisplay?253,
MOV R2,pDisplay?253+01H?

1 Ответ

0 голосов
/ 26 июня 2018

Добро пожаловать в современную генерацию кода 1980-х годов для 8-битных целевых процессоров. То, что делает код, это «записывает значение» p перед его увеличением. Это необходимо, когда оператор постинкремента используется в окружающем выражении; и не оптимизируется последующими проходами компилятора.

Попробуйте p += 1; или даже ++p;. Скорее всего, один или оба из них будут генерировать лучший код, потому что нет семантики «обратите внимание на значение перед», чтобы попасть на пути генератора кода.

[Кстати, именно так я попал в меньшинство, используя ++i в for () циклах, а не более распространенные i++.]

...