2013-10-05 3 views
1

32 비트 우분투 용 NASM 어셈블리 학습.NASM을 사용하여 스택에 번호 인쇄

단순히 당신이 그것을 호출하기 전에 스택에 밀어 수를 출력하는 기능을 수행 :

SECTION .text 
global main 
main: 
; ----------------------------------------------------------- 
; Main 
; ----------------------------------------------------------- 
push 5 
call print_number 

; ----------------------------------------------------------- 
; Exit 
; ----------------------------------------------------------- 
mov EAX,1 
int 0x80 

; ----------------------------------------------------------- 
; Prints a number 
; ----------------------------------------------------------- 
print_number: 
push EBP 
mov  EBP,ESP 

mov  EAX,4 
mov  EBX,0 
mov  ECX,[EBP + 8] 
add  byte [ECX],'0' 
mov  EDX,1 
int  0x80 

pop  EBP 
ret 

나에게 분할 오류 오류를주는 유지합니다.

내가 함수를 호출 할 때, 스택은 다음과 같아야 보자 ... :

  • 5
  • 반환 주소

가 그럼 난 EBP를 밀어 :

  • 반송 주소
  • EBP는

나는 스택의 기본의 주소를 포함 EBP을 원하는, 그래서 나는이 작업을 수행 :

mov EBP, ESP 

그래서 기본적으로 EBP 이제 스택의 기본에 주소입니다. ECX 내가 인쇄려고 무엇이든의 주소가 필요하기 때문에 그것이 내가 인쇄 할 5을 가리 키도록, ECX 8 바이트로 이동 EBP (스택의 기본 주소)를해야한다 :

mov ECX,[EBP + 8] 

그리고 그것을 인쇄 할 내가 먼저 ASCII로 변환 :

add byte [ECX],'0' 

내가 여기 문제를 볼 수 없습니다. 세분화 오류가 발생하는 이유는 무엇입니까?

+0

+1 먼저 잘 작성된 질문은 내가 –

답변

3

mov ECX,[EPB+8]EPB+8의 값을 ECX으로 이동합니다.이 값은 유효한 주소가 아닙니다. 그냥 5입니다. 당신은 다만 수 :

mov ECX,EPB 
add ECX,8 
+0

또는'LEA ECX, [EBP + 8]' – Michael

+0

아 네 @Michael, 풍어 :-) 모든 일을 본 적이 – lurker