IDIV
IDIV 이전까지의 코드를 수행하게 되면, AL 에 83h 를 넣고, CBW 워드로 확장한다. 그리고, CL 에 10h를 넣는다. 아래와 같은 레지스터 값을 가지게 된다. 그리고 마지막, IDIV CL 을 수행하게 되면 다음과 같이 레지스터 값이 변한다. 미리 예상하기에는, EAX 00000F3F EDX 00000009 가 될것 같지만, 다르게 나온다. 왜일까. 나눠지는 값은 2바이트이다. 그러나, 나누는 값이 1바이트이다. 그래서, 나눠지는 값이 1바이트로 변한다. 83h 를 10진수로 바꾸면, -125이다. 10h 를 10진수로 바꾸면, 16이다. 손수 나눗셈을 해보면, 몫 : -7 나머지: -13 이 나온다. -7을 16진수로 바꾸면, F9 -13을 16진수로 바꾸면, F3 따라서,, 나머지와 몫을..
2009. 4. 12.
ASM 1
ASM 1 - 2009/04/09 지역변수는 ebp - 로 접근 매개변수는 ebp + 로 접근 Add, Sub, Mul, Div # 산술 연산. AND, OR, XOR # 논리 연산 AND EAX, EBX XOR EAX, EAX 스택에 값을 저장한다. 백업 매개변수 전달 pop => 스택의 값을 뒤의 오퍼랜드에 저장. 후, esp - 4 > label || 명령 || Operands || ; 주석 Operands => 피연산자 들의 사이즈는 동일해야 한다. mov esp, ebp / 리눅스는 방향 반대 / 레지스터/메모리주소. || 레지스터/메모리주소/값 세그먼트 레지스터들끼리는 연산을 할 수 없다. mov eax, DS mov CS, eax .586 .model flat, stdcall option c..
2009. 4. 9.