Algorithm to assembly x86?

2019-09-18 17:01发布

I have been for some days trying to translate an algorithm to assembly x86, and I did it. However I would like to print the final result that it is saved in "tmp", what instruction can I use? (I'm Spanish so I'm sorry if I say something wrong in English). This is my algorithm:

tmp =   NOT(L0)
tmp =   tmp AND L1
tmp =   NOT(NOT(tmp) OR NOT(L2))
tmp =   NOT(tmp OR NOT(L3))
tmp =   NOT(tmp + NOT(L4))
if (tmp == L5)
     licence = correct
else
     licence = incorrect

And this is it in assembly:

LicenceCorrect PROC
push ebp
mov ebp,esp

push ebx
push ecx
push edx

mov ebx, [ebp+8]

mov edx,[ebx]
mov ecx,edx
not ecx 

mov edx,[ebx+4]
and ecx,edx

mov edx,[ebx+8]
not edx
not ecx
or ecx,edx
not ecx

mov edx,[ebx+16]
not edx
or ecx,edx
not ecx

;if
mov edx,[ebx]
cmp ecx,edx
jne cons
mov al,0
jmp next

cons:
mov al,1

next:

pop edx
pop ecx
pop ebx
pop ebp

ret
LicenceCorrect ENDP

END

1条回答
Viruses.
2楼-- · 2019-09-18 17:08

Next code displays a number in AX (made with EMU8086). What MissPaper must do now is insert your procedure (LicenseCorrect) at the end of next code, and call it after "call dollars", then assign the value to AX (remove "12345").

Here it is for 32 bits:

.model small

.stack 100h

.data

buffer  db 6 dup(?)

.code
start:
;INITIALIZE DATA SEGMENT.
  mov  ax, @data
  mov  ds, ax

;FIRST, FILL BUFFER WITH '$' (NECESSARY TO DISPLAY).
  mov  si, offset buffer
  call dollars

;SECOND, CONVERT NUMBER TO STRING.              
  mov  ax, 12345
  mov  si, offset buffer
  call number2string

;THIRD, DISPLAY STRING.
  mov  dx, offset buffer
  call printf    

;FINISH PROGRAM.
  mov  ax, 4c00h
  int  21h

;-----------------------------------------
;PARAMETER : DX POINTING TO '$' FINISHED STRING.
printf proc
  mov  ah, 9
  int  21h
  ret
printf endp    

;------------------------------------------
;FILLS VARIABLE WITH '$'.
;USED BEFORE CONVERT NUMBERS TO STRING, BECAUSE
;THE STRING WILL BE DISPLAYED.
;PARAMETER : SI = POINTING TO STRING TO FILL.

dollars proc                  
  mov  cx, 6
six_dollars:      
  mov  bl, '$'
  mov  [ si ], bl
  inc  si
  loop six_dollars

  ret
dollars endp  

;------------------------------------------
;CONVERT A NUMBER IN STRING.
;ALGORITHM : EXTRACT DIGITS ONE BY ONE, STORE
;THEM IN STACK, THEN EXTRACT THEM IN REVERSE
;ORDER TO CONSTRUCT STRING (STR).
;PARAMETERS : AX = NUMBER TO CONVERT.
;             SI = POINTING WHERE TO STORE STRING.

number2string proc 
  mov  bx, 10 ;DIGITS ARE EXTRACTED DIVIDING BY 10.
  mov  cx, 0 ;COUNTER FOR EXTRACTED DIGITS.
cycle1:       
  mov  dx, 0 ;NECESSARY TO DIVIDE BY BX.
  div  bx ;DX:AX / 10 = AX:QUOTIENT DX:REMAINDER.
  push dx ;PRESERVE DIGIT EXTRACTED FOR LATER.
  inc  cx ;INCREASE COUNTER FOR EVERY DIGIT EXTRACTED.
  cmp  ax, 0  ;IF NUMBER IS
  jne  cycle1 ;NOT ZERO, LOOP. 
;NOW RETRIEVE PUSHED DIGITS.
cycle2:  
  pop  dx        
  add  dl, 48 ;CONVERT DIGIT TO CHARACTER.
  mov  [ si ], dl
  inc  si
  loop cycle2  

  ret
number2string endp  

end start

Now the 64 bits version (for much bigger numbers in EAX), made with GUI Turbo Assembler x64 (http://sourceforge.net/projects/guitasm8086/):

.model small

.586

.stack 100h

.data

buffer db 11 dup(?)

.code
start:

;INITIALIZE DATA SEGMENT.
  mov  ax, @data
  mov  ds, ax

;FIRST, FILL BUFFER WITH '$' (NECESSARY TO DISPLAY).
  mov  esi, offset buffer
  call dollars

;SECOND, CONVERT NUMBER TO STRING.              
  mov  eax, 1234567890
  mov  esi, offset buffer
  call number2string

;THIRD, DISPLAY STRING.
  mov  dx, offset buffer
  call printf    

;FINISH PROGRAM.
  mov  ax, 4c00h
  int  21h

;-----------------------------------------
;PARAMETER : DX POINTING TO '$' FINISHED STRING.
printf proc
  mov  ah, 9
  int  21h
  ret
printf endp    

;------------------------------------------
;FILLS VARIABLE WITH '$'.
;USED BEFORE CONVERT NUMBERS TO STRING, BECAUSE
;THE STRING WILL BE DISPLAYED.
;PARAMETER : ESI = POINTING TO STRING TO FILL.

dollars proc                  
  mov  cx, 11
six_dollars:      
  mov  bl, '$'
  mov  [ esi ], bl
  inc  esi
  loop six_dollars

  ret
dollars endp  

;------------------------------------------
;CONVERT A NUMBER IN STRING.
;ALGORITHM : EXTRACT DIGITS ONE BY ONE, STORE
;THEM IN STACK, THEN EXTRACT THEM IN REVERSE
;ORDER TO CONSTRUCT STRING (STR).
;PARAMETERS : EAX = NUMBER TO CONVERT.
;             ESI = POINTING WHERE TO STORE STRING.

number2string proc
  mov  ebx, 10 ;DIGITS ARE EXTRACTED DIVIDING BY 10.
  mov  cx, 0 ;COUNTER FOR EXTRACTED DIGITS.
cycle1:       
  mov  edx, 0 ;NECESSARY TO DIVIDE BY EBX.
  div  ebx ;EDX:EAX / 10 = EAX:QUOTIENT EDX:REMAINDER.
  push dx ;PRESERVE DIGIT EXTRACTED (DL) FOR LATER.
  inc  cx  ;INCREASE COUNTER FOR EVERY DIGIT EXTRACTED.
  cmp  eax, 0  ;IF NUMBER IS
  jne  cycle1  ;NOT ZERO, LOOP. 
;NOW RETRIEVE PUSHED DIGITS.
cycle2:  
  pop  dx        
  add  dl, 48 ;CONVERT DIGIT TO CHARACTER.
  mov  [ esi ], dl
  inc  esi
  loop cycle2  

  ret
number2string endp

end start

I didn't add your procedure because it uses the stack and I don't know what values to push before calling it.

查看更多
登录 后发表回答