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;
} 大佬,agbcc与arm-none-eabi-gcc有什么区别啊 qdrz 发表于 2022-6-5 09:39
大佬,agbcc与arm-none-eabi-gcc有什么区别啊
agbcc是gcc 2.95.3附近的版本(大概二十年前),而且只是CC1,也就是只接受preprocessor预处理后的源码并能编译为汇编
页:
[1]