我正在使用Intel Mac OS X 10.6.x上的C++应用程序.我有一个变量,它包含使用OpenGL调用glReadPixels获得的像素数据.我想使用x86_64汇编指令直接对像素数据执行一些操作.汇编程序在测试程序中运行良好,但是当我尝试在像素数据上使用它时,它只在像素数据变量指向的内存位置中得到零.我猜这是因为我试图直接从x86_64程序集访问视频内存.有没有办法直接从程序集访问x86_64视频内存?否则我该如何解决这种情况?
感谢任何指针.提前致谢.
请参阅下面的代码示例以翻转最后n个和前n个字节.相同的代码在测试程序中运行良好.
void Flip(void *b, unsigned int w, unsigned int h)
{
__asm {
mov r8, rdi //rdi b
mov r9, rsi //W
mov r10,rdx //H
mov r11, 0 // h <- 0
mov r12, 0 // w<- 0
outloop:
------------
.............
.............
}
Run Code Online (Sandbox Code Playgroud) 我想更好地了解堆栈和堆如何工作.在比较同一程序的32位和64位编译版本时,我遇到了麻烦.在这两种情况下,我都使用了一个来宾Fedora 15 VM(32和64),gcc用于编译,gdb用于调试,以及相同的主机硬件.有问题的程序非常简单,紧接着如下:
void function(int a, int b, int c, int d){
int value;
char buffer[10];
value = 1234;
buffer[0] = 'A';
}
int main(){
function(1, 2, 3, 4);
}
Run Code Online (Sandbox Code Playgroud)
为了空间的利益,我省略了程序的汇编转储; 但是,如果有人认为这可能有助于他们回答我的问题,我很乐意将其纳入其中.
参数4(0xbffff3e4),3(0xbffff3e0),2(0xbffff3dc)和1(0xbffff3d8)首先被压入堆栈.接下来的指令的位置以下的呼叫为函数() -或返回地址-被放置在堆(0x080483d1)上.接下来,前一个堆栈(0xbffff3e8)的基指针的值被推送到堆栈.
(gdb) x/16xw $esp
0xbffff3c0: 0x00000000 0x410759c3 0x4105d237 0x00000000
0xbffff3d0: 0xbffff3e8 0x080483d1 0x00000001 0x00000002//pointers
0xbffff3e0: 0x00000003 0x00000004 0x00000000 0x4105d413//followed by params
0xbffff3f0: 0x00000001 0xbffff484 0xbffff48c 0x41040fc4
Run Code Online (Sandbox Code Playgroud)
然而; 这里没有看到值4,3,2和1.我只能看到,无论我看到的堆栈多远,都是返回地址(0x4004ae)和先前堆栈帧的基指针(0x7fffffffe210).
(gdb) x/16xg $rsp
0x7fffffffe200: 0x00007fffffffe210 0x00000000004004ae //pointers
0x7fffffffe210: 0x0000000000000000 0x00000036d042139d
0x7fffffffe220: 0x0000000000000000 0x00007fffffffe2f8
0x7fffffffe230: …Run Code Online (Sandbox Code Playgroud) 我正在尝试编译一个C++程序,它给了我这个错误.
undefined reference to 'some_function'
Run Code Online (Sandbox Code Playgroud)
而我确实添加了包含some_function在makefile中的文件.另外,我some_function在我使用它的文件中包含声明.那么为什么编译器仍抱怨它无法找到呢?可能的原因是什么?
我的makefile就是这样的
CXX = g++
CXXFILES = dlmalloc.c pthreads.cpp queue.cpp
CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE
LIBS = -lpthread -ldl
all:
$(CXX) $(CXXFILES) $(LIBS) $(CXXFLAGS)
clean:
rm -f prog *.o
Run Code Online (Sandbox Code Playgroud)
some_function在dlmalloc.c内部定义并在内部使用pthreads.cpp.是否与dlmalloc.cC源代码文件有关,其他是C++文件.也许我应该在这里使用extern "C"关键字some_function,对吗?
我怎样才能做到这一点?如果结果将在e*x寄存器中,那将是最好的.
我正在尝试链接组装的单模块汇编语言程序yasm,我从以下错误中得到以下错误ld:
Undefined symbols for architecture x86_64:
"start", referenced from:
implicit entry/start for main executable
(maybe you meant: _start)
ld: symbol(s) not found for inferred architecture x86_64
Run Code Online (Sandbox Code Playgroud)
我实际上是半定期得到这个错误,所以我想这是一个相当普遍的问题,但不知怎的,似乎没有人有一个满意的答案.在有人说这是前一个问题的副本之前,是的,我知道.正如你可以看到类似标题问题的巨大文本墙,看到这是重复的,我也可以.
不适用于我的问题.我不是用C++编写的,并且在那个问题中给出的解决方案对于那种语言来说是特殊的.
也没有解决我的问题,因为我不是试图将多个目标文件链接在一起.
解决方案与高级语言中的特定框架有关.
解决方案涉及修复函数原型.由于明显的原因,这里不适用.
......你明白了.我能找到的每一个过去的问题都是通过一些不适用于我的情况的特殊方法来解决的.
请帮我解决一下这个.我已经厌倦了一次又一次地得到这个错误而无法对它做任何事情,因为它的记录很差.恕我直言世界迫切需要一个GNU Dev Tools等效的MS-DOS错误代码参考手册.
附加信息:
操作系统:Mac OS X El Capitain
来源清单:
segment .text
global _start
_start:
mov eax,1 ; 1 is the syscall number for exit
mov ebx,5 ; 5 is the value to return
int 0x80 ; execute a system …Run Code Online (Sandbox Code Playgroud) 你好我学校的每个人都必须在ASM [intel] [NASM]做我自己的strdup功能.
我有一个奇怪的问题......
在我的代码中,如果我 call _malloc
我的代码段错误与此错误:
Program received signal SIGSEGV, Segmentation fault.
0x00007fff849612da in stack_not_16_byte_aligned_error () from /usr/lib/system/libdyld.dylib
Run Code Online (Sandbox Code Playgroud)
我不明白为什么,因为在.text中我说过 extern _malloc
有人知道我为什么会犯这个错误?:)
这是我的代码:
section .text
global _ft_strdup
extern _strlen
extern _malloc
; extern _ft_memcpy
_ft_strdup:
call _strlen ;rax = len of str
mov r8, rdi ;r8 = str = src
inc rax ;rax++
; mov r9, rax ;len of dest with '\0'
mov rdi, rax ;to send the len for malloc
call _malloc ;rax = ptr of dest …Run Code Online (Sandbox Code Playgroud) 本简介中有一个示例代码,如下所示:
; Sample x64 Assembly Program
; Chris Lomont 2009 www.lomont.org
extrn ExitProcess: PROC ; external functions in system libraries
extrn MessageBoxA: PROC
.data
caption db '64-bit hello!', 0
message db 'Hello World!', 0
.code
Start PROC
sub rsp,28h ; shadow space, aligns stack
mov rcx, 0 ; hWnd = HWND_DESKTOP
lea rdx, message ; LPCSTR lpText
lea r8, caption ; LPCSTR lpCaption
mov r9d, 0 ; uType = MB_OK
call MessageBoxA ; call MessageBox API function
mov ecx, …Run Code Online (Sandbox Code Playgroud) MOVHPD将xmm寄存器的高位四字提取到内存中。
PEXTRQ提取xmm寄存器的高位四字并将其放入整数寄存器(仅整数)。
SHUFPD随机播放。
VPSLLDQ使高位四字清零。
是否有指令将浮点值从xmm寄存器的高位四字移动到同一xmm寄存器或另一个xmm寄存器的低位四字?还是我总是必须经过内存(添加额外的周期)?
更新:根据以下@fuz和@Peter Cordes的评论,这是我所做的。这将分别为xmm0的上下四位数调用舍入函数;由于特殊的舍入参数,必须为每个qword分别调用该函数,因此它不能是SIMD指令。目标是将xmm0中的每个qword取整并将结果放入xmm11中。
movapd xmm2,xmm0 ;preserve both qwords of xmm0
call Round
movsd [scratch_register+0],xmm0 ; write low qword to memory
movhlps xmm0,xmm2
call Round
movsd [scratch_register+8],xmm0 ; write low qword to memory
movupd xmm11,[scratch_register]
Run Code Online (Sandbox Code Playgroud)
更新#2:@Peter Cordes显示了如何在没有内存的情况下执行此操作:
movhlps xmm2, xmm0 ; extract high qword for later
call Round ; round the low qword
movaps xmm3, xmm0 ; save the result
movaps xmm0, xmm2 ; set up the arg
call Round ; round the high qword
movlhps xmm3, …Run Code Online (Sandbox Code Playgroud) 我有2个(strcpy)函数的源代码,我想知道哪一个更快,性能更高...
unsigned
strcpy(const char * str, char * des) {
register const char * ptr = str;
while ((*des = *str)) {
str++;
des++;
}
return (str - ptr);
}
unsigned
strcpy2(const char * str, char * des) {
register unsigned i = 0;
while ((des[i] = str[i])) i++;
return i;
}
Run Code Online (Sandbox Code Playgroud)
第一个使用str和des地址,第二个使用索引...第一个使用多余的(++),因此在第一眼看来,由于执行了额外的操作(++),第一个功能的性能低于第二个)中的每个字符,但是当我在GCC中使用(-O3)优化时,结果(汇编代码)告诉我其他信息(第一个strcpy具有更高的性能和更少的动作)
strcpy:
movzbl (%rdi), %eax
movb %al, (%rsi)
testb %al, %al
je .L4
movq %rdi, %rax
.L3:
movzbl 1(%rax), %edx
addq $1, %rax
addq $1, %rsi
movb %dl, …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用跳转表在程序集(MASM64,Windows,x64)中实现算法。基本思想是:我需要对数据进行3种不同类型的操作。这些操作取决于一些变量,但是我发现实现许多切换和许多长的实现很乏味。
PUBLIC superFunc@@40 ;__vectorcall decoration
.DATA
ALIGN 16
jumpTable1 qword func_11, func_12, func_13, func_14
jumpTable2 qword func_21, func_22, func_23, func_24
jumpTable3 qword func_31, func_32, func_33, func_34
.CODE
superFunc@@40 PROC
;no stack actions, as we should do our stuff as a leaf function
;assume the first parameter (rcx) is our jumpTable index, and it's
;the same index for all functions
mov rax, qword ptr [rcx*8 + offset jumpTable1]
mov r10, qword ptr [rcx*8 + offset jumpTable2]
mov r11, qword ptr [rcx*8 …Run Code Online (Sandbox Code Playgroud)