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
posted @ 2022-05-15 16:47  咸鱼人生&  阅读(60)  评论(0)    收藏  举报