어셈블리어 아주 기초적인 건데도 모르겠습니다.
글쓴이: kknd345 / 작성시간: 수, 2005/04/06 - 10:17오전
과제 때문에 소스코드를 내일 까지 짜야되는 급한 상황이라 책을 찾아 뒤지는게 안 되네요 ㅜㅜ...
예제 소스코드 보고 한꺼번에 많은 걸 배워야 하는 상황이라 ㅜㅜ..
모르는 부분이 많아서 물어봅니다.
좀 어이 없더라도 너그럽게 용서를 해주세요 ㅜㅜ...
질문1. outputstr DB 255 dup(?) ; 여기서 dup()는 무엇인가요? 그냥 초기화가 다인가요? ; 얼핏 반복이란 소릴 들었는데 잘 못 들은 건가요?
질문2. msg1 DB "단어의 갯수는 ",'$' ; DB는 무슨 데이터 형인가요? 마지막에 $는 무슨 의미인가요?
질문 3 MOV AH,9 ; 메시지 출력전에 이줄이 필요한가요? MOV DX, offset msg1; offset 을 잘 이해를 못 하겠고요... ; 꼭 DX레지스터에 넣어야 하나요? INT 21h ; 이줄 대신에 call writeSting인가를 써줄수 있다고 들었는데 맞나요?
질문 4 REVERSE: MOV AL,inputstr[SI]; 역방향으로 복사, 문자열이 반대로 된다. MOV temp[DI],AL INC DI DEC SI LOOP REVERSE ; 여기서 LOOP의 의미를 좀 가르쳐 주십시오. ; 만약 REVERSE로 그냥 돌아가는 거라면 저 LOOP문은 어떻게 멈추나요?
질문 5 CMP X,Y 한 다음에 JE JNE JL JLE JG JGE 이런거 많던데 설명 좀 해주실수 있나요?
Forums:
어셈은 프로세서의 종류마다 고유한 것이기 때문에 3번 질문같은 건 다른
어셈은 프로세서의 종류마다 고유한 것이기 때문에 3번 질문같은 건 다른 사람들이 알기가 힘듭니다. 저 같은 경우는 8bitCPU인 ATmega128과 PIC16f84, ARM 정도는 대충 알고 있으나 오래되서 그런지 저런 레지스터는 생소하군요^^...
질문 5번... cmp x,y 는 if(x==y) 랑 같은 뜻입니다.(어셈이 비교명령어 맞죠?)
맞으면(status register 중 zero flag가 1로 셋이 되면==x와 y가 같으면) 어디로 점프하라... -> JE 어디 ; JE는 jump equal 같네요... 뒤에 서브루틴의 이름이 나올겁니다.
JNE->jump not equal 다르면 점프하라
JL-> jump less than==x<y 일때 점프하라
JG-> jump greater than ==x>y 일 때 점프하라
이런 것들은 그 프로세서에 해당하는 Data Sheet를 보면 자세히 나와있습니다. 그것을 안보고 공부하신다는 것은 말도 안되는 소리죠^^
먼저 명령어를 전부 훑어보고 나신 후, 공부하세요
남으로 창을 내겠소.
밭이 한참갈이 괭이로 파고 호미론 김을 메지요.
구름이 꼬인다 갈리있소. 새들의 노래는 공으로 들으랴오.
강냉이가 익거든 와자셔도 좋소.
왜 사냐건 웃지요.
질문1. c언어로 치면 array입니다. 다만 ?는 초기화 하지 않는거죠
질문1. c언어로 치면 array입니다. 다만 ?는 초기화 하지 않는거죠
질문2. db는 define byte(던가-_-) c언어로치며 char이고 $는 도스에서 종료문자 역활로 쓰기위해 넣습니다.
질문3. http://www.ctyme.com/intr/rb-2562.htm 인터럽트 21h의 function 9h입니다. -_-
offset는 말그대로 변수의 오프셋을 구하는 것입니다. 따로 어셈명령으로 lea가 존재 합니다.
int 21h대신 writeString을 쓸수 있다고 하는 여부는 모르겠네요 -_- masmㅇ르 쓰지 않아서..
다른 어셈블러 기준으론 불가능 하지만.. masm의 고유의 기능인가 보죠..
질문4. cx나 ecx값이 0가 아닐때까지 돕니다. -_- loop명령이 한번 실행될때마다 cx나 ecx값이 1 감소합니다. -_-저 코드 이전에 cx값을 설정하는 코드가 아마 있겠죠..
질문5. jmp시리즈는 장난 아니게 많습니다. 한 40가지 되나 -_-?
intel 문서중 instruction set reference라는 pdf파일이 존재합니다. -_-;;
http://www.intel.com/design/pentium4/manuals/index_new.htm#sdm_vol2a 이곳에 있네요 -_- 이 파일을 참조하세요 @_@
제가 작성한 글중에 잘못쓴 부분이나 제가 잘못 알고 있는 부분은 지적해주세요..
그건 그렇고 왜 제가 쓴글은 -_- <- 가 많이 들어가네요.. 고쳐야할텐데..
Re: 어셈블리어 아주 기초적인 건데도 모르겠습니다.
1) 어셈블리어에서 일종의 서브루틴(함수)을 호출했다고 생각하세요.
그 메인 함수명은 21H이고(도스시스템콜) 21H에 있는 많은 서브함수들 중에 특히 9번 함수를 호출한 것입니다.
이 9번이 질문자님의 표현방식을 빌자면 메시지 출력이지요.
또한, 함수호출시 파라메터가 필요한데,
즉, 21h의 많은 서브함수중 몇번을?
21h, 9를 사용할때 넘기는 파라메터는?(즉, 무슨 문자열을?)
등을 넘길때, 어셈블리에서는 레지스터를 사용하는게 최적이겠지요.
그래서, 많은 레지스터들중 특히나 이기능을 위해서는 AH, DX레지스터가 사용되었군요.
만일 다른 인터럽트서비스 루틴중 하나를 호출하게 된다면 도대체 어떤 레지스터를 사용하게 될까요? 그건 그때 그때 다르겠지요.
(호출하는쪽)
* 파라메터(들)를 세팅
* 호출
(불리는쪽)
* 파라메터(들)을 가지고 연산
* 결과값을 리턴(이때도 레지스터를 사용)
어셈블리언어에서는 이러한 파라메터 패싱을 레지스터를 사용하는 경우가 많습니다.
위와 같이 어떤 기능수행(이를테면 문자열출력)을 위해 파라메터 세팅을 하는구나 라고 이해하시는게 좋습니다.
5) 비교연산을 수행하면,
예를들어, CMP x,y
이 결과를 FLAG register에다 저장합니다.
보통, ZF(Zero Flag)비트에 세팅(1 / 0 ?)을 하지요.
그리고는 이 플래그레지스터 비트가 0인가? 아닌가? 뭐 이런식으로 코딩하지요.
CISC구조에서는 0인가 아닌가보다는 보다 복잡한 명령어 집합을 가지고 있는 경우가 많습니다. 같은가? 같지않은가? 등등
그러나, 보통 다음과 같은 형태로 동작되는 경우가 많습니다.
* 연산수행(수행결과를 플래그 레지스터에 저장)
* 플래그 레지스터와 비교하여 브랜치(점프)
대충 보니 X86계열 어셈처럼 보이는 군요.윗 분들 께서 좋은 답
대충 보니 X86계열 어셈처럼 보이는 군요.
윗 분들 께서 좋은 답변을 달아 주셨네요. 거기에 3번에 대해서 첨언을 하자면, 인터럽트 호출에 관한 내용은 랄프 브라운의 인터럽트 리스트를 참조 하시길 바랍니다.
AH 09H 를 넘기고 int21을 호출하면 이렇게 된다고 나와 있군요.
http://www.ctyme.com/intr/int.htm
참고 하세요.
높이 날다 떨어지면.
아푸다 ㅡ,.ㅡ
댓글 달기