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
String 如何将DWORD转换为DB_String_Assembly_Masm32_Dword - Fatal编程技术网

String 如何将DWORD转换为DB

String 如何将DWORD转换为DB,string,assembly,masm32,dword,String,Assembly,Masm32,Dword,我想在我在MASM32中构建的游戏中显示分数,但我有一个问题,如何将DWORD转换为DB(字符串) 有一个函数crt\uu itoa可以将dword转换为整数,但由于某些原因,它不起作用(我需要包含其他库吗?) 有一个函数TextOutA来显示分数,但是我不能打印出来,因为我没有一个字符串,所以它可以从中打印出来。我需要包含其他库吗?-可能您需要msvcrt.inc和msvcrt.lib用于crt\uu itoa masm32rt.inc是处理此类案件的瑞士军刀。以下是一个工作示例: inclu

我想在我在MASM32中构建的游戏中显示分数,但我有一个问题,如何将DWORD转换为DB(字符串)

有一个函数
crt\uu itoa
可以将dword转换为整数,但由于某些原因,它不起作用(我需要包含其他库吗?)

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

我需要包含其他库吗?-可能您需要
msvcrt.inc
msvcrt.lib
用于
crt\uu itoa

masm32rt.inc
是处理此类案件的瑞士军刀。以下是一个工作示例:

include c:\masm32\include\masm32rt.inc

.DATA
    fmt db "%s",10,0
    num dd 1234567
    num_str db 16 dup (?)

.CODE
main PROC

    ; with CALL:

    push 10
    push OFFSET num_str
    push num
    call crt__itoa
    add esp, 12

    push OFFSET num_str
    push OFFSET fmt
    call crt_printf
    add esp, 8

    ; or with INVOKE:

    invoke crt__itoa, num, OFFSET num_str, 10
    invoke crt_printf, OFFSET fmt, OFFSET num_str

    invoke ExitProcess, 0

main ENDP

END main
程序不会停止。如果您没有在额外的命令提示符窗口中调用它,它将打开一个窗口并立即关闭。在
Qeditor
中,我建议在
菜单中插入一行“运行并暂停”。ini

...
&Run Program,"{b}.exe"
Run && Pause,cmd.exe /C"{b}.exe" & pause
...

现在在“Project”下面有一个新的项目。

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

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.
}
注意:前面的方法是一个“void”,所以你照常叫它:

number2string( 1234567890 ); // CONVERT THIS BIG NUMBER IN STRING AND DISPLAY.
您可以修改该方法以返回字符串或执行任何您想要的操作

现在(对于那些足够强硬的人来说)使用GUI Turbo assembler x64()为pure assembler制作的相同的前一个过程,这个完整的程序展示了它是如何工作的:

.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

它需要在主管道内吗?或者我也可以把它放在里面不同的地方。code?@user4825345:它就像C中的
\u itoa
printf
。你可以把它放在程序可以到达的任何地方。但它不会显示在屏幕上。它可以编译,但不显示任何数字(或任何其他内容)。还有使用TextOutA的选项吗?@user4825345:我打赌它确实显示出来了,但速度太快了,以至于你没有注意到它。在命令提示符窗口(控制台)中运行程序。对于
Qeditor
我在答案中添加了一个技巧。顺便说一句:你必须选择“控制台组装和链接”。所以我这样做是为了避免整个游戏时间…?嘿,伙计,你已经得到了两个答案,如果有人对你有所帮助,你可以接受它或投票支持它(或两者兼而有之!)。