movw и movt в сборке руки - PullRequest
       24

movw и movt в сборке руки

9 голосов
/ 18 октября 2011

У меня проблемы с расшифровкой этого блока кода сборки. Каким будет значение r1 к концу и как мне туда добраться?

3242ba66    f6454118    movw    r1, 0x5c18
3242ba6a        466f    mov     r7, sp
3242ba6c    f6c0415a    movt    r1, 0xc5a
3242ba70    f2460002    movw    r0, 0x6002
3242ba74    f6c0405a    movt    r0, 0xc5a
3242ba78        4479    add     r1, pc
3242ba7a        4478    add     r0, pc
3242ba7c        6809    ldr     r1, [r1, #0]

1 Ответ

32 голосов
/ 18 октября 2011

movw, за которым следует movt, является распространенным способом загрузки 32-разрядного значения в регистр. Это эквивалентно объединению этих двух непосредственных значений с ИЛИ, при этом movt является старшим 16-разрядным. В этом случае r1 = (movt immediate value << 16) | (movw immediate value)).

3242ba66    f6454118    movw    r1, 0x5c18   // r1 = 0x5c18
3242ba6a        466f    mov     r7, sp
3242ba6c    f6c0415a    movt    r1, 0xc5a    // r1 = (r1 & 0xffff) | (0xc5a << 16)
3242ba70    f2460002    movw    r0, 0x6002
3242ba74    f6c0405a    movt    r0, 0xc5a
3242ba78        4479    add     r1, pc       // r1 = r1 + pc
3242ba7a        4478    add     r0, pc
3242ba7c        6809    ldr     r1, [r1, #0] // r1 = *(r1 + 0)
...