装配x86的算法?

时间:2015-05-07 19:19:54

标签: algorithm assembly

我已经有好几天试图将算法转换为汇编x86,我做到了。但是我想打印保存在" tmp"的最终结果,我可以使用什么指令? (我是西班牙语,所以如果我用英语说错话,我很抱歉)。 这是我的算法:

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

这就是汇编:

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 个答案:

答案 0 :(得分:0)

下一个代码在AX中显示一个数字(由EMU8086制作)。 MissPaper现在必须做的是在下一个代码的末尾插入你的程序(LicenseCorrect),并在" call dollars"之后调用它,然后将值赋给AX(删除" 12345")

这里是32位:

.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

现在使用 GUI Turbo Assembler x64 http://sourceforge.net/projects/guitasm8086/)制作64位版本(EAX中更大的数字):

.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

我没有添加你的程序,因为它使用了堆栈而且在调用之前我不知道要推送什么值。