Ubuntu Linux 汇编语言程序设计

借鉴 《深入理解程序设计》 的两个小例子,对应到opencl的汇编语言程序设计

案例一

1.源码

将如下源码保存为 exit.s

.section .data  # 汇编器指令,数据段,表示存放数据的内存区域

.section .text  # 汇编器指令,代码段,表示下面是程序指令
.globl _start   # 程序的全局入口 _start 是一个关键字符号
_start:         # 表示下面是程序指令
movl $1, %eax   # 移入eax,由于后面执行了int $0x80,表示要中断陷入内核态,并执行0x80中断,
                # 这是系统调用的中断,系统调用号为$1,即退出程序,并将ebx中的值$0返回给操作系统
movl $10, %ebx  # 系统调用exit的返回值
int $0x80       # 执行中断号为0x80的中断,即开始一个系统调用

2.汇编、链接、运行

$ vim exit.s
$ as exit.s -o exit.o
$ ld exit.o -o exit
$ ./exit
$ echo $?

结果:

案例二

1.源码

将如下汇编程序源代码保存为 maximum.s

#目的:本程序寻找一组数据项中的最大值
#变量:寄存器有以下用途:
#
# %edi - 保存正在检测的数据项索引
# %ebx - 当前已经找到的最大数据项
# %eax - 当前数据项
#
# 使用以下内存位置:
#
# data_items - 包含数据项
#               0表示数据结束
#

.section .data    # 以 . 开头的字符串都是汇编器指令
data_items:       # 带冒号的字符串是标签,表示程序或数据的内存地址
        .long 33,37,34,23,45,75,54,34,44,255,22,11,66,0

.section .text

.globl _start
_start:
movl $0, %edi
movl data_items(,%edi,4), %eax
movl %eax, %ebx

start_loop:
cmpl $0, %eax # 是否道道数据数组的最后一个元素
je loop_exit  # 如果上句执行结果为真,则执行这句跳转
incl %edi     # 游标增加1
movl data_items(,%edi,4), %eax  # 取下一个元素的数值
cmpl %ebx, %eax  # 与当前的最大值做比较
jle start_loop
movl %eax, %ebx  # 若上句为真,即新值更大,则更换最大值

jmp start_loop   # 无条件转移,跳到循环的开始一句

loop_exit:
movl $1, %eax  # 因为接下来将执行系统调用中断 0x80,指令int,所以这里存入eax的是系统调用号,%1为exit系统调用,返回ebx里的值給操作系统
int $0x80      # 执行中断,中断号0x80对应为执行系统调用的中断例程


2.汇编、链接、运行

$ vim maximum.s
$ as maximum.s  -o maximum.o
$ ld maximum.o -o maximum
$ ./maximum
$ echo $?

结果: 

注意本小例子,数组中的最大值不能超过255,否则系统无法让 $? 将返回码正确传递出来

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值