Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 需要我的.asm代码的建议吗_Assembly - Fatal编程技术网

Assembly 需要我的.asm代码的建议吗

Assembly 需要我的.asm代码的建议吗,assembly,Assembly,嗯,我必须做一个程序的汇编代码,用不同的检查来检查一个“键”是否有效。我称之为asm代码的方式是通过C++ extern "C" unsigned int EsLicenciaValida(unsigned int licencia[]); lincencia是一个以“-”分隔的6 32位十六进制数,例如,应该正确工作的是 A213457B-3746DFA3-578EC20E-4567DFF2-08A1B3AC-7B125F3A 问题是我无法让它工作,就我所知,我检查一切是否正确的方式(no

嗯,我必须做一个程序的汇编代码,用不同的检查来检查一个“键”是否有效。我称之为asm代码的方式是通过C++

extern "C" unsigned int EsLicenciaValida(unsigned int licencia[]);
lincencia是一个以“-”分隔的6 32位十六进制数,例如,应该正确工作的是

A213457B-3746DFA3-578EC20E-4567DFF2-08A1B3AC-7B125F3A
问题是我无法让它工作,就我所知,我检查一切是否正确的方式(not、XOR、and…)但我知道我在数组中移动的方式有问题,我不知道如何修复它,因为我的老师分配了他们没有正确教授的东西

.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

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

我不完全理解您想要实现的目标,因此我创建了下一个过程:

  • 它获取一个字符数组作为参数
  • 检查所有字符是否有效:连字符(-)、数字(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
在“x”中得到结果后,可以检查结果是0还是1,并显示消息或其他内容。下图显示了部件文件在项目中的位置:

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

无意冒犯,但您的评论在哪里?很少有一行汇编代码不需要注释,更罕见的是一块汇编代码不需要在顶部一两行解释块的整体功能。定义“我不能让它工作”。你的预期结果是什么,实际结果是什么?您在调试方面做了哪些工作来尝试发现问题或至少隔离问题?您如何知道这是错误的?您现在看到了什么行为?这和你期望看到的有什么不同?除此之外,这段代码看起来非常短