什么是堆栈框架的结构,以及如何在调用汇编函数时使用?
有谁知道任何好的工具(我主要是在寻找IDE)在Mac上编写程序集… Xcode对我来说有点麻烦。 另外,在Intel Mac上,我可以使用通用x86 asm吗? 或者是否有修改的指令集? 有关后英特尔的任何信息 另外:我知道在windows上,asm可以在由OS创build的模拟环境中运行,让代码认为它在自己的专用计算机上运行… OSX是否提供相同的function?
例如,用BIOS打印到屏幕main.asm的引导扇区: org 0x7c00 bits 16 cli mov ax, 0x0E61 int 0x10 hlt times 510 – ($-$$) db 0 dw 0xaa55 然后: nasm -o main.img main.asm qemu-system-i386 -hda main.img -S -s & gdb -ex 'target remote localhost:1234' \ -ex 'break *0x7c00' \ -ex 'continue' \ -ex 'x/3i $pc' 我得到: 0x7c00: cli 0x7c01: mov $0x10cd0e61,%eax 0x7c06: hlt […]
我正在研究execve shellcode, 操作系统:Linux bt 2.6.39.4 root @ bt:〜/ exploit#cat gshell.s .globl _start _start: nop jmp MyString shell: popl %esi xorl %eax,%eax movl %al,9(%esi) movl %esi,10(%esi) movl %eax,14(%esi) movb $11,%al movl %esi, %ebx leal 0xa(%esi),%ecx leal 0xe(%esi),%edx int $0x80 movl $1,%eax movl $0,%ebx int $0x80 MyString: call shell shellvar: .ascii "/bin/bashADDDDCCCC" root @ bt:〜/ exploit#as -gstabs […]
单个进程中的两个不同的线程可以通过读取和/或写入共享一个共同的内存位置。 通常,这种(有意的)共享是通过使用x86上的lock前缀的primefaces操作来实现的,这对于lock前缀本身(即,无争议的成本)具有相当公知的成本,并且当高速caching行实际上具有额外的一致性成本共享 (真实或虚假分享)。 在这里,我感兴趣的是单线程P写入内存位置的产生消费者成本,另一个线程`C从内存位置读取,都使用普通读写。 在同一个套接字的不同内核上执行这种操作时的延迟和吞吐量是多less,而在最近的x86内核上的同一个物理内核上的同级超线程上执行时,则是如此。 在标题中,我使用的术语“超级同胞”是指在同一个内核的两个逻辑线程上运行的两个线程,而内核之间的同级是指在不同的物理内核上运行的两个线程的更常见的情况。
在x86 CPU上将浮点数转换为int最快的方法是什么? 对于以下的任何组合,最好用C语言或汇编(可以用C语言表示): 32/64/80位浮点 – > 32/64位整数 我正在寻找一些比编译器更快的技术。
什么是改变IEEE 754浮点数舍入模式的最有效的方法? 一个可移植的C函数将会很好,但是使用x86汇编的解决scheme也可以。 *我指的是朝向最近,朝向零,朝向正/负无穷的标准舍入模式
compare函数是一个函数,它接受两个参数a和b并返回一个描述其顺序的整数。 如果a小于b ,结果是一些负整数。 如果a大于b ,结果是一些正整数。 否则, a和b相等,结果为零。 这个函数经常被用来参数化从标准库中sorting和searchalgorithm。 实现字符的comparefunction非常简单, 你简单地减去参数: int compare_char(char a, char b) { return a – b; } 这是有效的,因为两个字符之间的差异通常被假定为适合一个整数。 (注意,这个假设对于sizeof(char) == sizeof(int) )的系统来说并不适用。 这个技巧不能用来比较整数,因为两个整数之间的差别通常不适合整数。 例如, INT_MAX – (-1) = INT_MIN表明INT_MAX小于-1 (从技术上说,溢出会导致未定义的行为,但假设模运算)。 那么我们怎样才能有效地实现比较函数的整数? 这是我第一次尝试: int compare_int(int a, int b) { int temp; int result; __asm__ __volatile__ ( "cmp %3, %2 \n\t" "mov $0, […]
这是一个有点低级的问题。 在x86汇编中有两个SSE指令: MOVDQA xmmi, m128 和 MOVNTDQA xmmi, m128 IA-32软件开发者手册说MOVNTDQA中的NT代表Non-Temporal ,否则它与MOVDQA相同。 我的问题是, Non-Temporal是什么意思?
我已经被告知并且从英特尔的手册中读到了可以将指令写入存储器,但是指令预取队列已经提取了陈旧的指令并且将执行那些旧的指令。 我一直没有注意到这种行为。 我的方法如下。 英特尔软件开发手册从第11.6节中指出 对当前在处理器中caching的代码段中的存储单元的写入导致相关联的一个或多个caching行失效。 这个检查是基于指令的物理地址。 此外,P6系列和奔腾处理器会检查写入代码段是否可以修改已被预取执行的指令。 如果写入影响预取的指令,则预取队列失效。 后面的检查是基于指令的线性地址。 所以,看起来如果我希望执行陈旧的指令,我需要有两个不同的线性地址引用同一个物理页面。 所以,我把内存映射到两个不同的地址。 int fd = open("code_area", O_RDWR | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO); assert(fd>=0); write(fd, zeros, 0x1000); uint8_t *a1 = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_FILE | MAP_SHARED, fd, 0); uint8_t *a2 = mmap(NULL, 0x1000, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_FILE | MAP_SHARED, […]