denper
04-03-2011, 14:04
Ciao a tutti,
avrei la necessità di sapere cosa fa questa funzione in Assembly. Purtroppo io non ci capisco molto. Di certo è che esegue un calcolo di checkDigit su una stringa. Qualcuno di voi sa darmi una mano?
Grazie in anticipo.
; === S U B R O U T I N E ===
; Attributes: bp-based frame
; calcCheckDigit(char *, bool)
__Z14calcCheckDigitPcb
oldR4 = -0x14
oldR5 = -0x10
oldR6 = -0xC
oldR7 = -8
oldLR = -4
PUSH {R4-R7,LR}
ADD R7, SP, #0xC
PUSH.W {R8,R10}
TST.W R1, #0xFF
ITE EQ
MOVEQ R10, 0xFFFFFFFE
MOVNE.W R10, #0
MOVS R6, #0
MOVS R4, #1
MOV R8, R0
MOV R5, R6
loc_92FA
LDRSB.W R0, [R5,R8]
BL __Z9fromASCIIc ; fromASCII(char)
CMP R0, #9
BLE loc_931E
LDR R2, =0x66666667
ADDS R3, R0, #7
SMULL.W R0, R2, R3, R2
ASRS R0, R3, #0x1F
RSB.W R0, R0, R2,ASR#2
LSLS R2, R0, #1
LSLS R0, R0, #3
ADD R0, R2
RSB.W R0, R0, R3
loc_931E
ADDS R5, #1
CMP R5, #0x18
MLA.W R6, R4, R0, R6
BEQ loc_9342
LDR R3, =0x66666667
ADDS R2, R4, #1
SMULL.W R0, R1, R3, R2
ASRS R3, R2, #0x1F
RSB.W R4, R3, R1,ASR#2
LSLS R1, R4, #1
LSLS R3, R4, #3
ADD R3, R1
RSB.W R4, R3, R2
B loc_92FA
loc_9342
LDR R3, =0x66666667
ADD.W R0, R6, R10
SMULL.W R1, R2, R3, R0
ASRS R3, R0, #0x1F
RSB.W R3, R3, R2,ASR#2
LSLS R2, R3, #1
LSLS R3, R3, #3
ADD R3, R2
SUBS R0, R0, R3
BL __Z7toASCIIi ; toASCII(int)
POP.W {R8,R10}
POP {R4-R7,PC}
; End of function calcCheckDigit(char *,bool)
avrei la necessità di sapere cosa fa questa funzione in Assembly. Purtroppo io non ci capisco molto. Di certo è che esegue un calcolo di checkDigit su una stringa. Qualcuno di voi sa darmi una mano?
Grazie in anticipo.
; === S U B R O U T I N E ===
; Attributes: bp-based frame
; calcCheckDigit(char *, bool)
__Z14calcCheckDigitPcb
oldR4 = -0x14
oldR5 = -0x10
oldR6 = -0xC
oldR7 = -8
oldLR = -4
PUSH {R4-R7,LR}
ADD R7, SP, #0xC
PUSH.W {R8,R10}
TST.W R1, #0xFF
ITE EQ
MOVEQ R10, 0xFFFFFFFE
MOVNE.W R10, #0
MOVS R6, #0
MOVS R4, #1
MOV R8, R0
MOV R5, R6
loc_92FA
LDRSB.W R0, [R5,R8]
BL __Z9fromASCIIc ; fromASCII(char)
CMP R0, #9
BLE loc_931E
LDR R2, =0x66666667
ADDS R3, R0, #7
SMULL.W R0, R2, R3, R2
ASRS R0, R3, #0x1F
RSB.W R0, R0, R2,ASR#2
LSLS R2, R0, #1
LSLS R0, R0, #3
ADD R0, R2
RSB.W R0, R0, R3
loc_931E
ADDS R5, #1
CMP R5, #0x18
MLA.W R6, R4, R0, R6
BEQ loc_9342
LDR R3, =0x66666667
ADDS R2, R4, #1
SMULL.W R0, R1, R3, R2
ASRS R3, R2, #0x1F
RSB.W R4, R3, R1,ASR#2
LSLS R1, R4, #1
LSLS R3, R4, #3
ADD R3, R1
RSB.W R4, R3, R2
B loc_92FA
loc_9342
LDR R3, =0x66666667
ADD.W R0, R6, R10
SMULL.W R1, R2, R3, R0
ASRS R3, R0, #0x1F
RSB.W R3, R3, R2,ASR#2
LSLS R2, R3, #1
LSLS R3, R3, #3
ADD R3, R2
SUBS R0, R0, R3
BL __Z7toASCIIi ; toASCII(int)
POP.W {R8,R10}
POP {R4-R7,PC}
; End of function calcCheckDigit(char *,bool)