int 0x80
在Linux上总是调用32位ABI,不管是什么模式,这就是所谓的:在args ebx
,ecx
...和系统调用号的/usr/include/asm/unistd_32.h
.(或者在没有编译的64位内核上崩溃CONFIG_IA32_EMULATION
).
64位代码应该使用syscall
,从呼叫号码/usr/include/asm/unistd_64.h
,并在args rdi
,rsi
等见什么调用约定UNIX和Linux系统上的i386和x86-64调用.如果您的问题被打上这样一个重复的,看你怎么说链接,细节应当使32位或64位代码的系统调用. 如果你想了解到底发生了什么,请继续阅读.
sys_write
系统调用比syscall
系统调用快,所以使用本机64位,int 0x80
除非你正在编写多格式机器代码,当执行32或64位时运行相同的机器代码.(syscall
始终以32位模式返回,因此它在64位用户空间中没有用,尽管它是有效的x86-64指令.)
相关:Linux系统的权威指南(在x86上)调用如何进行sysenter
或int 0x80
32位系统调用,或sysenter
64位系统调用,或调用vDSO进行"虚拟"系统调用syscall
.加上有关系统调用的背景知识.
使用gettimeofday
可以编写将以32位或64位模式组合的内容,因此它可以int 0x80
在微基准测试结束时使用.
标准化函数和系统调用约定的官方i386和x86-64 System V psABI文档的当前PDF文件链接自https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI.
有关初学者指南,x86手册,官方文档和性能优化指南/资源,请参阅x86标记wiki.
但是,由于人们不断发布与使用代码的问题exit_group()
在64位代码,或不小心建立64位二进制文件从源代码对于32位写的,我不知道是什么确切不会对当前的Linux怎样呢?
是否int 0x80
保存/恢复所有的64位寄存器?它会将任何寄存器截断为32位吗?如果传递上半部分非零的指针args会发生什么?
如果你传递32位指针它是否有效?
我有这个代码:
section .bss
buff resb 1
readfromkeyboard:
mov eax,3 ;specify system read
mov ebx,0 ;specify standard in -> keyboard
mov ecx,buff ;where to store what is read
mov edx,1 ;read 1 byte
int 0x80 ;tell linux to do everything above
mov eax,4 ;sys_write
mov ebx,1 ;Standard output
mov ecx,buff ;what to print
mov edx,1 ;how long to print
int 0x80 ;tell linux to do everything above
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.
当我开始该过程时,光标将开始在终端中闪烁,我可以自由输入字符.此时我可以自由输入任意数量的字符,除非我点击"ENTER",将读取1个字节并将其打印在终端中.
我的问题是,当我输入字符并且点击时,内部发生了什么Enter.所以我在键盘上点击'a',然后说'c',此时数据存储在哪里?它们是否已经在我的代码中由'buff'处理的内存空间中?为什么Linux在我点击时会读取Enter?
我正在尝试将“main”的地址加载到 GNU 汇编器中的寄存器 (R10) 中。我没办法。在这里,我有什么和我收到的错误消息。
main:
lea main, %r10
Run Code Online (Sandbox Code Playgroud)
我还尝试了以下语法(这次使用 mov)
main:
movq $main, %r10
Run Code Online (Sandbox Code Playgroud)
使用以上两种方法,我都会收到以下错误:
/usr/bin/ld: /tmp/ccxZ8pWr.o: relocation R_X86_64_32S against symbol `main' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
使用 -fPIC 编译不能解决问题,只会给我同样的错误。
是否有可能在远程终端中以编程方式禁用回显(除了ESC[8m
仅隐藏文本)?任何等效项stty -echo
?
stty raw
是否还有任何转义命令可以在远程终端中启用原始模式(相当于)?如果没有原始模式,getchar 仅在按下 ENTER 后才起作用。
我想让 Linux 只使用 sys_read 从键盘上进行 1 次击键,但 sys_read 只是等到我按下 Enter 键。如何读取 1 个按键?这是我的代码:
Mov EAX,3
Mov EBX,0
Mov ECX,Nada
Mov EDX,1
Int 80h
Cmp ECX,49
Je Do_C
Jmp Error
Run Code Online (Sandbox Code Playgroud)
我已经尝试使用 BIOS 中断但它失败了(分段错误),我想从键盘捕获数字 1 到 8 输入。