오늘 비가 많이 오네요 예비군가서 꿀빠신 분들을 위해 준비했습니다. (_ _)
*어셈블리 컴파일하기
일단 main()함수를 컴파일 해준다.
함수정의가 안되있기때문에 컴파일만 해준다. (안그러면 링크에러 난당 췟!)
그리고 어셈블리 파일을 컴파일 해준다
명령어 : nasm -f object-format *.asm
object-frmat에는 파일의 포맷을 적어준다.(coff, elf, obj and win32)
나머지 옵션에 대해서는 나중에 자세히....(리눅스는 coff로 햇던듯)
이렇게 생성된 오브젝트 파일들을 링크해주면 된다.
<실행결과창>
이프로그램은 2개의 숫자를 입력받고, 그 결과를 출력하는 간단한 프로그램이다.
다만, 출력하는 과정에서 레지스터와 메모리를 보여준다.
*간단하게 예제 프로그램을 만들어보자!
-c배울때 헬로우 월드를 찍었으니까 어셈블리에서는 올레를 찍어보기로한다.
(연관성은 전혀없다....)
%include "asm_io.inc" //입출력을 위한 인크루드
segment .data //여기서 부터 데이터영역
testmsg db "olleh ah!!!!!!", 0 //문자열을 만들었다
segment .text //여기는 코드영역
global _asm_main //global을 해줘야 외부에서 본다
//내부적으로 할거면 필요없다
_asm_main: //함수시작
enter 0,0
pusha //레지스터 카피(push all)
mov EAX, testmsg //eax에 문자열의 주소를 대입한다
call print_string //print_string 함수 호출
call print_nl //개행 문자
popa //레지스터 원상복구 (pop all)
mov eax, 0 //eax에 0
leave
ret //return
<실행결과창>
*push와 pop
esp register : top of stack의 위치를 가지는 레지스터 (스택의 꼭대기)
ebp register : base의 위치를 가지는 레지스터 (스택의 가장 아래)
pusha는 push all로 모든 레지스터를 메모리에 복사한다.
(복사할때 esp도 증가한다)
백업되있으니까 레지스터를 마음데로 써도된다 뿌잉뿌잉
pop은 백업된 레지스터값을 원래대로 원상복구 시킨다.
프로그램 실행전으로 복구
그런내용이다....
*first program
-책의 퍼스트 프로그램 + 설명
%include "asm_io.inc" //입출력을 위한 include이다
segment .data //여기가 데이터 영역이다
prompt1 db "Enter a number: ", 0
prompt2 db "Enter another number: ", 0
outmsg1 db "You entered ", 0
outmsg2 db " and ", 0
outmsg3 db ", the sum of these is ", 0 //5개의 문자열을 만들었다.
//널을 넣어줘야 된다
segment .bss //여기는 BSS영역이다
input1 resd 1
input2 resd 1 //전역변수 2개 선언했다
segment .text //여기는 코드영역이다
global _asm_main //global을 써줘야 외부에서 봄
_asm_main:
enter 0,0
pusha //푸쉬 위에 그림참고
mov eax, prompt1 //eax에 문자열 주소를 넣음
call print_string //문자열 출력
call read_int //키보드에서 정수를 읽음
mov [input1], eax //eax에 저장되고 변수에 넣음
mov eax,prompt2
call print_string
call read_int
mov [input2], eax //반복했음
mov eax, [input1]
add eax, [input2]
mov ebx, eax //변수둘을 더하고 ebx에 넣어둠
dump_regs 1 //레지스터 값을 출력하는 함수
dump_mem 2, outmsg1, 1 //메모리 값을 출력하는 함수
mov eax, outmsg1
call print_string
mov eax, [input1]
call print_int
mov eax, outmsg2
call print_string
mov eax, [input2]
call print_int
mov eax, outmsg3
call print_string
mov eax, ebx
call print_int
call print_nl
popa //pop 위에 그림 참조
mov eax, 1234 //리턴값!
leave
ret //리턴하실게요
*부호확장
c언어를 배울때 이미 배운 개념이다.
char A = 1; short B = A; A :: 0000 0001 -> B :: 0000 0000 0000 0001
char A = -1; short B = A; A :: 1111 1111 -> B :: 1111 1111 1111 1111
즉 부호에 따라 빈공간을 어떻게 채울것인가에 대한 문제이다.
<case.1> 모두가 평화로운 unsigned
5: unsigned char A = 1;
00401028 mov byte ptr [ebp-4],1
6: unsigned char B = A;
0040102C mov al,byte ptr [ebp-4]
0040102F mov byte ptr [ebp-8],al
7: unsigned short C = A;
00401032 movzx cx,byte ptr [ebp-4]
00401037 mov word ptr [ebp-0Ch]
<case.2> 돌연변이 unsigned에 -1을 넣는경우
9: unsigned char A = -1;
00401028 mov byte ptr [ebp-4],0FFh
10: unsigned char B = A;
0040102C mov al,byte ptr [ebp-4]
0040102F mov byte ptr [ebp-8],al
11: short C = A;
00401032 movzx cx,byte ptr [ebp-4]
00401037 mov word ptr [ebp-0Ch]
<case.3> 파괴지옥 signed끼리의 만남
9: char A = -1;
00401028 mov byte ptr [ebp-4],0FFh
10: unsigned char B = A;
0040102C mov al,byte ptr [ebp-4]
0040102F mov byte ptr [ebp-8],al
11: short C = A;
00401032 movsx cx,byte ptr [ebp-4]
00401037 mov word ptr [ebp-0Ch]
비주얼 베이직으로 디스어셈블리 했음 (개 편리)
*누산기
누산기는 CPU 내에서 계산의 중간 결과를 저장하는 레지스터를 가리킨다. 만약 누산기가 없다면, 덧셈이나 곱셈 및 자리이동 등과 같은 각 계산의 결과를 주기억장치에 기록할 수밖에 없으며, 필요한 경우 그것들을 다시 읽어와야 한다. 누산기는 ALU로 직접 통하는 통로를 가지고 있기 때문에, 주기억장치에 읽고 쓰는 것보다 훨씬 빠르다.
누산기는 처음에는 0으로 설정되며, 각 숫자는 차례로 누산기 내에 있는 값에 더해진다. 그리고 모든 숫자들이 다 더해졌을 때에만, 그 결과가 주기억장치에 기록된다.(그래서 우리가 volatile을 쓰는거죠)
현대식 CPU들은 대체로 많은 수의 레지스터들을 가지고 있는데, 그중 전부 또는 많은 수의 레지스터들이 누산기로 사용될 수 있다. (ARM이 이런 case에 해당합니다.)그렇기 때문에, 누산기는 다소 오래된 냄새가 나는 용어이다. 누산기를 레지스터와 동의어로 사용하는 것은, 그 사용자가 꽤 오랫동안 이 분야에서 활약했다는 확실한 지표이며, 논의 중인 아키텍처도 상당히 해묵은 것이다. 비록 마이크로프로세서의 산술 레지스터 심벌 이름이 "A"로 시작되는 것이, 누산기(accumulator)라는 용어에 기원을 두고 있다고 해도, 이 용어는 마이크로프로세서 레지스터들에는 거의 사용되지 않는다. 혼란스럽게도, 특히 모토롤라 680x0 계열과 같은 경우에는, 레지스터 이름의 접두사인 "A"가 "accumulator"가 아닌 "address"를 줄인 말로부터 나왔을 수도 있다.
'코스웨어 > 12년 내장형하드웨어' 카테고리의 다른 글
[0823]하이퍼 터미널을 통해 LCD에 문자 찍기 소스입니다. (0) | 2012.08.23 |
---|---|
charactor lcd 추가내용 (0) | 2012.08.23 |
[assembly]0821-업무일지 (0) | 2012.08.23 |
[Asembly]8월 22일 업무일지 - by 이창현 (1) | 2012.08.22 |
매트릭스 화면보호기 입니다. by. 감정현 (0) | 2012.08.22 |
NFL 강남스타일 터치다운 세레모니 - 싸이 대단!! (1) | 2012.08.22 |
레지스터 클래스 (2) | 2012.08.22 |
형동등성 (0) | 2012.08.22 |