2015-01-11 6 views
2

어셈블리에서 아주 간단한 연습을하려고합니다 : 인접한 메모리 셀에있는 N 개의 숫자 합계. 이것은 내 실제 코드입니다 :Assembly x86 NASM의 메모리에서 16 비트 읽기.

global _start 
section .data 

     array: DD 300,10,20,30,40,50 ; Allocate the numbers 
     arrayLen: EQU $-array   ; Get the quantity of numbers 

section .text 
     _start: 

     mov ecx, 0      ; The counter 
     mov ebx, 0      ; The Accumulator 

loop: add ebx, DWORD [array+ecx]  ; get the i-th word and add it to the accumulator 
     add ecx, 4 
     cmp ecx, arrayLen 
     jne loop 

     mov eax, 1 
     int 0x80 

프로그램이 컴파일되고 올바르게 실행되지만 잘못된 값을 반환합니다. 결과는 450이어야하지만 대신 194를 얻습니다.

194는 450과 동일한 비트 스트림이지만 9 번째 비트는 생략되었습니다. 내 프로그램을 디버깅 난 내가 키워드 DWORD를 지정하지만, 그것은 단지 8 비트를 읽고

[array+ecx]

을 읽을 때, 어떤 이유로, 내가 이해할 수없는 것을 주장했다.

나를 도와 줄 사람이 있습니까? 미리 감사드립니다.

+0

8 비트 읽기는 어디서 볼 수 있습니까? 'ebx'는 4 바이트 (dword) 값만큼 증가합니다. 혹시'EBX '가 아니라'BL'을보고 계셨습니까? – Inspired

+0

터미널에서 프로그램을 실행하면 ebx의 값을 반환합니다. 이 반환 값을 보려면 ** echo $? ** – sirnino

답변

3

프로그램이 배열을 올바르게 요약합니다. 문제는 결과를 반환하는 것입니다.

은 [농담에 감사를 수정 답변.]

당신은 sys_exit()에 반환 값을 (이 mov eax, 1; int 0x80가하는 일입니다) 전달합니다. sys_exit()은 반환 값의 the lower 8 bits만을 남겨 둡니다 (다른 플래그는 일부 플래그에 사용됨).

9 번째 비트가 손실 된 곳입니다.

쉘은 이미 잘린 반환 값을 관찰하여 인쇄합니다.

+0

을 입력하십시오. 매우 감사합니다. 어셈블리에서 프로그램의 리턴 코드를 어떻게 설정할 수 있습니까? – sirnino

+1

실제로 9 번째 비트는 이미 'exit' 시스템 호출 중에 이미 손실되었습니다. 그것은 껍질의 잘못이 아닙니다. – Jester

+0

나를 고쳐 주셔서 감사합니다! – Inspired