当前位置: 首页 > news >正文

【Linux内核】ATT汇编编程练习

编写AT&T汇编程序,接收正整数输入n,计算1到n的和,并打印在屏幕上。

LInux下,先安装GCC,编写r如下代码,命名为sum.s

.section .data
input_buffer:   .space 32     # 输入缓冲区
output_buffer:  .space 32     # 输出缓冲区

.section .text
.globl _start

_start:
    # 读取输入
    mov $0, %rax              # sys_read
    mov $0, %rdi              # stdin
    lea input_buffer(%rip), %rsi
    mov $32, %rdx
    syscall

    # 将ASCII字符串转为整数n
    xor %rbx, %rbx            # 清空rbx存储n
    lea input_buffer(%rip), %rsi
    mov %rax, %rcx            # 实际读取字节数

convert_input:
    movb (%rsi), %al
    cmp $10, %al              # 检测换行符
    je calculate_sum
    sub $48, %al              # ASCII转数字
    imul $10, %rbx
    add %rax, %rbx
    inc %rsi
    loop convert_input

calculate_sum:
    # 计算sum = n*(n+1)/2
    mov %rbx, %rax
    inc %rax
    mul %rbx
    shr $1, %rax              # 结果在rax中

    # 将整数转为ASCII字符串
    lea output_buffer(%rip), %rdi
    mov %rax, %r8             # 保存计算结果
    mov $10, %r9              # 除数
    xor %rcx, %rcx            # 字符计数器

push_digits:
    xor %rdx, %rdx
    div %r9                   # rax=商, rdx=余数
    add $48, %dl              # 数字转ASCII
    push %rdx                 # 压栈保存字符
    inc %rcx
    test %rax, %rax
    jnz push_digits

    # 从栈中弹出字符到输出缓冲区
    mov %rcx, %rdx            # 保存字符数量
pop_digits:
    pop %rax
    mov %al, (%rdi)
    inc %rdi
    loop pop_digits

    # 添加换行符
    movb $10, (%rdi)
    inc %rdx

    # 输出结果
    mov $1, %rax              # sys_write
    mov $1, %rdi              # stdout
    lea output_buffer(%rip), %rsi
    syscall

    # 退出程序
    mov $60, %rax             # sys_exit
    xor %rdi, %rdi
    syscall

编译生成目标文件sum.o:

[joseph@localhost asm]$ as sum.s -o sum.o

链接,生成sum可执行文件:
[joseph@localhost asm]$ ld sum.o -o sum

运行:
[joseph@localhost asm]$ ./sum
100
5050
[joseph@localhost asm]$

相关文章:

  • 【特权FPGA】之PS/2键盘解码
  • 小白学习java第12天(下):网络编程
  • 第1个小脚本:英语单语按字母个数进行升序排序
  • Spark Core(2)
  • Java学习打卡-Day25-注解和反射、Class类
  • 除了 `task_type=“SEQ_CLS“`(序列分类),还有CAUSAL_LM,QUESTION_ANS
  • 分布式系统-脑裂,redis的解决方案
  • 2025年蓝桥杯B组题解
  • 深度剖析:架构评估的常用方法与应用
  • 当Browser Use遇见A2A:浏览器自动化与智能体协作的“冰与火之歌“
  • WindowsPE文件格式入门06.手写最小PE
  • 向上取整,向下取整和四舍五入
  • 安卓AssetManager【一】- 资源的查找过程
  • 【Java学习】Spring AI集成指南
  • 深入理解 v-if 指令及其使用方法
  • C++在Linux上生成动态库并调用接口测试
  • 七、Qt框架编写的多线程应用程序
  • JDK的卸载与安装
  • 【JavaScript——页面渲染】课程列表(蓝桥杯真题-2457)【合集】
  • 《从零搭建Vue3项目实战》(AI辅助搭建Vue3+ElemntPlus后台管理项目)零基础入门系列第十二篇(完结篇):数据统计功能实现
  • 西安 餐饮 网站建设/东莞百度搜索优化
  • 郑州郑州网站建设河南做网站公司/千万不要学网络营销
  • wap建站程序/线上营销策略
  • 无锡网站/搜索引擎优化的意思
  • 毕业设计用java做网站/网络广告营销方案策划
  • 温州哪里有做网站/郑州seo多少钱