Linux NASM中的增量循环
我在尝试使此汇编代码正常工作时遇到问题:Linux NASM中的增量循环,linux,assembly,nasm,x86-64,Linux,Assembly,Nasm,X86 64,我在尝试使此汇编代码正常工作时遇到问题: section .text global _start _start: loop: mov rax, 4 mov rdi, 1 add rsi, 1 mov rdx, 1 syscall cmp rsi,11 jne loop exit: mov rax,60 xor rdi,rdi syscall 此代码的目的是增加rsi寄存器中的值,并将其值打印10倍。
section .text
global _start
_start:
loop:
mov rax, 4
mov rdi, 1
add rsi, 1
mov rdx, 1
syscall
cmp rsi,11
jne loop
exit:
mov rax,60
xor rdi,rdi
syscall
此代码的目的是增加rsi寄存器中的值,并将其值打印10倍。它是在Linux x86_64机器上用NASM编写的 您的答案有多处错误,首先是系统调用号码。您将值4放在rax中,但对于x86_64 linux,sys_write的值为1 其次,您的参数有问题,对sys_write的调用如下,sys_writeunsigned int fd,const char*buf,size_t count,其中rdi是fd,rsi是buf,rdx是count。调用的问题是,您将rsi作为文本值1,这使linux转到地址0x1以查找明显无效的要打印的内容 考虑以下示例,以获得打印数字“1”和换行符的有效方法
section .data
myNum: db '1', 0xA
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, myNum
mov rdx, 2
syscall
mov rax, 60
mov rdi, 0
syscall
如果你要否决投票,请解释你认为答案有什么问题,只是按下否决投票按钮对任何人都没有帮助你的答案有很多问题,首先是系统呼叫号码。您将值4放在rax中,但对于x86_64 linux,sys_write的值为1 其次,您的参数有问题,对sys_write的调用如下,sys_writeunsigned int fd,const char*buf,size_t count,其中rdi是fd,rsi是buf,rdx是count。调用的问题是,您将rsi作为文本值1,这使linux转到地址0x1以查找明显无效的要打印的内容 考虑以下示例,以获得打印数字“1”和换行符的有效方法
section .data
myNum: db '1', 0xA
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, myNum
mov rdx, 2
syscall
mov rax, 60
mov rdi, 0
syscall
如果你要否决投票,请解释你认为答案有什么错误,只需点击否决投票按钮对任何人都没有帮助打印其值是什么意思,linux操作系统没有打印整数服务,值1不是可打印字符,对于常见的linux服务sys_write,您必须提供指向字符的指针,而不是字符本身。您是否可以展示一些至少打印一次值的示例,以您想要的方式打印,然后解释循环应该做什么?可能从一些正在工作的hello world示例开始,并在调试器中检查它,它是如何工作的?参数值是什么?您还可以使用strace工具查看代码提供的参数。rax=4服务是sys_stat,调用它没有任何意义,如果您想打印出一些内容,因为sys_stat将收集有关文件的信息,它不会在任何地方打印任何内容。打印出其值是什么意思,linux操作系统没有打印整数服务,值1不是可打印字符,对于常见的linux服务sys_write,您必须提供指向字符的指针,而不是字符本身。您是否可以展示一些至少打印一次值的示例,以您想要的方式打印,然后解释循环应该做什么?可能从一些正在工作的hello world示例开始,并在调试器中检查它,它是如何工作的?参数值是什么?您还可以使用strace工具查看您的代码提供了哪些参数。rax=4服务是sys_stat,调用它没有任何意义,如果您想打印一些内容,因为sys_stat将收集有关文件的信息,它不会在任何地方打印任何内容。