Pokemon Center | 口袋中心 以口袋妖怪为主题并带有其他动漫游戏的讨论

 找回密码
 加入口袋中心
搜索
查看: 2581|回复: 0

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

[复制链接]

3344

回帖

3

现金

484

勋章券

超级版主

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
21853
QQ

时光印记Lv.3挥金如土勋章水中王者勋章Lv3Omega红宝石发售确认纪念章Alpha蓝宝石发售确认纪念章金银好CP-Ho-oh/LUGIA【里】金银好CP-Ho-oh/LUGIA【真·正常向】异化型LUGIA【M超梦版】

发表于 2019-7-10 05:58:47 | 显示全部楼层 |阅读模式
本帖最后由 jiangzhengwenjz 于 2019-7-10 06:09 编辑

GF偶尔会编写这样的程序,昨天在这个上面浪费了很多时间,来记录一下
  1. ROM:0810FE50 @ struct WindowTemplate __fastcall SetWindowTemplateFields(u8 bg, u8 left, u8 top, u8 width, u8 height, u8 paletteNum, u16 baseBlock)
  2. ROM:0810FE50 SetWindowTemplateFields:                @ CODE XREF: sub_809D654+34p
  3. ROM:0810FE50                                         @ money_box_build_and_print+2Ep ...
  4. ROM:0810FE50
  5. ROM:0810FE50 var_28          = -0x28
  6. ROM:0810FE50 var_24          = -0x24
  7. ROM:0810FE50 w               =  0
  8. ROM:0810FE50 h               =  4
  9. ROM:0810FE50 palID           =  8
  10. ROM:0810FE50 FillerStartTile =  0xC
  11. ROM:0810FE50
  12. ROM:0810FE50                 PUSH    {R4-R7,LR}
  13. ROM:0810FE52                 MOV     R7, R10
  14. ROM:0810FE54                 MOV     R6, R9
  15. ROM:0810FE56                 MOV     R5, R8
  16. ROM:0810FE58                 PUSH    {R5-R7}
  17. ROM:0810FE5A                 SUB     SP, SP, #8
  18. ROM:0810FE5C                 LDR     R4, [SP,#0x28+w]
  19. ROM:0810FE5E                 MOV     R12, R4
  20. ROM:0810FE60                 LDR     R4, [SP,#0x28+h]
  21. ROM:0810FE62                 MOV     R9, R4
  22. ROM:0810FE64                 LDR     R4, [SP,#0x28+palID]
  23. ROM:0810FE66                 MOV     R10, R4
  24. ROM:0810FE68                 LDR     R7, [SP,#0x28+FillerStartTile]
  25. ROM:0810FE6A                 LSLS    R1, R1, #0x18
  26. ROM:0810FE6C                 LSRS    R1, R1, #0x18
  27. ROM:0810FE6E                 LSLS    R2, R2, #0x18
  28. ROM:0810FE70                 LSLS    R3, R3, #0x18
  29. ROM:0810FE72                 MOV     R4, R9
  30. ROM:0810FE74                 LSLS    R4, R4, #0x18
  31. ROM:0810FE76                 LSRS    R4, R4, #0x18
  32. ROM:0810FE78                 MOV     R9, R4
  33. ROM:0810FE7A                 MOV     R4, R10
  34. ROM:0810FE7C                 LSLS    R4, R4, #0x18
  35. ROM:0810FE7E                 MOV     R10, R4
  36. ROM:0810FE80                 LDR     R4, =0xFFFFFF00
  37. ROM:0810FE82                 MOV     R8, R4
  38. ROM:0810FE84                 MOV     R5, R8
  39. ROM:0810FE86                 LDR     R4, [SP,#0x28+var_28]
  40. ROM:0810FE88                 ANDS    R5, R4
  41. ROM:0810FE8A                 ORRS    R5, R1
  42. ROM:0810FE8C                 STR     R5, [SP,#0x28+var_28]
  43. ROM:0810FE8E                 LSRS    R2, R2, #0x10
  44. ROM:0810FE90                 LDR     R6, =0xFFFF00FF
  45. ROM:0810FE92                 MOVS    R4, R6
  46. ROM:0810FE94                 ANDS    R4, R5
  47. ROM:0810FE96                 ORRS    R4, R2
  48. ROM:0810FE98                 STR     R4, [SP,#0x28+var_28]
  49. ROM:0810FE9A                 LSRS    R3, R3, #8
  50. ROM:0810FE9C                 LDR     R1, =0xFF00FFFF
  51. ROM:0810FE9E                 ANDS    R1, R4
  52. ROM:0810FEA0                 ORRS    R1, R3
  53. ROM:0810FEA2                 STR     R1, [SP,#0x28+var_28]
  54. ROM:0810FEA4                 MOV     R2, R12
  55. ROM:0810FEA6                 LSLS    R2, R2, #0x18
  56. ROM:0810FEA8                 MOV     R12, R2
  57. ROM:0810FEAA                 LDR     R2, =0xFFFFFF
  58. ROM:0810FEAC                 ANDS    R1, R2
  59. ROM:0810FEAE                 MOV     R4, R12
  60. ROM:0810FEB0                 ORRS    R4, R1
  61. ROM:0810FEB2                 STR     R4, [SP,#0x28+var_28]
  62. ROM:0810FEB4                 LDR     R1, [SP,#0x28+var_24]
  63. ROM:0810FEB6                 MOV     R2, R8
  64. ROM:0810FEB8                 ANDS    R1, R2
  65. ROM:0810FEBA                 MOV     R4, R9
  66. ROM:0810FEBC                 ORRS    R1, R4
  67. ROM:0810FEBE                 MOV     R8, R1
  68. ROM:0810FEC0                 STR     R1, [SP,#0x28+var_24]
  69. ROM:0810FEC2                 MOV     R1, R10
  70. ROM:0810FEC4                 LSRS    R1, R1, #0x10
  71. ROM:0810FEC6                 MOV     R2, R8
  72. ROM:0810FEC8                 ANDS    R6, R2
  73. ROM:0810FECA                 ORRS    R6, R1
  74. ROM:0810FECC                 STR     R6, [SP,#0x28+var_24]
  75. ROM:0810FECE                 LSLS    R2, R7, #0x10
  76. ROM:0810FED0                 LDR     R1, =0xFFFF
  77. ROM:0810FED2                 ANDS    R6, R1
  78. ROM:0810FED4                 ORRS    R6, R2
  79. ROM:0810FED6                 STR     R6, [SP,#0x28+var_24]
  80. ROM:0810FED8                 LDR     R1, [SP,#0x28+var_28]
  81. ROM:0810FEDA                 LDR     R2, [SP,#0x28+var_24]
  82. ROM:0810FEDC                 STR     R1, [R0]
  83. ROM:0810FEDE                 STR     R2, [R0,#4]
  84. ROM:0810FEE0                 ADD     SP, SP, #8
  85. ROM:0810FEE2                 POP     {R3-R5}
  86. ROM:0810FEE4                 MOV     R8, R3
  87. ROM:0810FEE6                 MOV     R9, R4
  88. ROM:0810FEE8                 MOV     R10, R5
  89. ROM:0810FEEA                 POP     {R4-R7}
  90. ROM:0810FEEC                 POP     {R2}
  91. ROM:0810FEEE                 BX      R2
  92. ROM:0810FEEE @ End of function SetWindowTemplateFields
  93. ROM:0810FEEE
  94. ROM:0810FEEE @ ---------------------------------------------------------------------------
  95. ROM:0810FEF0 dword_810FEF0:  .long 0xFFFFFF00        @ DATA XREF: SetWindowTemplateFields+30r
  96. ROM:0810FEF4 dword_810FEF4:  .long 0xFFFF00FF        @ DATA XREF: SetWindowTemplateFields+40r
  97. ROM:0810FEF8 dword_810FEF8:  .long 0xFF00FFFF        @ DATA XREF: SetWindowTemplateFields+4Cr
  98. ROM:0810FEFC dword_810FEFC:  .long 0xFFFFFF          @ DATA XREF: SetWindowTemplateFields+5Ar
  99. ROM:0810FF00 dword_810FF00:  .long 0xFFFF            @ DATA XREF: SetWindowTemplateFields+80r
复制代码
调用:
  1. ROM:080F78E0 @ u8 __fastcall sub_80F78E0(u8 height)
  2. ROM:080F78E0 sub_80F78E0:                            @ CODE XREF: sub_806F01C+58p
  3. ROM:080F78E0
  4. ROM:080F78E0 height          = -0x28
  5. ROM:080F78E0 pal             = -0x24
  6. ROM:080F78E0 palID           = -0x20
  7. ROM:080F78E0 baseblock       = -0x1C
  8. ROM:080F78E0 template        = -0x18
  9. ROM:080F78E0 var_14          = -0x14
  10. ROM:080F78E0 windowTemplate  = -0x10
  11. ROM:080F78E0
  12. ROM:080F78E0                 PUSH    {R4,LR}
  13. ROM:080F78E2                 SUB     SP, SP, #0x20
  14. ROM:080F78E4                 LSLS    R0, R0, #0x18
  15. ROM:080F78E6                 LSRS    R1, R0, #0x18
  16. ROM:080F78E8                 LDR     R4, =sStartMenuWindowId
  17. ROM:080F78EA                 LDRB    R0, [R4]
  18. ROM:080F78EC                 CMP     R0, #0xFF
  19. ROM:080F78EE                 BNE     loc_80F792A
  20. ROM:080F78F0                 MOVS    R0, #7
  21. ROM:080F78F2                 STR     R0, [SP,#0x28+height] @ height
  22. ROM:080F78F4                 LSLS    R0, R1, #0x19
  23. ROM:080F78F6                 MOVS    R1, #0xFF000000
  24. ROM:080F78FA                 ADDS    R0, R0, R1
  25. ROM:080F78FC                 LSRS    R0, R0, #0x18
  26. ROM:080F78FE                 STR     R0, [SP,#0x28+pal] @ paletteNum
  27. ROM:080F7900                 MOVS    R0, #0xF
  28. ROM:080F7902                 STR     R0, [SP,#0x28+palID] @ baseBlock
  29. ROM:080F7904                 LDR     R0, =0x13D
  30. ROM:080F7906                 STR     R0, [SP,#0x28+baseblock] @ baseBlock
  31. ROM:080F7908                 ADD     R0, SP, #0x28+template @ bg
  32. ROM:080F790A                 MOVS    R1, #0          @ left
  33. ROM:080F790C                 MOVS    R2, #0x16       @ top
  34. ROM:080F790E                 MOVS    R3, #1          @ width
  35. ROM:080F7910                 BL      SetWindowTemplateFields
  36. ROM:080F7914                 LDR     R0, [SP,#0x28+template]
  37. ROM:080F7916                 LDR     R1, [SP,#0x28+var_14]
  38. ROM:080F7918                 STR     R0, [SP,#0x28+windowTemplate]
  39. ROM:080F791A                 STR     R1, [SP,#0x28+windowTemplate.window.height]
  40. ROM:080F791C                 ADD     R0, SP, #0x28+windowTemplate @ template
  41. ROM:080F791E                 BL      AddWindow
  42. ROM:080F7922                 STRB    R0, [R4]
  43. ROM:080F7924                 LDRB    R0, [R4]        @ windowId
  44. ROM:080F7926                 BL      PutWindowTilemap
  45. ROM:080F792A
  46. ROM:080F792A loc_80F792A:                            @ CODE XREF: sub_80F78E0+Ej
  47. ROM:080F792A                 LDRB    R0, [R4]
  48. ROM:080F792C                 ADD     SP, SP, #0x20
  49. ROM:080F792E                 POP     {R4}
  50. ROM:080F7930                 POP     {R1}
  51. ROM:080F7932                 BX      R1
  52. ROM:080F7932 @ End of function sub_80F78E0
  53. ROM:080F7932
  54. ROM:080F7932 @ ---------------------------------------------------------------------------
  55. ROM:080F7934 off_80F7934:    .long sStartMenuWindowId @ DATA XREF: sub_80F78E0+8r
  56. ROM:080F7938 @ u16 TextStartTile
  57. ROM:080F7938 TextStartTile:  .long 0x13D             @ DATA XREF: sub_80F78E0+24r
复制代码
可见虽然保留了r0, r1的值,64位的WindowTemplate的返回值依然是通过栈传递来实现的,传递参数时则是留出r0提供栈空间访问,从r1开始才是参数,所以很容易误判成接受一个指针参数。

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

  4.     template.bg = bg;
  5.     template.tilemapLeft = left;
  6.     template.tilemapTop = top;
  7.     template.width = width;
  8.     template.height = height;
  9.     template.paletteNum = paletteNum;
  10.     template.baseBlock = baseBlock;
  11.     return template;
  12. }
复制代码
  1. u8 sub_80F78E0(u8 height)
  2. {
  3.     if (sStartMenuWindowId == 0xFF)
  4.     {
  5.         struct WindowTemplate template = SetWindowTemplateFields(0, 0x16, 1, 7, height * 2 - 1, DLG_WINDOW_PALETTE_NUM, 0x13D);
  6.         sStartMenuWindowId = AddWindow(&template);
  7.         PutWindowTilemap(sStartMenuWindowId);
  8.     }
  9.     return sStartMenuWindowId;
  10. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入口袋中心

本版积分规则

手机版|Archiver|Pokemon Center

GMT+8, 2024-4-20 21:27 , Processed in 0.157764 second(s), 39 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表