需要使用我的.asm代码提供建议

时间:2015-05-11 08:42:56

标签: assembly

好吧,我必须使用不同的检查来检查程序的汇编代码,以检查“密钥”是否有效。他们称之为asm代码是通过C ++

extern "C" unsigned int EsLicenciaValida(unsigned int licencia[]);

lincencia是由“ - ”分隔的6个32位十六进制数字,例如,一个应该正常工作的

A213457B-3746DFA3-578EC20E-4567DFF2-08A1B3AC-7B125F3A

问题是我无法使它工作,据我所知,我检查一切都是正确的(nots,xors,ands ......)但我知道我的行动方式有问题通过数组,我不知道如何解决它,因为我的老师分配他们没有正确教导的东西......

.386
.model flat, C

.code
; Completar el procedimiento
EsLicenciaValida PROC
push EBP
PUSH EBX

mov [EBP], ESP

ADD EBP, [EBP+8] 

MOV EAX, 0

;1
MOV EBX, [EBP]
NOT EBX     ;NOT TMP
MOV EAX, EBX
jmp FIN




;2
MOV EBX, [EBP+4]        ; EBX -> R2
OR EAX, EBX     ; OR TMP, R1


;3
MOV EBX, [EBP+4*2]      ; EBX -> R2
XOR EAX, EBX    ; XOR TMP, R2

;4
MOV EBX, [EBP+4*3]      ; EBX -> R3
NOT EBX     ; NOT R3
XOR EAX, EBX    ;XOR TMP, NOT(R3)
NOT EAX     ; NOT(TMP XOR NOT(R3))

;5
MOV EBX, [EBP+4*4]      ; EBX -> R4
OR EAX, EBX     ; TMP OR R4

;6
MOV EBX, [EBP+4*5] ; EBX -> R5
CMP EBX, EAX
JZ CONSECUENTE  

MOV EAX, 0
JMP FIN


CONSECUENTE:
    MOV EAX, 1  

FIN:


POP EBX
POP EBP

ret
EsLicenciaValida ENDP

END

感谢您的建议,我希望有人可以帮助解决这个问题。

1 个答案:

答案 0 :(得分:0)

我不完全明白你想要达到的目标,所以我创建了下一个程序:

  • 它获取一个char数组作为参数。
  • 检查所有特征是否有效:连字符( - ),数字(0..9),字母(A..F)。
  • 如果所有字符都有效,则返回0(在EAX中)。
  • 找到第一个无效字符时返回1(在EAX中)。

接下来是汇编代码,注意注释,它们将帮助您了解如何访问数组参数并访问其项目:

.386
.model flat, C
.code
;-------------------------------------------------------
EsLicenciaValida proc

;PRESERVE EBP, ESI.
  push ebp
  push esi

  mov  eax, 0           ;RETURN VALUE (ZERO MEANS OK).
  mov  ebp, esp
  add  ebp, 12          ;GET PARAMETER'S ADDRESS.
  mov  esi, [ ebp ]     ;ESI POINTS TO ARRAY.
whil:
  mov  al, [ esi ]      ;GET CURRENT CHAR.
  cmp  al, 0            ;CHECK END OF ARRAY.
  je   finale           ;IF ( AL == 0 ) JUMP.

;CHECK IF CURRENT CHAR IS HEX (0..9,A..F).
  cmp  al, '-'
  je   its_valid        ;IF ( AL == '-' ) VALID.
  cmp  al, '0'
  jb   its_invalid      ;IF ( AL <  '0' ) INVALID.
  cmp  al, '9'
  jbe  its_valid        ;IF ( AL <= '9' ) VALID.
  cmp  al, 'A'
  jb   its_invalid      ;IF ( AL <  'A' ) INVALID.
  cmp  al, 'F'
  jbe  its_valid        ;IF ( AL <= 'F' ) VALID.
  jmp  its_invalid      ;INVALID BECAUSE AL > 'F'.
its_valid:
;NEXT CHAR TO PROCESS.
  inc  esi
  jmp  whil

its_invalid:
  mov  eax, 1           ;RETURN VALUE (ONE MEANS ERROR).
finale:

;RESTORE EBP, ESI.
  pop  esi
  pop  ebp

  ret                   ;RETURNS VALUE IN EAX.
EsLicenciaValida endp
;-------------------------------------------------------
end

接下来是我如何从Visual Studio C ++控制台项目中调用它:

extern "C" unsigned int EsLicenciaValida ( char * arr );
...
char arr[] = "A213457B-3746DFA3-578EC20E-4567DFF2-08A1B3AC-7B125F3A";
int x = EsLicenciaValida( arr );

一旦你得到“x”的结果,你可以检查它是0还是1并显示一条消息或其他东西。下图显示了程序集文件在项目中的位置:

enter image description here