어셈블리 프로그램에 대해^^
글쓴이: 익명 사용자 / 작성시간: 일, 2001/11/04 - 6:32오후
filename 이라는 변수에 파일 이름을 할당 받았는데
파일이름 뒤에 개행문자 까지 입력되서
그걸 0 으로 바꿀려구 하는데 어떻게 해야 할지...
;; nread = read(0, filename, sizeof(filename));
mov eax, 3
mov ebx, 0
mov ecx, filename
mov edx, filename_len
int 0x80
mov [nread], eax
;; filename[nread-1] = '\0'
이 부분좀 가르쳐 주세여^^*
Forums:
Re: 이 정도 아닐까요...
mov eax, nread
dec eax
mov [filename+eax], 0
^^* 잘 안되네여 이궁~~
컴파일 하니까 이런 글만 뜨네여 ^^;;
operation size not specified
=========================================================================
BITS 32
segment .text
global _start
_start
;; write(1, prompt, sizeof(prompt));
mov eax, 4 ; 4 == write system call
number
mov ebx, 1 ; 1 == stdout
mov ecx, prompt ; "What is your name? "
mov edx, prompt_len ; length("What is your
name? ");
int 0x80 ; linux system call
interrupt
;; nread = read(0, filename, sizeof(filename));
mov eax, 3 ; 3 == read
mov ebx, 0 ; 0 == stdin
mov ecx, filename
mov edx, filename_len ; buffer size
int 0x80
mov [nread], eax ; eax == the number of bytes
read
;; filename[nread-1] = '\0' <- 이부분
mov eax, nread
dec eax
mov [filename+eax],0
;; fd = open(finename, O_RDONLY);
mov eax, 5
mov ebx, filename
mov ecx, 0q
int 0x80
mov [fd], eax
;; if (fd == -1 ) {
;; write(2, open_error, sizeof(open_error));
;; exit(-1);
;; }
mov eax, [fd]
cmp eax, -1
jne if_end
mov eax, 4
mov ebx, 2
mov ecx, open_error
mov edx, open_error_len
int 0x80
if_end
;; nread = read(fd, buffer, sizeof(buffer));
mov eax, 3
mov ebx, [fd]
mov ecx, buffer
mov edx, buffer_len
int 0x80
mov [nread], eax
;; while (nread > 0) {
;; write(1, buffer, nread);
;; nread = read(fd, buffer, sizeof(buffer));
;; }
while_block
mov eax, [nread]
cmp eax, 0
jng while_end
mov eax, 4
mov ebx, 1
mov ecx, buffer
mov edx, [nread]
int 0x80
mov eax, 3
mov ebx, [fd]
mov ecx, buffer
mov edx, buffer_len
int 0x80
mov [nread], eax
jmp while_block
while_end
;; close(fd);
mov eax, 6
mov ebx, [fd]
int 0x80
;; exit(0);
mov eax, 1 ; 1 == exit system call
number
mov ebx, 0 ; return value
int 0x80
segment .data
prompt db 'filename = '
prompt_len equ $ - prompt
open_error db 'cannot open file!'
open_error_len equ $ - open_error
segment .bss
filename resb 1024
filename_len equ $ - filename
buffer resb 1024
buffer_len equ $ - buffer
fd resb 1
nread resb 1
=========================================================================
이것두 읽어 주세여 ^^::
프로그램이 표준 입력에서 파일이름을 입력 받아
파일의 내용을 표준 출력으로 출력하는 거거든여...
스트링 처리 때문에 마무리 못하고 있는데 ㅠㅠ
아참 주석 부분은 이 프로그램 하고 상관 없거든여...^^;;
제발 아시면 가르쳐 주세여...
Re^3: ^^* 잘 안되네여 이궁~~
죄송합니다. 제가 인라인 어셈블러로 테스트 해보는 바람에...
mov eax, nread
dec eax
mov byte ptr filename[eax], 0
mov 에서 operation size 가 어셈블러 입장에서는 명확하지 않아서
발생한 오류 같습니다.
그래도 안되면 잘 모르겠습니다... ㅡㅡ;
GNU 어셈블러라면 movb 인스트럭션을 쓰면 되고요...
Re^4: 이것두 읽어 주세여 ^^::
제가 말씀드린대로 하면 되나요, 안되나요?
저도 그것이 알고 싶군요...
제가 지금 NT 상태라 리눅스에서 테스트를 해볼 수가 없군요...
ㅡㅡ;
Re 안되네여 ^^;;;
지금 사용하고 있는 어셈블러가 nasm 이거든여....
있는 책는 원서라 공부 하기 정말 힘드내여 ^^;;;
Re^6: Re 안되네여 ^^;;;
한번만 더 해 보실래요? 밑지는 셈 치고... ㅡㅡ;
저도 집에 가서 한 번 해볼께요...
일단 ptr 만 빼보고...
mov byte filename[eax], 0
아니면, 처음 했던거에 byte 만 추가해서...
mov byte [filename+eax], 0
실제로 리눅스 켜놓고 해보면 답을 찾을 수 있을 것 같습니다.
혹시 위에서 말씀드린 걸로 되면 좀 알려 주세요... ^^
이게 되는군요.
테스트 해봤습니다.
mov byte [filename+eax], 0
안되면, 이젠 진짜로 모릅니다. ㅠㅠ
댓글 달기