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 |
색상 행렬 (0) | 2010.06.14 |
무작위 화면 위치에 문자 출력 (0) | 2010.06.13 |
난수 정수 (0) | 2010.06.13 |
간단한 덧셈2 (0) | 2010.06.13 |