X86汇编初探
使用汇编计算3的阶乘
一直以来都想学习一下汇编,增加自己对计算机系统结构的了解,本文参考网上教程,计算3的阶乘,之所以是3,是因为在使用中断指令的时候,把数字交给系统调用来输出到屏幕上,只会用ASCII码,其他方式还不知道怎么搞,3的阶乘是6,4的阶乘是24,ASCII,码无法表达,所以暂时只能这样了,有如下几个注意点:
- int 80h 表示在linux上的系统调用
- 编译时候注意64位和32位的问题
代码
汇编计算3的阶乘
;recursion.asm
;递归的实现
;by lsrj
;nasm x86
;只能输出个位数
;
section .data
factor equ 3
msg db 'Factorial 3 is: '
len equ $-msg
newline db 0xa
section .bss
fact resb 1
section .text
global _start
_start:
mov BL,2 ;BL 寄存器值为2
mov AL,1 ;AL 寄存器值为1
call proc_fact ; 下一条指令地址为proc_fact
add ax, 30h ;转化为ASCII码
mov [fact],AX ; 赋值给保留的 fact地址
;linux x86系统调用
;打印提示信息
mov edx,len
mov ecx,msg
mov ebx,1
mov eax,4 ; system call number (sys_write)
int 0x80
;打印结果
mov edx,1
mov ecx,fact
mov ebx,1
mov eax,4
int 0x80
;打印换行
mov edx,1
mov ecx,newline
mov ebx,1
mov eax,4
int 0x80
;退出系统调用
mov eax,1 ; system call number (sys_exit)
int 0x80
proc_fact:
cmp BL,factor ;BL寄存器的值和factor进行比较
jle do_calculation ; 如果小于等于factor,下一条指令地址为do_calculation
ret ;返回调用处的下一个地址
do_calculation:
mul BL ;AX = AL * BL
inc BL ;BL寄存器值自增1
call proc_fact ;下一条指令的地址是 proc_fact
ret ; 返回调用处的下一个地址
编译
nasm -f elf64 recursion.asm
ld -o recursion recursion.o
执行
./recursion
输出
Factorial 3 is: 6
金钱和自由相比,不值一提

浙公网安备 33010602011771号