2012-10-12 4 views
2

사용자가 숫자를 입력하는 프로그램을 만들고 있는데, 0부터 숫자까지 모든 숫자를 인쇄합니다. 그것은 잘 컴파일, 링크 괜찮아요, 그리고 아무런 오류가 반환되면 실행하지만, 그것은 절대적으로 아무것도 인쇄하지 않습니다. 다음은 코드입니다.linux의 nasm 코드는 아무 것도 표시하지 않습니다.

SECTION .data 
len EQU 32 

SECTION .bss 
other resd len 
data resd len 

SECTION .text 

GLOBAL _start 
_start: 
nop 

input:     ; This section gets the integer from the user 
mov eax, 3   ; } 
mov ebx, 1   ; } 
mov ecx, data  ; } System_read call 
mov edx, len  ; } 
int 80h    ; } 

mov ebp, 1 

setup:     ; This section sets up the registers ready for looping 
mov [other], ebp 

loop:     ; This section loops, printing out from zero to the number given 
mov eax, 4 
mov ebx, 1 
mov ecx, [other] 
mov edx, len 
int 80h 

exit:     ; Exits the program 
mov eax, 1   ; } 
mov ebx, 0   ; } System_exit call 
int 80h    ; } 

KDBG에서 단계를 수행하면 몇 가지 오류가 반환됩니다. 비록 인터럽트 나 인터럽트를 받는다. 이유는 모르겠지만 Geany에서 실행할 때 마지막에 0 값을 반환하고 오류없이 실행되기 때문입니다. 왜 작동하지 않습니까?

미리 감사드립니다.

참고 :이 코드는 반복되지 않습니다. 아직 끝나지 않았습니다. 여기서해야 할 일은 숫자 1을 인쇄하는 것입니다.

+0

레이블 이름에 명령어 이름을 사용하면 안됩니다. 나는 '반복'을 의미한다. 그것은 명령입니다. –

+0

'mov ecx, [other]'문제입니다. ecx는 버퍼의 주소를 원합니다! 어쨌든 "1"을 인쇄하지 않으면 ASCII 코드 1 (smileyface)으로 문자를 인쇄합니다. itoa 봐 ... –

답변

1

인쇄하려면 mov ecx, [other]으로 전화하십시오. 이것은 다른 주소에 저장되어있는 주소를보고 그 주소 다음에 저장된 주소를 찾습니다. 문제는이 시스템 호출이 값이 아닌 ecx로 주소를 예상한다는 것입니다.

mov ecx, other을 대신 호출하면 ecx는 other의 주소를 가지며 그 주소로 이동하여 거기에있는 주소를 인쇄 할 수 있습니다.

여기에 또 다른 문제가 있습니다. other에 저장된 번호를 인쇄하면 ASCII 값으로 변환됩니다. 예를 들어, 1을 인쇄하려고 할 때, 1을 인쇄하는 대신 ascii 1을 인쇄합니다 (이 경우 제목 문자의 시작이되고 인쇄 할 것은 없습니다). 숫자를 인쇄하려면 '0' (문자 '0')을 추가하십시오.

EDIT : 한 가지 더 읽으면, 1을 ebx로 전달합니다. 1은 STDOUT입니다. 원하는 것은 0 인 STDIN입니다.

+0

감사. 훌륭하게 작동합니다. – Progrmr

관련 문제