查找最大值代码:
.section .data #数据项
data_items:
.long 3,67,34,222,45,75,54,34,44,34,33,22,11,66,0
.section .text
.globl _start
_start:
movl $0, %edi #将0引入索引寄存器
movl data_items(,%edi,4), %eax #加载数据的第一个字节
movl %eax, %ebx #ebx记录当前最大的数据项
start_loop:
cmpl $0, %eax #是否到达数据末尾
je loop_exit #退出
incl %edi #加载下一个值
movl data_items(,%edi,4), %eax
cmpl %ebx, %eax #比较
jle start_loop #如果新的数据项不大于原最大值 ,退出本次循环
movl %eax, %ebx #更新最大值寄存器
jmp start_loop #循环开始处
loop_exit:
movl $1, %eax
int $0x80
-
.section .data
伪指令,表示数据区的开始
几种数据类型:
-
.byte
一个字节,数字范围是0~255
-
.int
两个字节,数字范围是 0~65535
-
.long
四个字节 数字范围为 0~2^32
-
.ascii
用于将字符输入内存
-
.section .text
伪指令,表示指令的开始
-
.globl
代表之后的符号将会被代替
-
movl data_items(,%edi,4), %eax
:该指令的通用格式为 movl 起始地址(,%索引寄存器,字长),表示从数据区的某一个位置取出数字存到 %eax,
-
cmpl $0, %eax
比较两个值。这里是比较 0 和存储在 %eax 中的数字,判断是否到达行尾
-
je loop_exit
: jump when equal 上一语句等于时候跳
-
incl %edi
增加1 , movl data_items(,%edi,4), %eax
访问的就是下一个字长的数字了
总结:
- 常量数据:最后一个元素是 0 的一串数字
- 变量使用:
-
%edi
: 记录数字的索引
-
%eax
: 记录当前访问的数字
-
%ebx
: 记录目前位置数字的最大值
- 逻辑流程:
初始化代码块
1. 初始化 %edi
为0 指向第一的数字
2. 索引寻址获得第一个数字
3. 将第一个数字设置为最大值
循环代码块
1. 比较当前数字是否为0,即判断是否到达数组末尾如果是就跳到退出代码块否则继续执行以下流程
2. 将索引加一,使用索引寻址获取下一个数字
3. 如果该数字不大于设定的最大值就跳到下一次循环,否则将最大值更新
4. 再次开始新的循环
退出代码块
1. 系统调用exit退出
网友评论