또.. 어셈블리 질문입니다..
글쓴이: lowid / 작성시간: 토, 2006/09/23 - 7:42오후
1 section .data 2 chr dd 65 ;여기 chr값을 바꾸려면 어떻게? 3 4 section .text 5 global _start 6 7 _start: 8 9 mov eax,4 ;write 함수 call 10 mov ebx,1 11 mov ecx,chr 12 mov edx,1 13 int 0x80 14 15 mov eax,1 ;exit함수 call 16 mov ebx,ecx 17 int 0x80
하면 A가 출력 됩니다.. 제가 하고 싶은것은 이 chr 값을 변경해서 다음값인 B를 출력 하려 고 합니다
그래서
inc dd 를 추가 했더니만 "error: expression syntax error" 라고 나오더군요.. inc는 레지스터 에서만 사용가능한것인가요?
start: 아래에
9 mov ecx,chr
10 inc ecx
를 추가 해 봤는데 .. 그러면 그냥 종료 되어버리네요...
그래서 종료 할때 (exit) ebx 값에 ecx값을 넣어 줬는데
결과가 161이 나와 버리네요.. 어째서 이런값이 나오는 것인가요..
결과적으로:선언한 값을 (chr)을 증가 시키려면 어떻게 하여야 하나요??
Forums:
x86은 원래 CISC
x86은 원래 CISC 계열이므로 레지스터에만 사용할 수 있는 산술 연산 명령은
거의 없습니다. inc 역시 산술 연산이고 메모리 주소를 참조할 수 있습니다.
inc chr로 했다면 분명히 오류가 없었을 겁니다. dd는 예약어이기 때문에 오류
가 나는 것입니다.
write system call의 prototype을 보면
asmlinkage ssize_t sys_write(unsigned int fd, const char __user * buf, size_t count);
라고 되어 있습니다. i386 Linux의 system call 규칙에 따라 확인 해 보면 ebx = fd,
ecx = buf, edx = count가 되어야 하는거죠. 문제는 ecx에 chr의 주소값이 아닌 chr의
값을 그대로 대입했다는 것입니다. 결국 처음에 무사히 A가 찍혔던 이유는 단순히
'운이 좋아서...' 입니다. 제대로 하려면 mov ecx, offset chr로 해 주어야 합니다.
그리고 어셈블리어를
그리고 어셈블리어를 공부하실 때는 해당 CPU의 스펙 시트를 보면서 공부하시기 바랍니다.
CPU 제조사가 내놓은 문서보다 좋은 참고서적은 없습니다.
댓글 달기