Код ассемблера в макросах __range_ok - PullRequest
1 голос
/ 13 сентября 2011

Можете ли вы объяснить мне этот код?Я действительно не понимаю этого.

См. http://lxr.free -electrons.com / source / arch / arm / include / asm / uaccess.h # L70

 #define __addr_ok(addr) ({ \
         unsigned long flag; \
         __asm__("cmp %2, %0; movlo %0, #0" \
                 : "=&r" (flag) \
                 : "" (current_thread_info()->addr_limit), "r" (addr) \
                 : "cc"); \
         (flag == 0); })

 /* We use 33-bit arithmetic here... */
 #define __range_ok(addr,size) ({ \
         unsigned long flag, roksum; \
         __chk_user_ptr(addr);   \
         __asm__("adds %1, %2, %3; sbcccs %1, %1, %0; movcc %0, #0" \
                 : "=&r" (flag), "=&r" (roksum) \
                 : "r" (addr), "Ir" (size), "" (current_thread_info()->addr_limit) \
                 : "cc"); \
         flag; })

Это из ядра ARM Linux, __range_ok

1 Ответ

1 голос
/ 13 сентября 2011

В качестве общего источника информации, касающейся использования регистра и других украшений, посмотрите документы для Расширенная встроенная сборка GCC

Я предлагаю вам запустить этот источник через

gcc .... -S

чтобы увидеть, каков результат сгенерированного результата.

Вы также можете запустить

objdump -dC -S <objectfile.o>

Вам понадобится objdump из вашего кросс-компиляторного набора инструментов.Кроме того, скомпилируйте с отладочной информацией, чтобы получить исходную аннотацию (-S).Скомпилируйте с -O0, чтобы избежать путаницы из-за оптимизации.

...