在程序集编码中,使用masm32。
我如何才能将一个值放入一个变量中,这个变量不是在.data段中被违抗,而是通过本地解密来实现的?
图斯:
.486
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\macros\macros.asm
include \masm32\include\masm32.inc
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
.data
.code
start:
call main
exit
main proc
LOCAL dewit:DWORD
mov dewit, 0
print dewit
ret
main endp
end start我试过这样的方法:
Mov dewit, 0 它不起作用。然而,这一守则:
Mov dewit, input("enter a number") 它确实有价值。
有人吗?
**本地解密只能在程序中进行。
发布于 2016-01-16 23:15:39
由于您使用的是http://www.masm32.com/,如果您试图打印一个32位的值,那么尝试用str$这样做。
print str$(dewit)这会将内存位置dewit处的32位值转换为字符串,并将该字符串打印在控制台上。这也适用于一个即时的值:
print str$(100)和一份登记册:
print str$(eax)如果希望打印无符号值,也可以使用$ustr。
这些宏在MASM32 SDK附带的高级宏帮助中进行了描述。
发布于 2016-01-16 23:13:33
您可以在调试器中找到这种情况。以下是从调试器中查看的代码的开始:
CPU Disasm
Address Command Comments
00401000 CALL 0040100C ; call main
00401005 PUSH 0 ; /ExitCode = 0
00401007 CALL <JMP.&kernel32.ExitProcess> ; \KERNEL32.ExitProcess
0040100C PUSH EBP ; main
0040100D MOV EBP,ESP
0040100F ADD ESP,-4
00401012 MOV DWORD PTR SS:[LOCAL.1],0 ; dewit = 0
00401019 PUSH DWORD PTR SS:[LOCAL.1] ; /Arg1 => 0
0040101C CALL 00401024 ; print
00401021 LEAVE
00401022 RETN因此,调用print (请记住,print是一个宏,因此一旦编译,它就会展开)。记住你按了0到print
CPU Disasm
Address Command Comments
00401024 PUSH EBP ; print (guessed Arg1)
00401025 MOV EBP,ESP
00401027 ADD ESP,-0C
0040102A PUSH -0B ; /StdHandle = STD_OUTPUT_HANDLE
0040102C CALL <JMP.&kernel32.GetStdHandle> ; \KERNEL32.GetStdHandle
00401031 MOV DWORD PTR SS:[LOCAL.1],EAX
00401034 PUSH DWORD PTR SS:[Arg1] ; /Arg1 => [Arg1] *** push 0 ***
00401037 CALL 00401060 ; \so.00401060在0x00401034行中,0被推送为调用的参数。
让我们看看代码:
CPU Disasm
Address Command Comments
00401060 MOV EAX,DWORD PTR SS:[Arg1] ; eax = 0
00401064 LEA EDX,[EAX+3]
00401067 PUSH EBP
00401068 PUSH EDI
00401069 MOV EBP,80808080
0040106E /MOV EDI,DWORD PTR DS:[EAX] ; trying to dereference [0]... 代码试图在地址0(也就是空指针错误)处读取,这是一个大的no no。
查看print宏在macros.asm中,似乎这个宏不进行任何格式化,然后您应该使用printf。
您的代码已修复(需要msvcrt.inc和msvcrt.lib用于printf宏,该宏仍在macros.asm中定义):
.486
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\msvcrt.inc
include \masm32\macros\macros.asm
include \masm32\include\masm32.inc
include \masm32\include\gdi32.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\msvcrt.lib
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
.data
format_string db "value: %d", 0
.code
start:
call main
exit
main proc
LOCAL dewit:DWORD
mov dewit, 0
print "printing value: "
printf ("value: %d", dewit)
ret
main endp
end start没有任何代码的代码大致相同,包括:
; compile and link with:
; ml test.asm /link /subsystem:console /defaultlib:kernel32.lib /defaultlib:msvcrt.lib
.686
.model flat, stdcall
option casemap: none
ExitProcess PROTO STDCALL :DWORD
externdef _imp__printf:PTR c_msvcrt
crt_printf equ <_imp__printf>
.data
fmt db "value: %d", 0
.code
start:
call MyFunc
invoke ExitProcess, 0
ret
MyFunc proc
LOCAL foo:DWORD
mov foo, 42
push foo
push offset fmt
call crt_printf
ret
MyFunc endp
end start我也完全同意@Jester:
此外,考虑不要使用助手特性,直到您也可以手动完成它,并了解汇编程序正在做什么。
宏是很棒的,但是除非您能够理解它们所做的事情并通过手工实现它们,否则您应该避免使用它们。他们对初学者的眼睛隐藏了太多的东西。
https://stackoverflow.com/questions/34820341
复制相似问题