这是我的第二个汇编:
[root@bjxdurs235 c-study]# vi maximum.s
.section .data
data_items:
.long 78,23,32,33,11,67,230,0
.section .text
.globl _start
_start:
movl $0 , %edi
movl data_items(,%edi,4) , %eax
movl %eax , %ebx
start_loop:
cmpl $0 , %eax
je exit_loop
incl %edi
movl data_items(,%edi,4) , %eax
cmpl %ebx , %eax
jle start_loop
movl %eax , %ebx
jmp start_loop
exit_loop:
movl $1 , %eax
int $0x80
~
~
~
~
~
~
~
~
~
~
~
~
~
~
"maximum.s" 25L, 357C written
[root@bjxdurs235 c-study]# as maximum.s -o maximum.o
[root@bjxdurs235 c-study]# ld maximum.o -o maximum
[root@bjxdurs235 c-study]# ./maximum
[root@bjxdurs235 c-study]# echo $?
230
昨天去青年湖游泳了,晚上回来实在太累了,倒头就睡着了,否则昨天就把这个小程序搞明白了,现在来搞(晕,现在来搞这个说法说来是出自yodao的daydayup啊,他经常说这个,弄的我现在也经常说这个啦),
程序开始在数据段里定义一个long类型的数组,数组中每个元素占用4个字节(32位),其特征是:最后一个元素是0(这很重要,后来的loop循环就是根据这个来判断是否结束循环的)
在正文的循环体中做了这些:
将第一个数组元素保存在寄存器%ebx中,开始循环比较,如果当前的数组元素比%ebx里的数字小,则continue,否则更新ebx寄存器里的数字,循环的结束条件是当前的元素为0了
结束循环的时候用到了上一节学到的系统调用_exit,这里图了个巧,将最大的数保存在了ebx中,ebx寄存器正好保存的是_exit系统调用退出的状态码。
ok,总结一下,这个小汇编比第一个只有8行的汇编入门程序是丰富了一些,最起码里面有了几个小小的逻辑判断,还有循环这样的结构,程序一步步的走下去,我学到的有:
1、汇编长啥样
2、几个简单,估计以后会经常看到的汇编指令,如jmp,cmpl,je,jle等等
3、寄存器的知识扫盲
阅读(707) | 评论(0) | 转发(0) |