繁体   English   中英

如何在汇编中读取64位数字

[英]How to read a 64-bit number in assembly

我必须从键盘上读取一个64位数字,但是我不知道为什么它不起作用。 有人可以给我一个主意吗? 这就是我所做的:

 key dq 0
 give_key db "Enter the encryption key (64-bit): " , 0
 formatkey DB "%lld ", 0

procedure PROC NEAR
    push offset give_key
    call printf
    add esp,4
    push offset key
    push offset formatkey
    call scanf
    add esp,8
    ret
procedure ENDP

如果您使用的是x86汇编,则必须执行两个mov ,一个用于低32位,一个用于高位。 在x64上,您可以在一条指令中移动它,这意味着在64位上,该操作是原子的,而在x86上则不是。

例如,在x86上:

mov dword [eax], low32
mov dword [eax+4], high32

在x64上:

mov rax, 0xffffffffffffffff

formatkey的最后一个空格会引起麻烦。 您真的需要吗?

这对我.lib (来自Visual Studio 2010 Express的.lib ):

includelib msvcrt.lib

.686
.MODEL flat
EXTERN _printf:proc, _scanf:proc, _exit:proc

.DATA

    key dq 0
    give_key db "Enter the encryption key (64-bit): " , 0
    scanformat DB "%lld", 0
    printformat DB 10, "Entered: %lld", 10, 0

.CODE

procedure PROC NEAR
    push offset give_key
    call _printf
    add esp,4
    push offset key
    push offset scanformat
    call _scanf
    add esp,8
    ret
procedure ENDP

_main PROC

    call procedure

    push dword ptr key + 4          ; High DWORD of 64-bit QWORD
    push dword ptr key + 0          ; Low DWORD of 64-bit QWORD
    push offset printformat
    call _printf
    add esp,12

    push 0
    call _exit

_main ENDP

END _main

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM