Articles of 程序集

memcpy在linux中移动128位

我正在为Linux设备编写一个设备驱动程序。 该设备驱动程序执行多个读写操作来testing吞吐量。 当我使用memcpy时, TLP的最大有效载荷是8字节(在64位体系结构上)。 在我看来,获得16字节有效载荷的唯一方法是使用SSE指令集。 我已经看到这个,但代码不能编译(AT&T / Intel语法问题)。 有一种方法可以使用Linux内的代码? 有谁知道在哪里可以find一个移动128位的memcpy的实现?

Linux内核systemcall调用一个“int 0x80”

我正在学习Linux内核,目前我尝试实现自己的系统调用。 在内核代码中看起来如下: asmlinkage long sys_my_syscall() { printk("My system call\n"); return 0; } 如果我用systemcall()函数调用它,它可以正常工作,但我发现另一种方法: int my_syscall(void) { long __res; __asm__ volatile ( "movl $312, %%eax;" "int $0x80;" "movl %%eax, %0;" : "=m" (__res) : : "%eax" ); if ((unsigned long) (__res) >= (unsigned long) (-125)) { errno = -(__res); __res = -1; } return (int)(__res); } […]

有没有办法在运行时修改Linux C程序中的函数的代码?

简单来说,我们有两个相似的function: void f1() { printf("%d", 123); } void f2() { printf("%d", 124); } 现在我们在main调用f1,它打印123.编译时, f1的反汇编可能是这样的: 08048424 <f1>: 8048424: 55 push %ebp 8048425: 89 e5 mov %esp,%ebp 8048427: 83 ec 18 sub $0x18,%esp 804842a: b8 40 86 04 08 mov $0x8048640,%eax 804842f: c7 44 24 04 7b 00 00 movl $0x7b,0x4(%esp) 8048436: 00 8048437: 89 04 […]

linux nasm将AL中的值移至AX

我正在打印多个数字整数的方式,将整数除以10,然后收集剩下的部分,然后打印出来。 这是一个有问题的代码段: 划分: ; initial division mov ax, 111 ; number we want to print mov ch, 10 ; we divide by ten to siphon digits div ch ; divide our number by 10 ; al now has 11, ah has 1 mov dh, ah ; save the remainder in dh 1 mov bx, al […]

Linux X86-64汇编和printf

我正在阅读一些Linux程序集手册,并发现使用printf()函数的想法。 我需要它为了debugging的原因以二进制forms输出寄存器值到terminal,但现在我试图简单地用文本来testing该function。 我卡住了,因为segfault,当我使用pushq而不是pushl。 我怎样才能改变这个程序输出string和二进制forms的寄存器? .data input_prompt: .string "Hello, world!" printf_format: .string "%5d " printf_newline: .string "\n" size: .long 0 .text .globl main main: pushq $input_prompt call printf movl $0, %eax ret 它由GCC编译为: gcc tmp.S -o tmp

Linux x64:为什么r10在系统调用之前是r8和r9?

我决定在前一天在大会上采取一些措施,我一直在玩真正基本的东西,比如从argv到stdout的打印。 我发现了这个带有参数和所有内容的linux系统调用号码列表 ,我很好奇为什么在r8和r9之前使用r10参数。 我发现了什么可以用什么什么什么什么的时候,像循环计数器在rcx各种古怪的约定。 是否有一个特别的原因,为什么r10被提升? 更方便吗? 我可能也应该提到我对这个好奇心感兴趣,而不是因为它导致我的问题。 编辑:我发现这个问题得到了closures,引用x64 ABI文档在页面124,它注意到用户级应用程序使用rdi, rsi, rdx, rcx, r8, r9 。 另一方面,内核使用r10而不是rcx ,并破坏rcx和r11 。 这可能解释了r10如何在那里结束,但为什么它交换?

Linux内核中使用扩展指令集(SSE,MMX)吗?

那么,他们带来(至less应该带来)性能的大幅提高,不是吗? 所以,我还没有看到任何Linux内核源代码,但是我很想问:它们是用什么方式? (在这种情况下 – 对于没有这种指令的系统,必须有一些特殊的“代码上限”)?

x86-64 AMD上的CALL指令的操作数生成

以下是一个示例程序的objdump的输出, 080483b4 <display>: 80483b4: 55 push %ebp 80483b5: 89 e5 mov %esp,%ebp 80483b7: 83 ec 18 sub $0x18,%esp 80483ba: 8b 45 0c mov 0xc(%ebp),%eax 80483bd: 89 44 24 04 mov %eax,0x4(%esp) 80483c1: 8d 45 fe lea 0xfffffffe(%ebp),%eax 80483c4: 89 04 24 mov %eax,(%esp) 80483c7: e8 ec fe ff ff call 80482b8 <strcpy@plt> 80483cc: 8b 45 […]

linux nasm程序集在terminal清除屏幕

有没有办法用nasm清除terminal窗口中的屏幕? 清除屏幕,我的意思是模拟Ctrl-L热键。 删除窗口中的所有文本。 这是可能做在nasm大会? 提前致谢, Rileyh

如何在linux x86_64上模拟一个iret

我正在写一个基于Intel VT的debugging器。 由于在NMI-Exiting = 1时,virex指令在vmx-guest中的性能发生了改变。 所以我应该自己处理vmx-host中的NMI,否则guest将会有nmi可重入的bug。 我查了英特尔手册: 当NMI中断处理程序正在执行时,处理器会禁用对NMI处理程序的额外调用,直到执行下一个IRET指令为止。 这种对后续NMI的阻塞防止了对NMI处理程序的调用。 所以我试图在vmx-host里模拟一个iret。 CPL保持ring0并保持堆栈和代码段不变。 我在下面写了一个示例代码,它是在NMI引起的vmx-exit之后: asm volatile( "pushfq \n\t" "mov %%cs.%%ax \n\t" "push %%rax\n\t" "mov $._restart_code,%%rax \n\t" "push %%rax \n\t" "iret \n\t"/*manully iret in the host before vmx-entry.*/ "._restart_code:" "nop":); 任何人都可以展示一些指南