簡體   English   中英

C到arm匯編代碼轉換

[英]C to arm assembly code conversion

我在c中編寫了一個程序並將其轉換為arm程序集,現在我在理解匯編代碼中生成的某些指令時遇到了問題。 C程序的一部分是:

#define MAX_DIGIT 1024
int main()
{
    int fd[MAX_DIGIT];
    int xLen = 0;
    int sd[MAX_DIGIT];
    int yLen = 0;

    int result[6*MAX_DIGIT];

    // Take input for two numbers
    takeInput(fd, &xLen);
    takeInput(sd, &yLen);   
        ...
        ...
        ...
}
...
...
...

void takeInput(int digit[], int *length)
{
    char c;
    if((c=getchar()) != '\n' && *length <= MAX_DIGIT){
        takeInput(digit, length);
        digit[*length] = c - '0';
        (*length)++;
    }else return;
}

我已經使用gnu arm工具鏈將此c代碼轉換為arm匯編代碼。 生成的匯編代碼的一部分是:

main:
    @ args = 0, pretend = 0, frame = 32788
    @ frame_needed = 1, uses_anonymous_args = 0
    mov ip, sp
    stmfd   sp!, {fp, ip, lr, pc}
    sub fp, ip, #4
    sub sp, sp, #32768
    sub sp, sp, #20       @Why subtracted 20? 

    mvn r3, #4096
    sub r3, r3, #3
          @What r3 storing and Why took NOT of r3 and again subtract 3 from it?
    mov r2, #0
    sub r0, fp, #12
    str r2, [r0, r3]
    mvn r3, #8192
    sub r3, r3, #7
    mov r2, #0
    sub r1, fp, #12
    str r2, [r1, r3]
    sub r2, fp, #4096
    sub r2, r2, #12
    sub r3, fp, #4096
    sub r3, r3, #12
    sub r3, r3, #4
    mov r0, r2
    mov r1, r3
    bl  takeInput
    sub r2, fp, #8192
    sub r2, r2, #12
    sub r2, r2, #4
    sub r3, fp, #8192
    sub r3, r3, #12
    sub r3, r3, #8
    mov r0, r2
    mov r1, r3
    bl  takeInput
    mvn r3, #32768
    sub r3, r3, #11
    mov r2, #1
    sub ip, fp, #12
    str r2, [ip, r3]

我在評論中用匯編代碼本身標記了我的想法。 謝謝。

立即數(在指令的部分中編碼的常數)只能具有某些值,因為編碼它們的字段只有幾位。 當編譯器想要加載具有無法使用立即值編碼的值的寄存器時,它會加載部分值,然后使用算術來完成它。

在不同的ARM指令中有不同的立即值編碼,但這里有一個來自ARM體系結構參考手冊,ARMv7-A和ARMv7-R版本的示例。 “ARM指令中的修改的立即數”被編碼為12位。 四位指定旋轉,八位是該值的文字位。 四位形成二進制數字,並且旋轉量是該數字的兩倍,在右側。 例如,如果四個比特是0011,即三個,則旋轉量是六個比特。

因此,如果四個旋轉位是0011,並且八個文字位是10011101,則通過在32位字段內向右旋轉10011位來形成該值。 因此0000 0000 0000 0000 0000 0000 1001 1101向右旋轉6位,產生0110 0100 0000 0000 0000 0000 0000 0010或0x64000002。

顯然,12位不能編碼所有可能的32位值。 編譯器在您的示例中需要的值之一是32748,即0x7fec。 我們不能在任何位置(或者更具體地,偶數索引位置)僅從8位形成0x7fec。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM