jiangzhengwenjz 发表于 2019-7-10 05:58:47

agbcc编译函数在返回64位值时的参数传递方式

本帖最后由 jiangzhengwenjz 于 2022-6-7 03:25 编辑

GF偶尔会编写这样的程序,昨天在这个上面浪费了很多时间,来记录一下ROM:0810FE50 @ struct WindowTemplate __fastcall SetWindowTemplateFields(u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock)
ROM:0810FE50 SetWindowTemplateFields:                @ CODE XREF: sub_809D654+34p
ROM:0810FE50                                       @ money_box_build_and_print+2Ep ...
ROM:0810FE50
ROM:0810FE50 var_28          = -0x28
ROM:0810FE50 var_24          = -0x24
ROM:0810FE50 w               =0
ROM:0810FE50 h               =4
ROM:0810FE50 palID         =8
ROM:0810FE50 FillerStartTile =0xC
ROM:0810FE50
ROM:0810FE50               PUSH    {R4-R7,LR}
ROM:0810FE52               MOV   R7, R10
ROM:0810FE54               MOV   R6, R9
ROM:0810FE56               MOV   R5, R8
ROM:0810FE58               PUSH    {R5-R7}
ROM:0810FE5A               SUB   SP, SP, #8
ROM:0810FE5C               LDR   R4,
ROM:0810FE5E               MOV   R12, R4
ROM:0810FE60               LDR   R4,
ROM:0810FE62               MOV   R9, R4
ROM:0810FE64               LDR   R4,
ROM:0810FE66               MOV   R10, R4
ROM:0810FE68               LDR   R7,
ROM:0810FE6A               LSLS    R1, R1, #0x18
ROM:0810FE6C               LSRS    R1, R1, #0x18
ROM:0810FE6E               LSLS    R2, R2, #0x18
ROM:0810FE70               LSLS    R3, R3, #0x18
ROM:0810FE72               MOV   R4, R9
ROM:0810FE74               LSLS    R4, R4, #0x18
ROM:0810FE76               LSRS    R4, R4, #0x18
ROM:0810FE78               MOV   R9, R4
ROM:0810FE7A               MOV   R4, R10
ROM:0810FE7C               LSLS    R4, R4, #0x18
ROM:0810FE7E               MOV   R10, R4
ROM:0810FE80               LDR   R4, =0xFFFFFF00
ROM:0810FE82               MOV   R8, R4
ROM:0810FE84               MOV   R5, R8
ROM:0810FE86               LDR   R4,
ROM:0810FE88               ANDS    R5, R4
ROM:0810FE8A               ORRS    R5, R1
ROM:0810FE8C               STR   R5,
ROM:0810FE8E               LSRS    R2, R2, #0x10
ROM:0810FE90               LDR   R6, =0xFFFF00FF
ROM:0810FE92               MOVS    R4, R6
ROM:0810FE94               ANDS    R4, R5
ROM:0810FE96               ORRS    R4, R2
ROM:0810FE98               STR   R4,
ROM:0810FE9A               LSRS    R3, R3, #8
ROM:0810FE9C               LDR   R1, =0xFF00FFFF
ROM:0810FE9E               ANDS    R1, R4
ROM:0810FEA0               ORRS    R1, R3
ROM:0810FEA2               STR   R1,
ROM:0810FEA4               MOV   R2, R12
ROM:0810FEA6               LSLS    R2, R2, #0x18
ROM:0810FEA8               MOV   R12, R2
ROM:0810FEAA               LDR   R2, =0xFFFFFF
ROM:0810FEAC               ANDS    R1, R2
ROM:0810FEAE               MOV   R4, R12
ROM:0810FEB0               ORRS    R4, R1
ROM:0810FEB2               STR   R4,
ROM:0810FEB4               LDR   R1,
ROM:0810FEB6               MOV   R2, R8
ROM:0810FEB8               ANDS    R1, R2
ROM:0810FEBA               MOV   R4, R9
ROM:0810FEBC               ORRS    R1, R4
ROM:0810FEBE               MOV   R8, R1
ROM:0810FEC0               STR   R1,
ROM:0810FEC2               MOV   R1, R10
ROM:0810FEC4               LSRS    R1, R1, #0x10
ROM:0810FEC6               MOV   R2, R8
ROM:0810FEC8               ANDS    R6, R2
ROM:0810FECA               ORRS    R6, R1
ROM:0810FECC               STR   R6,
ROM:0810FECE               LSLS    R2, R7, #0x10
ROM:0810FED0               LDR   R1, =0xFFFF
ROM:0810FED2               ANDS    R6, R1
ROM:0810FED4               ORRS    R6, R2
ROM:0810FED6               STR   R6,
ROM:0810FED8               LDR   R1,
ROM:0810FEDA               LDR   R2,
ROM:0810FEDC               STR   R1,
ROM:0810FEDE               STR   R2,
ROM:0810FEE0               ADD   SP, SP, #8
ROM:0810FEE2               POP   {R3-R5}
ROM:0810FEE4               MOV   R8, R3
ROM:0810FEE6               MOV   R9, R4
ROM:0810FEE8               MOV   R10, R5
ROM:0810FEEA               POP   {R4-R7}
ROM:0810FEEC               POP   {R2}
ROM:0810FEEE               BX      R2
ROM:0810FEEE @ End of function SetWindowTemplateFields
ROM:0810FEEE
ROM:0810FEEE @ ---------------------------------------------------------------------------
ROM:0810FEF0 dword_810FEF0:.long 0xFFFFFF00      @ DATA XREF: SetWindowTemplateFields+30r
ROM:0810FEF4 dword_810FEF4:.long 0xFFFF00FF      @ DATA XREF: SetWindowTemplateFields+40r
ROM:0810FEF8 dword_810FEF8:.long 0xFF00FFFF      @ DATA XREF: SetWindowTemplateFields+4Cr
ROM:0810FEFC dword_810FEFC:.long 0xFFFFFF          @ DATA XREF: SetWindowTemplateFields+5Ar
ROM:0810FF00 dword_810FF00:.long 0xFFFF            @ DATA XREF: SetWindowTemplateFields+80r调用:ROM:080F78E0 @ u8 __fastcall sub_80F78E0(u8 height)
ROM:080F78E0 sub_80F78E0:                            @ CODE XREF: sub_806F01C+58p
ROM:080F78E0
ROM:080F78E0 height          = -0x28
ROM:080F78E0 pal             = -0x24
ROM:080F78E0 palID         = -0x20
ROM:080F78E0 baseblock       = -0x1C
ROM:080F78E0 template      = -0x18
ROM:080F78E0 var_14          = -0x14
ROM:080F78E0 windowTemplate= -0x10
ROM:080F78E0
ROM:080F78E0               PUSH    {R4,LR}
ROM:080F78E2               SUB   SP, SP, #0x20
ROM:080F78E4               LSLS    R0, R0, #0x18
ROM:080F78E6               LSRS    R1, R0, #0x18
ROM:080F78E8               LDR   R4, =sStartMenuWindowId
ROM:080F78EA               LDRB    R0,
ROM:080F78EC               CMP   R0, #0xFF
ROM:080F78EE               BNE   loc_80F792A
ROM:080F78F0               MOVS    R0, #7
ROM:080F78F2               STR   R0, @ height
ROM:080F78F4               LSLS    R0, R1, #0x19
ROM:080F78F6               MOVS    R1, #0xFF000000
ROM:080F78FA               ADDS    R0, R0, R1
ROM:080F78FC               LSRS    R0, R0, #0x18
ROM:080F78FE               STR   R0, @ paletteNum
ROM:080F7900               MOVS    R0, #0xF
ROM:080F7902               STR   R0, @ baseBlock
ROM:080F7904               LDR   R0, =0x13D
ROM:080F7906               STR   R0, @ baseBlock
ROM:080F7908               ADD   R0, SP, #0x28+template @ bg
ROM:080F790A               MOVS    R1, #0          @ left
ROM:080F790C               MOVS    R2, #0x16       @ top
ROM:080F790E               MOVS    R3, #1          @ width
ROM:080F7910               BL      SetWindowTemplateFields
ROM:080F7914               LDR   R0,
ROM:080F7916               LDR   R1,
ROM:080F7918               STR   R0,
ROM:080F791A               STR   R1,
ROM:080F791C               ADD   R0, SP, #0x28+windowTemplate @ template
ROM:080F791E               BL      AddWindow
ROM:080F7922               STRB    R0,
ROM:080F7924               LDRB    R0,       @ windowId
ROM:080F7926               BL      PutWindowTilemap
ROM:080F792A
ROM:080F792A loc_80F792A:                            @ CODE XREF: sub_80F78E0+Ej
ROM:080F792A               LDRB    R0,
ROM:080F792C               ADD   SP, SP, #0x20
ROM:080F792E               POP   {R4}
ROM:080F7930               POP   {R1}
ROM:080F7932               BX      R1
ROM:080F7932 @ End of function sub_80F78E0
ROM:080F7932
ROM:080F7932 @ ---------------------------------------------------------------------------
ROM:080F7934 off_80F7934:    .long sStartMenuWindowId @ DATA XREF: sub_80F78E0+8r
ROM:080F7938 @ u16 TextStartTile
ROM:080F7938 TextStartTile:.long 0x13D             @ DATA XREF: sub_80F78E0+24r可见虽然保留了r0, r1的值,64位的WindowTemplate的返回值依然是通过栈传递来实现的,传递参数时则是留出r0提供栈空间访问,从r1开始才是参数,所以很容易误判成接受一个指针参数。

