김성철.파란 님이 쓰신 글 :
: ^^ 안녕하세요
:
: 저번 오프에는 못 나가서 정말 죄송해염.... 피곤해서 뻗었습니다. 말그대루 ㅡㅡ;;
:
: 어셈을 공부하고 싶은데요...
:
: 방향을 어떻게 잡아야할지 막막해서요...
:
: 이전 책들을 보니깐 DOS 를 바탕으로 써져 있더라구요..
:
: DOS 를 깔아서 해 볼려구 하니 일부는 필요한 내용이겠지만 대부분은 필요없을꺼 같구
:
: 리눅스 어셈은 원서로 한권 와우북에서 보이던데 아직 돈이 없어서 구경 못 했구...
:
: 제가 잘 못 생각하구 있는건가요 ㅡㅡ;;
:
: 아예 8051 같은 CPU 를 가지고 작은 로봇 같은거 만들면서 해보는게 좋을까요..
:
: 어셈을 깊게 다루고 싶은데 조언 부탁드립니다..
:
: 초보 플맹 파란^^-o<=~~~
저도 학부때 한학기 동안 열심히 어셈블리를 공부하다가,
윈도 프로그래밍을 하면서 완전히 접어버려서 거의 까먹은 처지라 뭐라 말할 처지는 안되지만요...
제가 아는 국내 사이트를 몇개 추천해보죠.
Win32 어셈블리 관련 사이트
Win32 Assembly Guide:
http://my.dreamwiz.com/realwphoenix/_win32/main.html
ASMLOVE:
http://www.asmlove.co.kr/
그리고 VCL의 AnsiString 소스는 속도 향상을 위해 대부분 인라인 어셈블리로 되어있습니다.
한번 들여다 보심이...
리눅스 어셈블리 관련 자료
http://kldp.org/HOWTO/html/Assembly/Assembly-HOWTO.html
http://kldp.org/KoreanDoc/html/Assembly_Example-KLDP/Assembly_Example-KLDP.html
http://kldp.org/KoreanDoc/html/GCC_Inline_Assembly-KLDP/
리눅스에서의 어셈블리는 같은 x86 어셈블리라고 해도,
Unix에서 표준으로 사용하는 AT&T 문법을 사용하기 때문에
Intel에서 사용하는 문법과는 많이 다릅니다. -_-;
참고로, 어셈블리만으로된 Win32 프로그램 소스(일부)를 소개해보죠.
ASMLOVE에서 퍼왔습니다.
;===========================================================
;메인 설정
;컴파일러 옵션
.model flat, stdcall ; 32 bit memory model
option casemap :none ; case sensitive
;기본 포함 파일들
include 파일이름.h
include 파일이름.var
;===========================================================
;코드부 시작
.code
start:
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke GetCommandLine
mov CommandLine, eax
invoke WinMain,hInstance,NULL,CommandLine,SW_SHOWDEFAULT
invoke ExitProcess,eax
;-----------------------------------------------------------
;윈메인
WinMain proc hInst:dword,hPrevInst:dword,CmdLine:dword,CmdShow:dword
local TV_WinClsEx:WNDCLASSEX,TV_Msg:MSG,TV_Rect:St_SzRect
;윈도우 클레스 등록
invoke LoadIcon,hInst,E_MainIconId ;큰 아이콘 로딩
mov hIcon, eax
invoke LoadIcon,hInst,E_SmallIconId ;작은 아이콘 로딩
mov hSmlIcon , eax
invoke LoadCursor,NULL,IDC_ARROW ;기본커서 로딩
mov hCursor , eax
mov TV_WinClsEx.cbSize, sizeof WNDCLASSEX
mov TV_WinClsEx.style, CS_HREDRAW or CS_VREDRAW or CS_BYTEALIGNWI
NDOW or CS_DBLCLKS
mov TV_WinClsEx.lpfnWndProc, offset WndProc
mov TV_WinClsEx.cbClsExtra, NULL
mov TV_WinClsEx.cbWndExtra, NULL
mov eax , hInst
mov ebx , hIcon
mov ecx , hSmlIcon
mov edx , hCursor
mov TV_WinClsEx.hInstance , eax
mov TV_WinClsEx.hIcon, ebx
mov TV_WinClsEx.hIconSm, ecx
mov TV_WinClsEx.hCursor, edx
mov TV_WinClsEx.hbrBackground, COLOR_BTNFACE+1
mov TV_WinClsEx.lpszMenuName, NULL
mov TV_WinClsEx.lpszClassName, offset szMainClassName
invoke RegisterClassEx, ADDR TV_WinClsEx
;윈도우 생성
mov TV_Rect.sx , E_StartWinSizeX ;윈도우의 폭과 높이 결정
mov TV_Rect.sy , E_StartWinSizeY
** 중앙배치 요구시 수행 - (1)
invoke GetSystemMetrics,SM_CXSCREEN ;화면중앙으로 배치
sub eax , TV_Rect.sx
shr eax , 1
mov TV_Rect.x , eax ;x 위치 설정
invoke GetSystemMetrics,SM_CYSCREEN
sub eax , TV_Rect.sy
shr eax , 1
mov TV_Rect.y , eax ;y 위치 설정
** 중앙배치 비 요구시 수행 - (2)
mov TV_Rect.x , E_StartWinPosX ;시작위치
mov TV_Rect.y , E_StartWinPosY
;윈도우 생성
invoke FastWinCreate , E_StartWinAtb ,addr szMainClassName,addr szDispla
yName,addr TV_Rect,NULL,NULL,NULL ;:eax = 윈도우 헨들,0=실패
** 메인메뉴 존재시 설정
invoke LoadMenu,hInst, E_MainMenuId ;메인 메뉴 설정
mov hMainMenu , eax
invoke SetMenu,hWnd,hMainMenu
;초기화 루틴
invoke MainInit ;create 이벤트 이전에 처리할 목록입니다
** 메인 윈도우 화면출력 불가 아니면
invoke ShowWindow,hWnd,SW_SHOWNORMAL
invoke UpdateWindow,hWnd
;===================================
; Loop until PostQuitMessage is sent
;===================================
StartLoop:
invoke GetMessage,addr TV_Msg,NULL,0,0
cmp eax, 0
je ExitLoop
invoke TranslateMessage,addr TV_Msg
invoke DispatchMessage,addr TV_Msg
jmp StartLoop
ExitLoop:
mov eax , TV_Msg.wParam
ret
WinMain endp
;===========================================================
;유저 수정 루틴
;-----------------------------------------------------------
;윈 메인 프로시져
WndProc proc uses ebx ecx edx esi edi ,A_hWin:dword,A_uMsg:dword,A_wParam:dwor
d,A_lParam :dword
local TV_Pos:St_2DUnit
;메시지 처리
;일반 메시지 처리
mov eax , A_hWin ;윈도우 핸들
mov ecx , A_uMsg ;메시지
.if ecx == WM_COMMAND ;메뉴 커멘드 분석
** 메인메뉴 존재시
.if eax == hWnd ;메인윈도우 명령일 경우
.if A_wParam == E_MenuCmdFileOpen ;파일열기
.elseif A_wParam == E_MenuCmdFileSave ;파일저장
.elseif A_wParam == E_MenuCmdFileSaveAs ;다른이름으로 저장
.elseif A_wParam == E_MenuCmdExitPrg ;프로그램 종료
invoke PostMessage , hWnd , WM_CLOSE , 0 , 0 ;종료 신청
.elseif A_wParam == E_MenuCmdHelp ;도움말
.elseif A_wParam == E_MenuCmdAbout ;프로그램 정보
.endif
.endif
.endif
invoke DefWindowProc,A_hWin,A_uMsg,A_wParam,A_lParam ;디폴트 프로시
져
ret
WndProc endp
;===========================================================
;종료정보파트
end start