공부,일/어셈블리25 ch4 4.4 Division Instructions idiv(signed),div(unsigned) 나눗셈의 경우 lenth 를 2배로 증가 시킨다음 나눈후에 각각의 byte 에 몫과 나머지를 할당하다. 위 예시를 보면 divisor (1 byte ) -> dividend ( AX 2byte) 이다. 즉 dividend 의 크기는 2배가 된다. 몫과 제수는 각각 1byte 의 레지스터에 저장된다. dividend size 를 2배로 늘리기 때문에 예비동작이 필요하다. 즉 acccumate 레지스터의 상위 byte(또는 edx) 를 0 또는 1로 set 시켜줘야한다. (음수의 경우 상위 byte 는 모두 1) 때문에 86x80 의 경우 이를 위한 명령어를가진다. cbw -> byte to word cwd -> word to dword cdq -> dword.. 2021. 8. 18. ch4 4.3 Multiplication Instructions 곱셈 기본 imul(signed),mul(unsigned) : 곱하기 연산자 곱하기에서는 결과물이 소스의 byte 를 뛰어 넘을수 있다. 즉 8bit 숫자끼리 곱하면 많은 경우 16bit 데이터가 나올수 있다. 따라서 86 x 80 cpu 에서는 이러한 경우를 위해서 특별한 동작을한다. 만약 al(8bit) 끼리 곱했는데 결과물은 ax( 16 bit) 레지스터에 저장된다. 16 bit (ax) -> 32bit 가 될 경우는 하위 16bit 는 ax 에 저장되며 상위 bit 는 dx 레지스터에 저장된다 이를 DX:AX 라고 표현한다. 마찬가지로 eax(32bit) -> EDX:EAX (64bit) rax (64bit) -> RDX:RAX (128bit) cf) 왜 ax:dx(32) 에저장하나 eax(32).. 2021. 8. 18. ch4. 2 Integer Addition and Subtraction Instructions 명령어 : add , sub , inc ( 1 증가) dec( 1 감소 ), neg( +,- swap) mov 와 다른점은 위의 명령어들은 flag 를 변화 시킨다. ( 사실 mov 명령어도 flag를 변경시킨다.) 예제 각각의 modR/M 분석 1. C3 11 000 011 ( mod 11 , Reg = 000 (위의 레지스터 표) , R/M (ebx = 011) 2. EB 11 101 011 mod(11) 은 indicates an immediate operand. 의미한다. sub dbl ,1000 3. mod = 00 , r/m 101 은 memory addressing. 을 의미한다. (Reg = 000 , 레지스터 안씀) ex ) x = -(x + y - 2*z +1) 2021. 8. 17. ch.4 - mov 완전정리 ( copy data) Copying Data 데이타의 복사는 mov 명령어로 이루어진다. c 같은 경우 count = num mov ecx num mov count ecx 와같이 써진다. 이는 80 x 86 구조에서는 모든 operand 가 메모리 주소 일 수 없기 때문이다. ( 1개는 레지스터) mov 의 경우 두 데이터의 사이즈가 동일해야한다. register 8 이라고 되있는게 존재하는데 (OPCODE 8A) 이는 8개의 1byte 레지스터를 soure 또는 destintion 으로 사용할수 있도록 하는 opcode 이다. 사용 할때는 ModR/M 1byte opcode 와 함께 사용된다. 이는 ModR/M 로 특수한 기능을 할수있는 byte로 이를 조절해서 위 8 가지 레지스터를 다양하게 활용할수 있다. 8 bit 중.. 2021. 8. 17. ch3 data & operand ch3.2 과제 .586 .model flat, stdcall .STACK 4096 .DATA number DWORD -105 sum DWORD ? .CODE main PROC moveax, number subeax, 1000 movsum, eax moveax , 0 ret main ENDP end main ch3.3 ( . data) BYTE , WORD , DWORD , QWORD 등 데이터를 저장하는 directive 존재 위처럼 1개의 byte 뿐만아니라 여러 바이트를 연속해서 저장할 수도 있다. DUP ( 배열 선언 할때 사용 ) DblArray DWORD 100 DUP(999) - DWORD 100 개를 reserves 한다. 각 DWORD 는 999 로 초기화 한다. DUP(?) 아무걸로나 .. 2021. 8. 16. listing 파일 만들기 리스팅 파일(listing file)은 컴파일러가 만들어 내는 텍스트 파일로서 컴파일러가 생산한 어셈블리 언어 코드가 담겨있다. 어셈블리 언어 코드는 컴파일러가 생산한 바이너리를 디스어셈블리하면 얻을 수 있지만 리스팅 파일은 어셈블리 언어 코드뿐만 아니라 각 어셈블리 코드 라인이 원래의 소스코드에 어떻게 매핑되는지 보여준다. 대부분의 컴파일러는 컴파일 과정에서 리스팅 파일을 생성할 수 있다. GCC와 같은 컴파일러는 곧바로 객체 파일을 생성하지 않고 어셈블리가 처리하는 어셈블리 파일을 생성한다. 이런 경우에는 어셈블리가 어셈블리 파일을 처리하고 해당 파일을 삭제하지 않게 설정하면 된다. 그 밖의 다른 컴파일러(마이크로소프트나 인텔의 컴파일러)에서는 커맨드라인의 명령 옵션을 이용해서 리스팅 파일을 생성하게.. 2021. 8. 16. 튜토리얼 3 simple window .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc includelib \masm32\lib\user32.lib ; user32.lib 과 kernel32.lib 안에 있는 함수를 사용하기 위해서 include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib WinMain proto :DWORD,:DWORD,:DWORD,:DWORD .DATA ; 초기화한 데이터 ClassName db "SimpleWinClass",0 ; window class 이름 AppName db "Our Fir.. 2021. 8. 16. 튜토리얼 2(메세지 박스 만들기) - 메세지 박스 사용하기 - 1. include 사용 방법 (masm32 폴더안의 여러 라이브러리를 사용할수 있다. ) include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib \masm32\lib\kernel32.lib windows.inc 를 include 하면 에러가 나는데 winextra.inc 파일의 밑의 폴더에서 위의 대괄호 지우면 정상작동 한다 . 2.프로토 타입 함수의 프로토 타입을 먼저 선언해야지 함수가 늦게 선언되더라도 코드에는 아무 문제 없다. FunctionName PROTO [ParameterName]:DataType,[ParameterName]:DataType,... (프로토 타입 선언 .. 2021. 8. 15. 튜토리얼 1 주의 먼저 들어가기 전에 윈도우 환경에서 어셈블리어를 다룰때 주의할점을 알려주겠다. windows 는 내부적으로 esi, edi, ebp, ebx 레지스터를 사용하며, 레지스터 안에 값이 변경되는 것을 고려하지 않습니다. 때문에 callback함수(내가 만든 함수)에서 위의 레지스터를 사용했다면 window 에게 제어권을 넘기기 전에 반드시 원래의 값으로 복구를 해야 됩니다. 어셈블리의 기본적인 뼈대 .386 .MODEL Flat, STDCALL .DATA ...... .DATA? ; 초기화 되지 않은 데이타 ...... .CONST ...... .CODE ..... end ; 상상 lable 관 end lavel 이 존재 해야 한다. 출처: https://crystalcube.co.kr/15?categ.. 2021. 8. 13. 이전 1 2 3 다음