在32位中,有一个叫做socketcall的系统调用,它是套接字系统调用的公共内核入口点。 但是,在64位模式下,我似乎无法find相应的系统调用。 有没有类似的系统调用,我可以使用具有相同的function?
我想知道,如何在Linux中使用syscalls在nasm中打印浮点数。 我有以下代码,但它只打印@ section .data num dq 2.0 len equ $ – num section .text global _start _start: mov edx, len mov ecx, num mov ebx, 1 mov eax, 4 int 80h mov eax, 1 int 80h 谁来正确?
嗨,我需要帮助显示寄存器的内容。我的代码是below.i已经能够显示数据寄存器的值,但我想显示标志状态。 例如1或0.如果还显示其他寄存器的内容,如esi,ebp,这将是有帮助的。 我的代码是不打印标志的状态..我失去了什么 section .text global _start ;must be declared for using gcc _start : ;tell linker entry point mov eax,msg ; moves message "rubi" to eax register mov [reg],eax ; moves message from eax to reg variable mov edx, 8 ;message length mov ecx, [reg];message to write mov ebx, 1 ;file descriptor (stdout) mov […]
我在汇编中做了自己的strlen实现,但是它没有返回正确的值。 它返回string长度+4。 我不明白为什么..我希望你们中的任何一个做… 大会来源: section .text [GLOBAL stringlen:] ; C function stringlen: push ebp mov ebp, esp ; setup the stack frame mov ecx, [ebp+8] xor eax, eax ; loop counter startLoop: xor edx, edx mov edx, [ecx+eax] inc eax cmp edx, 0x0 ; null byte jne startLoop end: pop ebp ret 而主要的例程: #include <stdio.h> […]
我有这个源代码: ; hello.asm a first program for nasm for Linux, Intel, gcc ; ; assemble: nasm -f elf -l hello.lst hello.asm ; link: gcc -o hello hello.o ; run: hello ; output is: Hello World SECTION .data ; data section msg: db "Hello World",10 ; the string to print, 10=cr len: equ $-msg ; "$" […]
根据fgets()的文档 ,该函数有三个参数: char * – 一个将保存input的string int – 一个表示要读取的最大字符数的整数 文件* – FILE *到要读取的stream 调用这个函数我没有任何困难。 我只是把这三个参数推到堆栈上,调用函数,并将ESP增加12。 我的问题是参数#3。 FILE *作为标准input应该传入什么内容? 在C中,我只能使用stdin ,但是我不知道x86汇编中的等价物是什么。 更新:我在Linux上使用NASM。
我试图进入一些Linux 64位x86程序集,而不使用标准的库,但是我有一些问题处理提交给我的程序(argv)的参数。 我会认为(基于文档) rsp标志着argc qword的开始,而[rsp + 8]将是argv。 不幸的是,情况并非如此,下面的(删节的)程序会导致EFAULT (Bad address) 。 sys_execve equ 59 sys_exit equ 60 section .data child db "/bin/sh", 0 global _start section .text _start: mov rdi, child ; #1 filename mov rsi, [rsp + 8] ; #2 argv mov rdx, 0 ; #3 envp = 0 mov rax, sys_execve ; execve […]
我试图调查大会定义标签之间的差异,这里是一个例子 ALabel: db 'Testing' AAnotherLabel: dw 'Testing' 现在,让我加载到一个32位寄存器: mov eax, [ALabel] mov ebx, [AAnotherLabel] 经过gdb的调查,我发现eax和ebx的所有子寄存器都包含相同的值,请看这里: info register eax 0x64636261 //dcba info register ebx 0x64636261 //dcba 他们是一样的! 在Jeff Duntemann的书中(汇编语言使用Linux进行分步编程),他给出了一个单词和双字进入寄存器的例子,但由于某种原因加载了偏移量(即像这样的值的地址) DoubleString: dd 'Stop' mov edx, DoubleString 对edx内容的调查显示,它包含一个地址,可能是string中前四个字母的地址,与第一个地址相同,尽pipe我在这里进行了推测。 我想澄清在这里真正发生了什么,并且这个声明实际上是将string中第一个字母的地址加载到一个寄存器中: Fin: db 'Final' mov ecx, Fin
对于我需要创build简单的shellcode的任务,但不允许它包含\ x80。 注意:要在linux上进行系统调用,比如写或者退出,你需要包括这行: int 0x80 ,最后会产生包含\ x80的shellcode。 不过,我需要进行系统调用,所以现在我的想法是使用一个variables作为中断向量编号。 例如0x40,然后将它乘以2,所以最后在shellcode中会有一个\ x40而不是\ x80。 问题是int不是把一个variables作为参数,我试过这个testing: section .data nr db 0x80 section .text global _start _start: xor eax, eax inc eax xor ebx, ebx mov ebx, 0x1 int [nr] 得到 错误:操作码和操作数无效组合 我怎么能让我的想法工作? 或者你有不同的解决scheme? PS。 sysenter和系统调用不起作用 – >非法指令 我在x86-32bit机器上使用nasm。
我正在用汇编语言编写一个计算器,以在x86处理器上执行。 基本上,我的计算器要求用户input两个数字,然后指出哪个操作(加法,减法,乘法和除法)要与他们做。 我的计算器加减乘法正确但无法分割 。 在划分时,我总是得到1。 然后我离开我的应用程序代码完成: section .data ; Messages msg1 db 10,'-Calculator-',10,0 lmsg1 equ $ – msg1 msg2 db 10,'Number 1: ',0 lmsg2 equ $ – msg2 msg3 db 'Number 2: ',0 lmsg3 equ $ – msg3 msg4 db 10,'1. Add',10,0 lmsg4 equ $ – msg4 msg5 db '2. Subtract',10,0 lmsg5 equ $ – […]