我是Linux (x86_64)中的新程序集编程,我想确保我正在以正确的方式进行编程。我编写了一个程序,它只从用户那里获取一个输入,然后将他的输入写到stdout。
SYS_WRITE equ 1 ; write text to stdout
SYS_READ equ 0 ; read text from stdin
SYS_EXIT equ 60 ; terminate the program
STDOUT equ 1 ; stdout
section .bss
uinput resb 24 ; 24 bytes for user string
u
我试图在linux上的nasm程序集中打印一个个位数整数。我目前拥有的编译很好,但是没有任何东西被写到屏幕上。有人能向我解释我在这里做错了什么吗?
section .text
global _start
_start:
mov ecx, 1 ; stores 1 in rcx
add edx, ecx ; stores ecx in edx
add edx, 30h ; gets the ascii value in edx
mov ecx, edx ; ascii value is now
我想在NASM(Linux)中添加两位数字.要添加两个简单数字,我使用以下代码:
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov eax,'3'
sub eax, '0'
mov ebx, '4'
sub ebx, '0'
add eax, ebx
add eax, '0&
当然,MOV“移动”(实际上是复制的)某物,但如何?它是将源的实际值放入目的地,还是放置某种地址。
当我在Jeff介绍的汇编书中看到他正在使用Linux的中断80h时,我就想到了这个问题:
mov eax,4 ; Specify sys_write call
mov ebx,1 ; Specify File Descriptor 1: Standard output
mov ecx,Buff ; Pass address of the character to write
mov edx,1 ; Pass number of chars to write
int 80h
我正在使用sys_open和sys_write打开一个现有的文件以写入其中。当我创建一个新文件时,sys_write可以正常工作,如下所示。但是如果我使用sys_open,返回值是负的(-13,表示“权限被拒绝”),并且写操作(当然)不起作用。 这是可行的: section .data
File_Name: db '/opt/Test_Output_Files/Linux_File_Test',0
File_Mode: dq 754q
Write_Buffer: db 'This is what I want to write',0
section .tex
我的程式码是有效的,但输出并不仅仅是正确的,因为当我输入名称时,输出会变成这样:“您的会员名称是什么?欢迎您加入俱乐部,Bob!“……”在名字的末尾。我做错了什么?
这是我的汇编代码:
section .data
prompt: db "What is your member name? "
prompt_len: equ $-prompt
greet1: db "Welcome to the club, "
greet1_len: equ $-greet1
greet2: d
我正在学习一些在Linux上使用NASM的基本算术。我需要使用变量NUMBER1和NUMBER2将两个数字相除。如果我输入的是实际值而不是变量,我的代码就能正常工作。例如,如果我输入'6‘而不是NUMBER2,输入'2’而不是NUMBER1,程序会做除法运算,并给出3的答案。用变量运行代码会产生浮动异常(核心转储)。请解释一下在这段代码中如何正确使用变量?调试时,我发现问题出在DIV行。谢谢!
section .text
global main ;must be declared for using gcc
main: ;tell linker entry point
m
如何在下面的代码中测试以确保只输入一个整数,并确保输入长度为5字节或更少?
我试图了解如何正确地控制输入,以便在程序退出时,不将超过5个字节的输入输出到终端。
此外,我如何测试以确保只输入一个字符串,最后在最后一个场景中只输入一个double?
*基于x82和Peter指南的更新代码。我做了一些C处理,并能够修改我的原始代码如下。它仍然有一些缺陷,但你们都是一个很大的帮助!我只是停留在超过5个整数字节的输入上,它不会像输入字符数据时那样重新提示符,因为它继续将额外的字节数据转储到tty。
SECTION .data ; initialized data se
下面是C++文件中的main.cpp代码。
int add(int a,int b)
{
int c = a + b;
return c;
}
int main()
{
int a = 2;
int b = 4;
int d = add(2,4);
}
当我运行g++ -S main.cpp时,我得到了以下程序集代码(在删除所有调试符号之后)。另外,我还修改了代码,以使用sys_write系统调用打印两个数字的和。
.text
.globl _Z3addii
_Z3addii:
pushq %rbp
movq %rsp, %rbp
mov
你能帮我查一下这个密码吗。在执行时,程序将连续打印Hello,并且不会退出。我也想在C程序中使用这段代码作为外壳代码,因此我还没有在数据部分中定义Hello字符串。请告诉我问题在哪里。
SECTION .text ; Code section
global _start ; Make label available to linker
_start: ; Standard ld entry point
jmp callback ; Jump to the end to get our current address
dowo
我需要帮助。我试图在SASM中运行下面的程序(NASM)。
SYS_EXIT equ 1
SYS_READ equ 3
SYS_WRITE equ 4
STDIN equ 0
STDOUT equ 1
segment .data
msg1 db "Enter a digit ", 0xA,0xD
len1 equ $- msg1
msg2 db "Please enter a second digit", 0xA,0xD
len2 equ $- msg2
msg3 db "The sum
您好,我是一个非常新手的汇编,我目前正在尝试使我自己的计算器。我想出了如何进行操作,它似乎是有效的,但我对代码的"resultat“部分有一些问题。
根据我选择的操作,输出是不一样的,我真的不明白为什么。
如果我选择做加法,它将输出结果,但不是我想要的短语"le result to est:“如果我选择平方根(Sqrt),它将不会输出任何东西。
我试着调试它,但我真的不擅长它,我不明白为什么它不能工作。我真的不知道代码的哪一部分造成了这种混乱,所以我将整个代码链接起来,抱歉。
我真的很好奇为什么它不能工作,如果你有让我的代码更好的一般技巧,我也很高兴阅读它们。
SYS_WRIT
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov edx, len ;message length
mov ecx, msg ;message to write
mov ebx, 1 ;file descriptor (stdout)
mov eax, 4 ;system call number (sys_write)
i