2017-04-22 14 views
2

次の例は、ヒープサイズを超えるまで大きなメモリブロックを繰り返し割り当てるために、Kip IrvineのAssembly x86ブックで動的メモリ割り当てを使用しています。私はWriteWindowsMsgプロシージャを含めることによってコードの一部を修正しました。何らかの理由で、このプロシージャが存在しないというエラーが表示されているからです。ここで変更されたコードは次のとおりです。x86アセンブリ内の動的ヒープメモリMASM

; Heap Test #2 (Heaptest2.asm) 
INCLUDE Irvine32.inc 
.data 

HANDLE TEXTEQU <DWORD> 

HeapCreate PROTO, 
flOptions:DWORD, ; heap allocation options 
dwInitialSize:DWORD, ; initial heap size, in bytes 
dwMaximumSize:DWORD ; maximum heap size, in bytes 

LocalFree PROTO, 
pErrorMsg:DWORD 




FormatMessage PROTO, 
FORMAT_MESSAGE_ALLOCATE_BUFFER: DWORD, 
messageID: DWORD, 
messageID: BYTE, 
pErrorMsg: DWORD 



HeapDestroy PROTO, 
hHeap:DWORD ; heap handle 


HeapAlloc PROTO, 
hHeap:HANDLE, ; handle to existing heap block 
HEAP_ZERO_MEMORY:DWORD, ; heap allocation control flags 
BLOCK_SIZE:DWORD ; number of bytes to allocate 


HeapFree PROTO, 
hHeap:HANDLE, 
dwFlags:DWORD, 
lpMem:DWORD 



HEAP_START = 2000000 ; 2 MByte 

HEAP_MAX = 400000000 ; 400 MByte 
BLOCK_SIZE = 500000 ; .5 MByte 
hHeap HANDLE ? ; handle to the heap 
pData DWORD ? ; pointer to block 
str1 BYTE 0dh,0ah,"Memory allocation failed",0dh,0ah,0 
HEAP_ZERO_MEMORY DWORD ? 
WriteWindowsMsg_1 BYTE "Error ",0 
WriteWindowsMsg_2 BYTE ": ",0 
pErrorMsg DWORD ? 
messageId DWORD ? 


.code 

main PROC 

INVOKE HeapCreate, 0,HEAP_START, HEAP_MAX 
.IF eax == NULL ; failed? 
    call WriteWindowsMsg 
    call Crlf 
    jmp quit 
.ELSE 
    mov hHeap,eax ; success 
.ENDIF 
    mov ecx,2000 ; loop counter 
    L1: call allocate_block ; allocate a block 
.IF Carry? ; failed? 
    mov edx,OFFSET str1 ; display message 
    call WriteString 
    jmp quit 
.ELSE ; no: print a dot to 
    mov al,'.' ; show progress 
    call WriteChar 
.ENDIF 
;call free_block ; enable/disable this line 
loop L1 
quit: 
    INVOKE HeapDestroy, hHeap ; destroy the heap 
.IF eax == NULL ; failed? 
    call WriteWindowsMsg ; yes: error message 
    call Crlf 
.ENDIF 
exit 
main ENDP 


allocate_block PROC USES ecx 
; allocate a block and fill with all zeros. 
INVOKE HeapAlloc, hHeap, HEAP_ZERO_MEMORY, BLOCK_SIZE 
.IF eax == NULL 
    stc ; return with CF = 1 
.ELSE 
    mov pData,eax ; save the pointer 
    clc ; return with CF = 0 
.ENDIF 
ret 
allocate_block ENDP 


free_block PROC USES ecx 
INVOKE HeapFree, hHeap, 0, pData 
ret 
free_block ENDP 




WriteWindowsMsg PROC USES eax edx 

call GetLastError 
mov messageId, eax 
mov edx, OFFSET WriteWindowsMsg_1 
call WriteString 
call WriteDec 
mov edx, OFFSET WriteWindowsMsg_2 
call WriteString 

INVOKE FormatMessage, FORMAT_MESSAGE_ALLOCATE_BUFFER + \ 
    FORMAT_MESSAGE_FROM_SYSTEM, NULL, messageID, NULL, 
    ADDR pErrorMsg, NULL, NULL 

mov edx, pErrorMsg 
call WriteString 

INVOKE LocalFree, pErrorMsg 

ret 
WriteWindowsMsg ENDP 



END main 

私は取得しています以下の結果は次のとおりです。

Assembling: bobnew.asm 
bobnew.asm(122) : error A2136: too many arguments to INVOKE 
bobnew.asm(122) : error A2114: INVOKE argument type mismatch : argument : 3 
bobnew.asm(122) : error A2006: undefined symbol : FORMAT_MESSAGE_ALLOCATE_BUFFER 

bobnew.asm(122) : error A2114: INVOKE argument type mismatch : argument : 1 
bobnew.asm(114) : error A2006: undefined symbol : GetLastError 
Press any key to continue . . . 

誰かが私は私のコードで間違ってやっているかを説明することはできますか?ありがとう

+0

1)間違ったタグを追加しました。これは明らかにCとは関係ありません。2)私たちはデバッグサービスではありません。 [ask]を読んでください。 – Olaf

+1

実際にエラーメッセージを読んだことがありますか?あなたは通常、間違っていることを正確に伝えるためにそれらを信頼することができます。そして、あなたは 'FORMAT_MESSAGE_ALLOCATE_BUFFER'のような引数名と定数を混乱させるようです。 –

答えて

1

すべての現在のirvine32.libWriteWindowsMsgを含んでいます。あなたのインストールに何か問題がありました。

は(「... ...リンクライブラリ」をを)をKip Irvine's homepageからirvine32.incirvine32.libを取得し、アセンブラはirvine32.incことを使用し、リンカがそのirvine32.libを使用することを確認してください。

Irvine's installation hints「はじめにMASM ...」をご覧ください)。

システムにエラーメッセージが表示されません。 FORMAT_MESSAGE_ALLOCATE_BUFFERは、プロトタイプFormatMessageではパラメータの名前として使用され、invokeでは定数として使用されます。定数が他の場所で定義されていない場合(例えば、-libファイルの場合)は不明です。私はあなたのシステムがGetLastErrorを見つけることができない理由を知らない。

関連する問題