8월 26일 어셈블리 이론 2.
어셈블리는 숫자뒤에 h, b,o 또는 q를 붙이면, 각각 16진수, 10진수, 8진수를 나타낸다.
아래 그림을 참고한다.
(10진수는 아무것도 안적으면 된다. 마이크로소프트에서 어셈블리는 대소문자 구별안함. 다른 운영체제는 구별함.)
보충설명. 따옴표 ' '안에 있는 m은 m의 아스키코드를 나타낸다. 반대로 6d는 헥사값으로 m의 아스키 코드값이다.
결론은 char1과 char2는 똑같은 문장이다.
그리고 밑에 string1, string2를 유심히 보면, "joe"는 3바이트 "joe's"는 5바이트이다. 옆에 주석문 참고.
"joe's"는 안에 '까지 포함한다.
아래 그림에 stars는 1바이트형 50바이트까지 확보, 그리고 DUP '*'를 50개를 넣는다. 복사하다.(duplication)
starswAndSpaces는 공백까지 포함하여 *가 들어간다. 즉, * * * * ......이렇게 12개 그리고 마지막 널 자리에 *가
들어간다. 공간은 총 25바이트
아래 3개의 변수는 모두 144를 나타낸다. (참고로 word는 2바이트형)
어셈블리는 기본적으로 연산을 하고 실행되기 때문에 144를 적든, 12*12를 적은 똑같다.
QWORD는 8바이트.
TBYTE는 10바이트.
opcode= 기계어
number of bytes =바이트 수
timing 386 = 386에서의 주기
tuming 486=486에서의 주기
timing pentium=펜티엄에서의 주기
예를 들어 2개의 코드를 예를 들어 보았다.
1. mov al, '/'
mnemonic이 mov,
operrand가 al, imm8은 8비트크기의 상수.
flags affected는 모름(죄송)
opcode는 B0,
바이트수 2바이트 (B0, '/'를 아스키코드로 변환하면, 2F가 된다. 그래서 B0 2F의 크기의 2바이트)
386에서는 어셈블리 실행속도가 2주기, 486과 펜티엄은 1주기가 된다. 속도가 훨씬 빠르다.
2. add eax, number1
operland의 eax는 레지스터 32, number1은 변수로서 memory location 32bit 4바이트가 된다.
(원래는 eax, mem32를 찾으려 했으나, 없다. --, 없는 경우에 reg32, mem32를 찾아서 분석하자!!)
이 코드에서 잘보면, opcode까지는 별다른 이상이 없다. 그런데 바이트 수가 2+이다. 이것은 최소 2바이트 이상의
크기를 갖는다는 의미가 된다.
먼저,
|
단, 생략이 가능한 경우가 있다.
add edx, [eax]의 코드가 정상적으로 실행되었다고 가정한다면, 그것은
operland 중의 edx의 크기가 이미 알고있거나 정해진코드이기 때문에 굳이
자료형과 ptr을 쓰지 않고 []만 쳐도 상관없다.