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段中要保存输入的内容。

原文地址:https://www.cnblogs.com/whuwzp/p/nasm_bss_input.html