C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[2064] Re:어셈 수련 쌓으려면 어케 해야 합니까?
김백일 [] 3544 읽음    2001-10-10 05:41
김성철.파란 님이 쓰신 글 :
: ^^ 안녕하세요
:
: 저번 오프에는 못 나가서 정말 죄송해염.... 피곤해서 뻗었습니다. 말그대루 ㅡㅡ;;
:
: 어셈을 공부하고 싶은데요...
:
: 방향을 어떻게 잡아야할지 막막해서요...
:
: 이전 책들을 보니깐 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

+ -

관련 글 리스트
2062 어셈 수련 쌓으려면 어케 해야 합니까? 김성철.파란 2917 2001/10/10
2069     Re:어셈 수련 쌓으려면 어케 해야 합니까? 남병철.레조 2834 2001/10/10
2080         Re:Re:안녕~ ^^ 김성철.파란 2840 2001/10/12
2068     Re:고맙습니다^^ 김성철.파란 2866 2001/10/10
2064     Re:어셈 수련 쌓으려면 어케 해야 합니까? 김백일 3544 2001/10/10
2066         Re:Re:어셈 수련 쌓으려면 어케 해야 합니까? 태즈 2907 2001/10/10
2070             Re:Re:Re:어셈 수련 쌓으려면 어케 해야 합니까? 김백일 2866 2001/10/11
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.