学习笔记目录
declare指令
.ascii //文本字符串
.asciz //以空字符结尾的字符串
.byte //字节值
.double //双精度浮点值
.float //单精度浮点值
.single //单精度浮点数(和 float 相同)
.short //16位整数
.int //32位整数
.long //32位整数,和 int 相同
.quad //64位(8字节)整数
.octa //128位(16字节)整数
segment指令参考
.text: // 代码段。
.data: //带有初始值的数据段;
.bss: //不带有初始值的数据段,会被初始化成0
.rodata: // 只读数据段。
.section: //把代码划分为若干个区,例如,.section .data、.section .text。
. // 当前地址,参考下面的程序代码中 len = . - msg
: // 数据(变量)或指令(函数)的地址。参考下面代码中的 .global _start
用法示例
.comm buffer, 1024: // 声明一个全局可见的未初始化的大小为1024字节的起始地址为buffer的内存区域
.lcomm buffer, 1024: // 声明一个局部可见的未初始化的大小为1024字节的起始地址为buffer的内存区域
.equ LOOP, 8: / 定义一个值为8的符号常量LOOP
.include "hello.s":// 包含文件,不用说了
.rept 3
.long 0
.endr // 表示 .long 0 这个指令重复3次
实例
话不多说上代码。示例代码打印Hello, workd!,并从屏幕接受一个输入并回显到屏幕。
# AT&T
# Hello.s
.data
msg : .string "Hello World!\n"
len = . - msg
inputMsg : .string "Please input a number:"
inputLen = . - inputMsg
.bss
num : .long 0
.text
.global _start
_start:
movl $len, %edx
movl $msg, %ecx
movl $1, %ebx
movl $4, %eax
int $0x80
movl $16, %edx
movl $num, %ecx
movl $2, %ebx
movl $3, %eax
int $0x80
movl $16, %edx
movl $num, %ecx
movl $1, %ebx
movl $4, %eax
int $0x80
movl $0, %ebx
movl $1, %eax
int $0x80