Ассемблер в Linux для программистов C: различия между версиями

(Вы чего сударь?, исправление)
 
<pre>
.section .rodata /* Сегмент read-only data */
.data
str_d:
printf_format:
.stringasciz "%d\n"
array_start:
.long 101, 152, 14832, -36, 1518, 3, 72-100
array:
.set count_el, (.-array_start)/4
.long 10, 15, 148, -3, 151, 3, 72
 
array_size:
 
.long (. - array)/4 /* количество элементов массива */
.text
.globl main
.type main, @function
.text /* cs -- code segment */
 
main:
movl array, %eax /* в %eax будет храниться результат;
в начале наибольшее значение — array[0] */
movl $1, %ecx /* начать просмотр с первого элемента
*/
jmp ch_bound
loop_start: /* начало цикла */
cmpl %eax, array(,%ecx,4) /* сравнить текущий элемент
массива с текущим наибольшим
значением из %eax */
jle less /* если текущий элемент массива меньше
или равен наибольшему, пропустить
следующий код */
movl array(,%ecx,4), %eax /* а вот если элемент массива
превосходит наибольший, значит, его
значение и есть новый максимум */
less:
incl %ecx /* увеличить на 1 номер текущего
элемента */
ch_bound:
cmpl array_size, %ecx /* сравнить номер текущего элемента с
общим числом элементов */
jne loop_start /* если они не равны, повторить цикл снова */
 
movl $0, %ecx /* запишем константу 0 в %ecx */
/*
movl array_start, %ebx /* Записать элемент (1) в %ebx */
* следующий код выводит число в %eax на экран и завершает программу
jmp is_last /* перепрыгнуть сразу на проверку is_last */
*/
 
pushl %eax
 
pushl $printf_format
 
call printf
search:
addl $8, %esp
movl array_start(,%ecx,4), %eax /* Запишем array_start+%ecx*4 в %eax, заметьте мы не берем адрес($) */
movlcmpl $0%eax, %ebx /* Проверим %ebx == %eax ? */
jge above /* если %ebx >= %eax (если ebx уже больше eax то пропустит присваивание) */
ret
movl %eax, %ebx /* переместить %eax в %ebx (значит оно уже наибольшее) */
above:
inc %ecx /* Увеличить %ecx на 1*/
 
is_last:
cmpl $count_el, %ecx /* %ecx == константе count_el? */
jl search /* if( %ecx < $count_el) goto search; */
/* Если уже не меньше, продолжаем*/
 
pushl %ebx /* Поместить в стек число из %ebx */
pushl $str_d /* Поместить адрес строки в стек */
call printf /* printf(&str_d, edx); */
addl $2*4, %esp /* Переместить стек на 2 ячейки выше(для intel) */
 
</pre>
 
Анонимный участник