colorful rat Ratfactor.com > Dave's Repos

pftgu_nasm

NASM ports of exercises from "Programming from the Ground Up"
git clone http://ratfactor.com/repos/pftgu_nasm/pftgu_nasm.git

pftgu_nasm/ch03.2_maximum.asm

Download raw file: ch03.2_maximum.asm

1 ; Chapter 3 "Maximum" 2 ; 3 ; Finds the largest value in a series of 4-byte values. 4 ; Demonstrates x86 memory access via: address + index * multiplier. 5 ; 6 ; $ ./go.sh ch03.2_maximum 7 ; Exited with code: 222 8 ; 9 ; Note: My version here differs from the book's. I don't preload 10 ; the first value into eax and I check for the sentinel 11 ; later in the loop. Savings: 1 instruction. :-) 12 13 section .data 14 15 ; "double" sized items (32 bits) with zero sentinel at the end 16 data_items: dd 3, 67, 34, 222, 45, 75, 54, 0 17 18 section .text 19 20 global _start 21 22 _start: 23 mov edi, 0 ; start our data "index" at 0 24 mov ebx, 0 ; ebx will hold the largest value found 25 26 start_loop: 27 mov eax, [data_items + edi * 4] ; get item by index (* 4 bytes) 28 cmp eax, 0 ; have we hit the sentinel? 29 je loop_exit ; ...yes, we're done with the list 30 inc edi ; move index to next value to be checked. 31 cmp eax, ebx ; Is this value bigger? 32 jle start_loop ; ...no. Try the next value. 33 mov ebx, eax ; ...yes. Store it... 34 jmp start_loop ; ...and check next value 35 36 loop_exit: ; ebx contains largest value, so that's our exit status 37 mov eax, 1 ; linux syscall 'exit' 38 int 0x80 ; interrupt to call linux kernel