组装x86的算法? [英] Algorithm to assembly x86?

查看:96
本文介绍了组装x86的算法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

这就是汇编程序:

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


推荐答案

下一个代码在AX中显示一个数字(用EMU8086制造)。 MissPaper现在必须要做的是在下一个代码的末尾插入您的过程(LicenseCorrect),并在调用美元之后调用它,然后将该值分配给AX(删除 12345)。

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").

这里是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/ ):

.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.

这篇关于组装x86的算法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