【发布时间】:2018-05-11 10:59:29
【问题描述】:
我正在尝试通过我的字符串查询过程中的 calloc 宏分配 50 个字节。问题是我不知道该怎么做,而且我尝试做的方式肯定是错误的。我尝试将 50 传递到 EAX 寄存器,然后调用 calloc 宏。我的程序符合但就是这样。所以我的问题是如何正确使用这些程序?我是否通过将值移动到寄存器中来玩寄存器?一旦我取回分配的空间,该空间在哪里?寄存器?我不能使用任何全局变量,这就是本练习的重点。非常感谢您的帮助。
INCLUDE Irvine32.inc
; Macro to ease the use of alloc procedure
mAlloc Macro Value
Push offset value
Call ALLOC
endM
;Macro to ease the use of memFree
free Macro value
push offset value
Call memFree
endM
; Macro to ease the use of the alloc procedure, for character data
cAlloc Macro Value
mov eax, sizeof BYTE
imul eax, Value
Push eax
Call alloc
endM
;Macro to ease the use of of the alloc procedure for integer Data
iAlloc Macro Value
mov eax, sizeof WORD
imul eax, Value
Push eax
Call mAlloc
endM
;Macro to ease the use of the alloc for long interger DATA
lAlloc Macro Value
mov eax, sizeof DWORD
imul eax, Value
Push OFFSET value
Call mAlloc
endM
;Macro for string query
STRQRYM Macro value
Push OFFSET value
Call strQry
ENDM
.data
HeapHandle TEXTEQU <[EBP - 4]>
Prompt Byte "Please enter your name: ", 0
Message Byte "the name you entered is: ", 0
.code
ALLOC PROC
push EBP
MOV EBP, ESP
SUB ESP, 4
INVOKE GetprocessHeap
;MOV HeapHandle, EAX
INVOKE HeapAlloc, HeapHandle, HEAP_ZERO_MEMORY,[EBP + 8]
ADD ESP, 4
POP EBP
RET 4
ALLOC ENDP
memFree PROC
push ebp
mov ebp, esp
INVOKE GetProcessHeap
; mov heap handle to eax?
Invoke HeapFree, EAX, 0, [EBP + 8]
pop ebp
RET 4
memFree ENDP
strQry PROC
Push EBP
Mov EBP, ESP
Push EDX
push ECX
;print string
Mov EDX, [EBP + 8]
Call writeString
; create byte and push 50 characters into a variable
Mov ECX, 50
mov eax, 50
calloc eax
Call readString
Pop ECX
Pop EDX
Pop EBP
Ret 4
strQry ENDP
MAIN PROC
;test strQRY allocate 50 bytes
; MEM should free memory at adress and send an indication back
that it has happend
;test each proc and Macro approrpiately (display)
STRQRYM prompt
EXIT
Main ENDP
END Main
【问题讨论】:
-
calloc eax将会是一个惊喜。 -
为什么不
imul eax, Value, sizeof x?或者要求它是一个寄存器,这样你就可以使用lea eax, [Value * sizeof x],而不是使用大小为 2 的乘法指令。