Language/Assembly
Assembly(Assembly 기초/C소스 어셈블리로 코딩하기)
Dexter_-
2017. 7. 25. 15:48
728x90
반응형
목차
Assembly 기초
mov al, 'A'
mov reg32 imm8
- 'A' 아스키코드는 imm8 로 나타낸다.
mov eax, number1
mov reg32, memory
- cpu 밖으로 bus를 타고 나감으로 속도가 느리다.
mov eax, ebx
mov reg32, reg32
- 레지스터 간의 이동 이므로 속도가 빠르다.
mov [eax], 10 :: [eax] = *eax 동일한 형식
- 포인터를 사용한 것은 indirect 라고 한다. (간접 참조)
number2 = 10;
number1 = number2;
- 위와 같은 C언어문법 형태로 어셈블리에서는 불가능하다. (Cpu 를 거치지않고 메모리에서의 이동은 두뇌가 없는 것과 같다.)
- 기계어 보는 법은 다음과 같다.
mov number1, eax
mov direct, EAX
- 위 메모리뷰 에서 a3는 mov의 기계어 Opcode 이다.
C 소스 Assembly로 코딩하기
EX) 어셈블리로 바꾸어 코딩할 C소스
#include <stdio.h>
int main()
{
int sum = 0;
int temp = 0;
printf("Enter the x: ");
scanf("%d", &sum);
printf("Enter the y: ");
scanf("%d", &temp);
sum = temp + sum;
printf("Enter the z: ");
scanf("%d", &temp);
temp = temp * 2;
sum =sum - temp;
++sum;
-sum;
printf("(x + y - 2z + 1) is %d\n", sum);
return 0;
}
위 C소스를 어셈블리로 변환
EX) first.asm
.386
.MODEL FLAT
ExitProcess PROTO NEAR32 stdcall, dwExitCode:DWORD
INCLUDE io.h
cr EQU 0Dh
Lf EQU 0Ah
.STACK 4096
.DATA
number1 DWORD ?
number2 DWORD ?
prompt1 BYTE "Enter First Number : ", 0
prompt2 BYTE "Enter Second Number : ", 0
prompt3 BYTE "Enter Third Number : ", 0
string BYTE 40 DUP (?)
label1 BYTE cr, Lf, "(x + y - 2z + 1) is"
sum BYTE 11 DUP (?)
BYTE cr, Lf, 0
.CODE
_start:
output prompt1
; printf("Enter First Number : ");
input string, 40
; scanf("%d", &sum);
atod string
mov number1, eax
output prompt2
; printf("Enter Second Number : ");
input string, 40
; scanf("%d", &temp);
atod string
mov number2, eax
mov eax, number1
add eax, number2
mov number1, eax
; sum = temp + sum;
output prompt3
; printf("Enter Third Number : ");
input string, 40
; scanf("%d", &temp);
atod string
mov number2, eax
mov eax, number2
add eax, eax
mov number2, eax
; temp = temp * 2;
mov eax, number1
sub eax, number2
mov number1, eax
; sum =sum - temp;
mov eax, number1
inc eax
mov number1, eax
; ++sum;
mov eax, number1
neg eax
; -sum;
mov eax, number1
dtoa sum, eax
output label1
INVOKE ExitProcess, 0
PUBLIC _start
END
실행 결과
728x90
반응형