借鉴 《深入理解程序设计》 的两个小例子,对应到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,否则系统无法让 $? 将返回码正确传递出来