标签:相关 pre lib str ber sys http 文件 lob
sudo apt install nasm
sudo apt install gcc-multilib
以下内容摘自:https://www.cnblogs.com/idorax/p/6400210.html
.bss: 未被初始化的全局的C变量。这一节在o文件中不占实际的空间,只是一个place holder。o文件格式之所以区分初始化的变量和未被初始化的变量是因为处于空间利用率上的考虑。没有被初始化的变量确实没有必要占用实际的磁盘空间。
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
获取用户输入用的是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
可以看到,输出打印的字符串保存于.data段,.bss段中要保存输入的内容。
标签:相关 pre lib str ber sys http 文件 lob
原文地址:https://www.cnblogs.com/whuwzp/p/nasm_bss_input.html