Trao đổi với tôi

http://www.buidao.com

1/8/17

[MASM], Lập Trình ASM,cách tạo biến cục bộ

Lập Trình ASM,cách tạo biến cục bộ (http://virusvn.com/forum/showthread.php?t=1036)

Cpro
03-26-2009 10:10 AM

Lập Trình ASM,cách tạo biến cục bộ
 
Code:

.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
include \masm32\include\user32.inc
includelib \masm32\lib\user32.lib
.data
MsgBoxCaption  db "Iczelion Tutorial No.2",0
MsgBoxText      db "Win32 Assembly is Great!",0


.code
start:
invoke MessageBox, NULL, addr MsgBoxText, addr MsgBoxCaption, MB_OK
invoke ExitProcess, NULL
end start


đây là dòng biến của chương trình
.data
MsgBoxCaption db "Iczelion Tutorial No.2",0
MsgBoxText db "Win32 Assembly is Great!",0


cho mình hỏi là đây có phải là biến cục bộ của hàm main hay không,hay là biến toàn cục của toàn chương trình vậy

snowflake
03-26-2009 12:41 PM

Đó là biến toàn cục của chương trình. Biến cục bộ được lưu trong stack.

Cpro
03-26-2009 12:43 PM

Quote:

Đó là biến toàn cục của chương trình. Biến cục bộ được lưu trong stack.

rất cảm ơn bạn đã trả lời,bạn cho mình hỏi thêm là làm thế nào để mình có thể làm cho 2 biến đó là 2 biến cục bộ vậy,bạn có thể ghi code ra được không :D

NhatPhuongLe
03-26-2009 01:10 PM


Dùng từ khóa LOCAL khai báo trước biến. Biến này chỉ có tác dụng trong bản thân một thủ tục xử lý mà thôi.
Code:

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
        LOCAL hdc:HDC
        LOCAL ps:PAINTSTRUCT
        LOCAL rect:RECT
        .IF uMsg==WM_DESTROY
                invoke PostQuitMessage,NULL
        .ELSEIF uMsg==WM_PAINT
                invoke BeginPaint,hWnd, ADDR ps
                mov    hdc,eax
                invoke GetClientRect,hWnd, ADDR rect
                invoke DrawText, hdc,ADDR OurText,-1, ADDR rect, DT_SINGLELINE or DT_CENTER or DT_VCENTER
                invoke EndPaint,hWnd, ADDR ps
        .ELSE
                invoke DefWindowProc,hWnd,uMsg,wParam,lParam
                ret
        .ENDIF
        xor    eax,eax
        ret
WndProc endp

Best Regards!

meoconlongvang
03-26-2009 01:15 PM

Quote:

Originally Posted by Cpro (Post 6292)
rất cảm ơn bạn đã trả lời,bạn cho mình hỏi thêm là làm thế nào để mình có thể làm cho 2 biến đó là 2 biến cục bộ vậy,bạn có thể ghi code ra được không :D

Một cách khác nữa để dùng biến cục bộ :
Code:

push ebp
mov ebp,esp
// Bây giờ dùng biến cục bộ. Các biến này có dạng [ebp + 4 * n]
pop ebp
ret


Thug4Lif3
03-26-2009 04:27 PM

TASM:
Code:

test_proc        proc    c

        ; parameters

        arg        arg1:DWORD
        arg    arg2:DWORD   
        arg    arg3:DWORD
        arg    arg4:DWORD
        local  local1:DWORD
        local  local2:DWORD

        pusha
        nop
        nop
        popa
        ret

test_proc        endp


snowflake
03-26-2009 05:39 PM

Quote:

Originally Posted by meoconlongvang (Post 6294)
Một cách khác nữa để dùng biến cục bộ :
Code:

push ebp
mov ebp,esp
// Bây giờ dùng biến cục bộ. Các biến này có dạng [ebp + 4 * n]
pop ebp
ret


Cái này thiếu sub esp, XXX
Nếu không làm như vậy các biến cục bộ sẽ bị ghi đè lên khi có các lệnh làm thay đổi stack.
Với lại cách của Mèo là cách khi trình biên dịch dịch cái của Thug ra.


meoconlongvang
03-26-2009 06:31 PM

Quote:

Originally Posted by snowflake (Post 6296)
Cái này thiếu thiếu sub esp, XXX
Nếu không làm như vậy các biến cục bộ sẽ bị ghi đè lên khi có các lệnh làm thay đổi stack.
Với lại cách của Mèo là cách khi trình biên dịch dịch cái của Thug ra.

Ờ nhỉ, mình quên mất :D