附反编译出的C函数:struct WindowTemplate SetWindowTemplateFields(u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock)
{
    struct WindowTemplate template;

    template.bg = bg;
    template.tilemapLeft = left;
    template.tilemapTop = top;
    template.width = width;
    template.height = height;
    template.paletteNum = paletteNum;
    template.baseBlock = baseBlock;
    return template;
}u8 sub_80F78E0(u8 height)
{
    if (sStartMenuWindowId == 0xFF)
    {
      struct WindowTemplate template = SetWindowTemplateFields(0, 0x16, 1, 7, height * 2 - 1, DLG_WINDOW_PALETTE_NUM, 0x13D);
      sStartMenuWindowId = AddWindow(&template);
      PutWindowTilemap(sStartMenuWindowId);
    }
    return sStartMenuWindowId;
}

qdrz 发表于 2022-6-5 09:39:57

大佬,agbcc与arm-none-eabi-gcc有什么区别啊

jiangzhengwenjz 发表于 2022-6-7 00:50:47

qdrz 发表于 2022-6-5 09:39
大佬,agbcc与arm-none-eabi-gcc有什么区别啊

agbcc是gcc 2.95.3附近的版本(大概二十年前),而且只是CC1,也就是只接受preprocessor预处理后的源码并能编译为汇编
页: [1]
查看完整版本: agbcc编译函数在返回64位值时的参数传递方式