• NASM汇编学习系列(5)——使用bss段和获取用户输入


    说明

    1. 本学习系列代码几乎完全摘自:asmtutor.com,如果英文可以的(也可以用谷歌浏览器翻译看),可以直接看asmtutor.com上的教程
    2. 本学习系列目录地址:https://www.cnblogs.com/whuwzp/p/nasm_contents.html
    3. 系统环境搭建:(我用的是ubuntu18.04.4 server,安装gcc、g++)
    sudo apt install nasm
    sudo apt install gcc-multilib
    

    0. 概览

    1. 承前:无
    2. 启后:本节,获取用户输入。

    1. bss段

    1.1 理论知识

    以下内容摘自:https://www.cnblogs.com/idorax/p/6400210.html

    .bss: 未被初始化的全局的C变量。这一节在o文件中不占实际的空间,只是一个place holder。o文件格式之所以区分初始化的变量和未被初始化的变量是因为处于空间利用率上的考虑。没有被初始化的变量确实没有必要占用实际的磁盘空间。

    bss包含:

    • 所有未被显示地初始化的全局变量和静态变量
    • 所有被显示地初始化为0的全局变量和静态变量

    1.2 汇编中申明bss段

    以下摘自:https://asmtutor.com/#lesson9

    SECTION .bss
    variableName1:      RESB    1       ; 预留1个字节空间
    variableName2:      RESW    2       ; 预留2个word空间(1个word占2字节)
    variableName3:      RESD    3       ; 预留3个dword空间(1个dword占4字节)
    variableName4:      RESQ    4       ; 预留4个qword空间
    variableName5:      REST    5       ; 这个不太清楚了,原文为:reserve space for 1 extended precision float
    
    

    2. 获取用户输入并保存于bss段

    获取用户输入用的是sys_read的系统调用,man 2 read命令可以查看read函数的相关信息:

    #include <unistd.h>
    ssize_t read(int fd, void *buf, size_t count);
    

    以下代码摘自:https://asmtutor.com/#lesson9

    functions.asm是之前的。

    %include        'functions.asm'
     
    SECTION .data
    msg1        db      'Please enter your name: ', 0h      ; message string asking user for input
    msg2        db      'Hello, ', 0h                       ; message string to use after user has entered their name
     
    SECTION .bss
    sinput:     resb    255                                 ; 预留255字节用于保存用户输入
    
    SECTION .text
    global  _start
     
    _start:
     
        mov     eax, msg1
        call    sprint			; 打印提示信息
     
     							; 即将调用sys_read读取用户输入
        mov     edx, 255        ; number of bytes to read
        mov     ecx, sinput     ; 缓冲区,在bss段保存
        mov     ebx, 0          ; 文件描述符0是标准输入,1是输出,2是错误输出
        mov     eax, 3          ; sys_read的操作码为3
        int     80h
     
        mov     eax, msg2
        call    sprint
     
        mov     eax, sinput     ; move our buffer into eax (Note: input contains a linefeed)
        call    sprint          ; call our print function
     
        call    quit
    

    下面摘自https://asmtutor.com/#lesson9的测试结果:

    ~$ ./helloworld-input
    Please enter your name: Daniel Givney
    Hello, Daniel Givney
    

    3. 小结

    可以看到,输出打印的字符串保存于.data段,.bss段中要保存输入的内容。

  • 相关阅读:
    Linux:目录结构
    Linux安装日志(anaconda-ks.cfg、install.log、install.log.syslog)
    Docker:Dockerfile基础知识
    Docker:容器数据卷
    多线程设计模式:两阶段终止模式
    多线程:Thread中的常见方法
    多线程:查看进程线程方法
    多线程:创建线程
    Apollo:工作原理 核心概念
    Apollo:环境搭建
  • 原文地址:https://www.cnblogs.com/whuwzp/p/nasm_bss_input.html
Copyright © 2020-2023  润新知