如何将DWORD转换为DB [英] How to convert a DWORD into a DB

查看:158
本文介绍了如何将DWORD转换为DB的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我要显示在一场比赛中,我在建MASM32得分,我有一个问题,我怎么一个DWORD转换为DB(字符串)。

I want to display a score in a game that I built in MASM32, and I have a problem, how do I convert a DWORD to a DB (string).

有是函数 crt__itoa 来一个DWORD转换为整数,但由于某种原因它不工作(我是否需要包括其他的LIB?)。

There is the function crt__itoa to convert a dword to an integer , but for some reason it doesn't work (do i need to include an other lib ? ).

有是函数TextOutA显示得分,但同样我不能把它打印出来,因为我没有一个字符串,它可以从打印出来。

There is the function TextOutA to display a score, but again I cant print it out because I don't have a string so it can print it from.

推荐答案

接下来是使用Visual Studio 2010中C ++的手动转换EAX成一个字符串上进行的方法(它不需要任何图书馆,只需复制,粘贴和使用) 。它需要一个数字作为参数,将其分配给EAX,将其转换为字符串并显示该字符串:

Next is a method made with Visual Studio 2010 C++ that manually converts EAX into a string (it doesn't need any library, just copy-paste and use). It takes a number as parameter, assign it to EAX, convert it to string and display the string :

void number2string ( int value ) {
char buf[11];
__asm { ;EXTRACT DIGITS ONE BY ONE AND PUSH THEM INTO STACK.
          mov  eax, value
          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 IN REVERSE ORDER.
          mov  esi, 0   ;POINTER TO STRING'S CHARACTERS.
        cycle2:  
          pop  dx       ;GET A DIGIT.
          add  dl, 48   ;CONVERT DIGIT TO CHARACTER.
          mov  buf[ esi ], dl
          inc  esi      ;NEXT POSITION IN STRING.
          loop cycle2  
          mov  buf[ esi ], 0  ;MAKE IT ASCIIZ STRING.
     }
printf( buf );
scanf( "%s",buf ); // TO STOP PROGRAM AND LET US SEE RESULT.
}

注意的是:previous方法是无效的,所以你把它像往常一样:

Pay attention : previous method is a "void", so you call it as usual :

number2string( 1234567890 ); // CONVERT THIS BIG NUMBER IN STRING AND DISPLAY.

您可以修改该方法返回的字符串或做任何你想要的。

You can modify the method to return the string or to do anything you want.

现在(对于那些谁是足够坚韧)纯汇编同一previous过程中,与GUI涡轮汇编64(的 http://sourceforge.net/projects/guitasm8086/ ),这种全程序显示它是如何工作的:

Now (for those who are tough enough) the same previous procedure for pure assembler, made with GUI Turbo Assembler x64 (http://sourceforge.net/projects/guitasm8086/), this full program shows how it works :

.model small

.586

.stack 100h

.data

buf db 11 dup (?) ;STRING.

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

;CONVERT EAX TO STRING.
  call dollars        ;FILL BUF WITH '$', NECESSARY TO DISPLAY.
  mov  eax, 1234567890
  call number2string  ;PARAMETER:EAX. RETURN:VARIABLE BUF.

;DISPLAY BUF (EAX CONVERTED TO STRING).
  mov  ah, 9
  mov  dx, offset buf
  int  21h    

;WAIT UNTIL USER PRESS ANY KEY.
  mov  ah, 7
  int  21h

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

;------------------------------------------
;NUMBER TO CONVERT MUST ENTER IN EAX.
;ALGORITHM : EXTRACT DIGITS ONE BY ONE, STORE
;THEM IN STACK, THEN EXTRACT THEM IN REVERSE
;ORDER TO CONSTRUCT STRING (BUF).

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.
  mov  si, offset buf
cycle2:  
  pop  dx        
  add  dl, 48 ;CONVERT DIGIT TO CHARACTER.
  mov  [ si ], dl
  inc  si
  loop cycle2  

  ret
number2string endp  

;------------------------------------------
;FILLS VARIABLE BUF WITH '$'.
;USED BEFORE CONVERT NUMBERS TO STRING, BECAUSE
;THE STRING WILL BE DISPLAYED.

dollars proc
  mov  si, offset buf
  mov  cx, 11
six_dollars:      
  mov  bl, '$'
  mov  [ si ], bl
  inc  si
  loop six_dollars

  ret
dollars endp  

end start

这篇关于如何将DWORD转换为DB的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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