- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
一个 BASH 示例,我想在 NASM 中实现一个类似的示例函数。
read -p "Enter the group you would like to create: " newgroup
groupadd $newgroup
The reason why I am creating this code is to show a comparison of different languages, used within Linux, This is one part of my research project. So i know, this can be done in other languages e.g. Python BASH and C etc. Before anyone asks.
我相信我在正确的地方,这是下面的代码。
;---------------------------NSAM----------------------
section .data ; initialized data, can be var's
userg: db "Type in the user group to add: ",10,0 ; 1st string, 10 is used to drop down a line. 0 is used to end the line.
userg_L: equ $-userg ; string length, automatically updates how long the string is, so you don't have to type 10 etc. every time its changed
respns: db "groupadded: ",10,0 ; 2nd string, 10 is used to drop down a line. 0 is used to end the line.
respns_L equ $-respns ; 2nd string length, automatically updates how long the string is, so you don't have to type 10 etc. every time its changed
command: db '/bin/groupadd', 0h ; command to execute.
arg1: db userg, 0h ; Shows all users on the system.
argu: dd command
dd arg1 ; arguments passed to the command line.
dd 0h ; struct.
enviro: dd 0h ; no arguments are need for the environment variables.
;========================================================
section .bss ; uninitialised data, also can be var's
userg_V resb 255 ; reserves 255 bytes of data.
;========================================================
section .text ; Asm core code. any of the sections can be in any order.
global _start: ; Makes _start the global function
_start: ; Makes _start the global function
mov eax, 0x04 ; store the system call code = 4 e.g. = kernel function (sys_write)
mov ebx, 0x01 ; 1 is the code to where to write the Asm out to. 1= The terminal
mov ecx, userg ; contains the label of the string.
mov edx, userg_L ; this is the length of the string.
int 80h ; calls the Linux kernel
mov eax, 0x03 ; 3 is the code to read user input. e.g. kernel function (sys_read)
mov ebx, 0x00 ; This is the error code memory block.
mov ecx, userg_V ; reserves 255 bytes of data name of string.
mov edx, 255 ; reserves 255 bytes of data.
int 80h ; calls the Linux kernel.
mov eax, 0x04 ; store the system call code = 4 e.g. = kernel function (sys_write)
mov ebx, 0x01 ; 1 is the code to where to write the Asm out to. 1= The terminal
mov ecx, respns ; calls the var
mov edx, respns_L ; calls the userg var length
int 80h ; calls the Linux kernel.
mov eax, 0x04 ; store the system call code = 4 e.g. = kernel function (sys_write)
mov ebx, 0x01 ; 1 is the code to where to write the Asm out to. 1= The terminal
mov ecx, userg_V ; reserves 255 bytes of data name of string.
mov edx, 255 ; reserves 255 bytes of data.
int 80h ; calls the Linux kernel.
mov edx, enviro ; Environment variables
mov ecx, argu ; Arguments to pass to the command line
mov ebx, command ; address to execute
mov eax, 11 ; SYS_EXECVE kernel opcode (11)
int 80h
call exit ; Calls the exit function.
;---------------------------------ASM exit code below!-------------------------------------------
exit:
mov eax, 0x01 ; [EAX] is 1 this is the exit code! e.g. = kernel function (sys_exit)
mov ebx, 0x00 ; This is the error code memory block.
int 80h ; calls the Linux kernel.
错误是:
ld -s -o myasm myasm.o
myasm.o: In function `arg1':
myasm.asm:(.data+0x3e): relocation truncated to fit: R_386_8 against `.data'
此错误已使用 dd 修复,但不会将用户组添加到系统。
下面的代码可以显示所有用户,但不会将用户输入作为参数。这是工作命令代码的示例,但没有用户输入。那么如何使用命令行代码实现用户输入。
command: db '/bin/cat', 0h ; command to execute.
arg1: db '/etc/passwd', 0h ; Shows all users on the system.
最佳答案
这是固定版本。请注意,groupadd
可能不在 /bin
中,如果 exec
失败,您应该打印一条错误消息。
;---------------------------NASM----------------------
section .data ; initialized data, can be var's
userg: db "Type in the user group to add: ",10 ; 1st string, 10 is used to drop down a line.
userg_L: equ $-userg ; string length, automatically updates how long the string is, so you don't have to type 10 etc. every time its changed
respns: db "groupadded: ",10 ; 2nd string, 10 is used to drop down a line. 0 is used to end the line.
respns_L equ $-respns ; 2nd string length, automatically updates how long the string is, so you don't have to type 10 etc. every time its changed
command: db '/bin/groupadd', 0h ; command to execute.
argu: dd command
dd userg_V ; arguments passed to the command line.
dd 0h ; struct.
enviro: dd 0h ; no arguments are need for the environment variables.
;========================================================
section .bss ; uninitialised data, also can be var's
userg_V resb 255 ; reserves 255 bytes of data.
;========================================================
section .text ; Asm core code. any of the sections can be in any order.
global _start: ; Makes _start the global function
_start: ; Makes _start the global function
mov eax, 0x04 ; store the system call code = 4 e.g. = kernel function (sys_write)
mov ebx, 0x01 ; 1 is the code to where to write the Asm out to. 1= The terminal
mov ecx, userg ; contains the label of the string.
mov edx, userg_L ; this is the length of the string.
int 80h ; calls the Linux kernel
mov eax, 0x03 ; 3 is the code to read user input. e.g. kernel function (sys_read)
mov ebx, 0x00 ; This is the error code memory block.
mov ecx, userg_V ; reserves 255 bytes of data name of string.
mov edx, 255 ; reserves 255 bytes of data.
int 80h ; calls the Linux kernel.
push eax ; save length of input
mov eax, 0x04 ; store the system call code = 4 e.g. = kernel function (sys_write)
mov ebx, 0x01 ; 1 is the code to where to write the Asm out to. 1= The terminal
mov ecx, respns ; calls the var
mov edx, respns_L ; calls the userg var length
int 80h ; calls the Linux kernel.
mov eax, 0x04 ; store the system call code = 4 e.g. = kernel function (sys_write)
mov ebx, 0x01 ; 1 is the code to where to write the Asm out to. 1= The terminal
mov ecx, userg_V ; the input text
mov edx, [esp] ; the length of the input text
int 80h ; calls the Linux kernel.
pop eax ; get back input length
mov [eax + userg_V - 1], byte 0 ; chop off trailing newline
mov edx, enviro ; Environment variables
mov ecx, argu ; Arguments to pass to the command line
mov ebx, command ; address to execute
mov eax, 11 ; SYS_EXECVE kernel opcode (11)
int 80h
;---------------------------------ASM exit code below!-------------------------------------------
exit:
mov eax, 0x01 ; [EAX] is 1 this is the exit code! e.g. = kernel function (sys_exit)
mov ebx, 0x00 ; This is the error code memory block.
int 80h ; calls the Linux kernel.
关于linux - 带有用户输出的 NASM 代码,然后输入到参数中。 (代码错误),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27384874/
我刚刚在学习 NASM,我有点想弄清楚这个问题。你如何在 NASM 中声明变量?例如,如何在 NASM 中声明 unsigned int i?谢谢 最佳答案 汇编语言中没有 unsigned int
我正在阅读这篇关于操作系统编程的精彩脚本 http://www.cs.bham.ac.uk/~exr/lectures/opsys/10_11/lectures/os-dev.pdf 第 12 页有一
我正在尝试使用 nasm 打印给我的程序的命令行参数: GLOBAL main EXTERN printf section .rodata fmt db "Argument: %s", 10, 0 s
这两种工具都将汇编指令直接翻译成机器代码,但是否有可能确定哪一种产生最快和最干净的代码? 最佳答案 当您使用汇编程序编写时,您准确地描述了生成 的说明所以它不依赖于汇编程序。这取决于你。您编写的助记符
代码: %define x 0x03 x equ 0x03 它们之间有什么区别? 最佳答案 %define是一种更强大的宏处理方式,类似于 C 预处理器。在您的简单情况下,使用 x 没有太大区
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 关闭 8 年前。 这个问题似乎是题外话,因为它缺乏足够的信息来诊断问题。更详细地描述您的问题或inclu
我目前正在关注 a tutorial on OS development ,其中包括对引导加载程序的讨论。 我的引导加载程序当前处于 16 位实模式,因此,我能够使用提供的 BIOS 中断(例如 VG
len: equ 2 len: db 2 它们是否相同,产生的标签可以代替2使用?如果不是,那么每种声明形式的优点或缺点是什么?它们可以互换使用吗? 最佳答案 第一个是equate,类似于C
我的循环有问题,其中包含的代码很长,它给了我错误“短跳超出范围”,所以我想知道是否有一种方法可以通过不减少来使循环工作其中代码量有多少? 示例1: label: my code LOOP la
在阅读了至少约4本关于汇编编程的不同书籍的前3或4章之后,我进入了一个阶段,可以使用MASM 6.11将“Hello World”放置在dosbox控制台上。想象一下我的喜悦! 我程序的第一个版本使用
我正在做一个项目,将我编写的子程序附加到老师包含的主文件中。他给了我们使我们的子程序成为全局性的说明,但显然我是个白痴。这两个 asm 文件在同一个文件夹中,我正在使用 nasm -f elf -g
我最近开始使用 NASM 程序集编写代码,但我的问题是我不知道如何以正确的方式访问结构元素。我已经在这个网站和谷歌上搜索了解决方案,但我看到到处都有人说不同的话。我的程序崩溃了,我感觉问题出在访问结构
我正在尝试从用户那里获取输入,然后我想根据用户输入的内容输出一些文本。 我的问题是出于某种原因,它总是认为它是 A,我不知道为什么。你可以在下面找到我的代码: bits 16
我熟悉 TASM 但不太熟悉 NASM。我读过 NASM 允许使用本地标签,这些标签在名称前用点表示。例如代码 .loop: ;some code jmp .loop 定义一个局部标号,
您将如何在寄存器上对 NASM 进行位移?我读了手册,似乎只提到了这些运算符 >> , > 和 >仅用于整数常量。这就是“标量值”的含义。您可以使用 shl 移位寄存器中的值或 shr指示。它们用于将
首先,这是一个家庭作业。 我有一个循环来分别获取两位数的值,并通过将第一个数字乘以 10 并与第二个数字相加得到一个整数来加入它们。 我正在做这一切并保存在我的AL注册,现在我想将该整数插入一个数组,
我一直在做基本的 NASM 编码,我想知道是否可以使用 NASM 模拟按键。如果是这样,怎么做? 如果重要的话,我正在使用 Ubuntu linux 10.04 和 Pentium R T4300 处
我可以在 NASM 中创建一个新标签,它指向一个新的内存位置,该位置与另一个标签指向的内存位置偏移几个字节。 例如:如果 label1 指向内存位置 0x40h,有没有办法使用 label1 定义指向
我需要设置一些标签地址/偏移量的最高位。 我试过: 测试.nasm: BITS 32 dw mylabel | 0x8000 mylabel: dd 0 但是当我尝试组装它时,我得到: nasm -f
如果能向我解释以下使用 printf、使用 nasm 和 gcc 编译的示例中发生了什么,我将不胜感激。为什么“sud”只打印在屏幕上?我也不明白,当我将“push 'sud'”与“push 'sud
我是一名优秀的程序员,十分优秀!