Read 16 bits from memory in Assembly x86 NASM
I'm trying to do a very simple exercise in assembly: sum N numbers located in contiguous memory cells. This is my actual code:
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
The program is compiled and executed correctly but returns an incorrect value. The result should be 450, instead I obtain 194.
I noticed that 194 is the the same bitstream as 450, but the 9th bit is omitted. Debugging my program I argued that for some reason, that I can't understand, when I read
[array+ecx]
It reads only 8 bits although I specified the keyword DWORD.
Can someone help me? Thanks in advance
The program sums up the array correctly. The problem is with returning the result.
[Answer corrected, thanks to Jester.]
You pass the return value to sys_exit() (this is what mov eax, 1; int 0x80 does). sys_exit() leaves only the lower 8 bits of the return value (other bits are used for some flags).
That's where the 9th bit is lost.
Shell observes already truncated return value and prints it out.
链接地址: http://www.djcxy.com/p/72452.html