chapter 4에서 대수롭지 않게 보고 지나쳤던 OFFSET과 간접 주소 지정 부분을 복습할 수 있었던 문제.

배열을 다룰 때 OFFSET이 중요함을 다시 한 번 학습하고, 자세한 사용법을 실습해보았습니다.



문제는 C로 작성된 루프를 .IF와 .WHILE 디렉티브를 사용하여 어셈블리 언어로 구현

#include<stdio.h>>

void main(){
 int array[]={10,60,20,33,72,89,45,65,72,18};
 int sample=50;
 int ArraySize=sizeof(array)/sizeof(sample);
 int index=0;
 int sum=0;
 while(index<ArraySize){
  if(array[index]<=sample)
   sum+=array[index];
  index++;
 }

 printf("%d\n",sum);
}

결과는

입니다.

이를 어셈블리로 작성해보면

INCLUDE Irvine32.inc

.data
array SDWORD 10,60,20,33,72,89,45,65,72,18
sample  SDWORD 50
ArraySize  SDWORD ?    ;LENGTHOF array. array원소의 갯수 반환
index  SDWORD 0  ;index = array[?]. 배열의 요소를 저장하려하였으나 안썼다
sum   SDWORD 0  

.code
main PROC
 mov esi,OFFSET array ;esi에 array의 오프셋 저장
 mov eax,[esi] ;간접 주소 지정을 이용하여 배열 원소를 index에 저장=>index가 안되니 eax로 저장)
 
 mov ArraySize,OFFSET array
 mov ebx,SIZEOF array  ;배열의 사이즈(LENGTHOF * TYPE)
 add ArraySize,ebx   ;배열의 마지막 오프셋을 ArraySize에 저장한다
 
 .WHILE esi<ArraySize ;index<ArraySize
      ;오프셋비교로 WHILE문의 조건을 작성하였는데 잘 될지???
  .IF eax<=sample ;array[index] <= sample
      ;배열의 원소를 샘플과 비교하기로 했는데 잘 될지???
   mov ebx,eax
   add sum,ebx ;sum+=array[index]
  .ENDIF
  inc esi   ;배열의 다음 원소로 이동
  mov eax,[esi]  ;다음 원소를 eax에 저장
 .ENDW
 
 mov eax,sum
 call WriteInt
 call Crlf
 exit
main ENDP
END main

어셈블리로 작성된 결과는


책에서 결정 디렉티브 설명 부분을 간소하게 추려 적어보면

.IF condition
     statements
.ENDIF



.WHILE condition
     statements
.ENDW

condition에 쓸 수 있는 피연산자의 유형에 대한 설명이 없습니다.

어셈블시키면서 확인해본결과

.IF reg 연산자 mem
.WHILE reg 연산자 mem

형태는 되는데

mem 연산자 mem

형태는 안되더군요.

'노트정리 > 어셈블리 책 스터디 공간' 카테고리의 다른 글

6.9.7 부울계산기(1)  (0) 2010.07.13
6.9.5. 6.9.6 대학등록(1)(2)  (0) 2010.07.12
6.9.4 시험성적계산2 (어셈블리어)  (0) 2010.06.30
6.9.3 시험성적계산  (0) 2010.06.30
6.9.2 루프 구현  (0) 2010.06.30
색상 행렬  (0) 2010.06.14
무작위 화면 위치에 문자 출력  (0) 2010.06.13
난수 정수  (0) 2010.06.13
간단한 덧셈2  (0) 2010.06.13
Posted by 도전하는 공돌이pooh

댓글을 달아 주세요