美文网首页AT&T 汇编语言
AT&T 风格汇编语言(chapter2 查找最大值)

AT&T 风格汇编语言(chapter2 查找最大值)

作者: 李2牛 | 来源:发表于2018-05-05 17:10 被阅读0次

查找最大值代码:

    .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
  1. .section .data
    伪指令,表示数据区的开始
    几种数据类型:
  • .byte 一个字节,数字范围是0~255
  • .int 两个字节,数字范围是 0~65535
  • .long 四个字节 数字范围为 0~2^32
  • .ascii 用于将字符输入内存
  1. .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退出

相关文章

网友评论

    本文标题:AT&T 风格汇编语言(chapter2 查找最大值)

    本文链接:https://www.haomeiwen.com/subject/bqterftx.html