CUDA纹理的不同寻址模式
我正在使用边框地址模式(cudaAddressModeBorder)中使用CUDA纹理.我正在使用tex2D()读取纹理坐标.当纹理坐在纹理之外时,tex2D()返回0. 如何将此返回的边界值从0更改为其他东西?我可以手动检查纹理坐标,并自己设置边框价值.我想知道是否有CUDA API可以设置如此边界价值. 解决方案 如Sgarizvi所述,CUDA仅支持四种,不可固定的地址模式,即, clamp , border> border>, wrap 和镜子,在第3.2.11.1节中进行了描述. CUDA编程指南. 前两个在未归一化和归一化坐标中的工作,而后两个仅在归一化坐标中. 为了简单起见,要描述前两个,让我们考虑未归一化的坐标案例,并考虑1D信号.在这种情况下,输入序列为c[k],k=0,...,M-1. cudaaddressmodeclamp 信号c[k]在k=0,...,M-1外部继续进行,因此c[k] = c[0]
12 2024-04-02
编程技术问答社区
asm编译问题
:96: Error: `(%rax,%edx,4)' is not a valid base/index expression :97: Error: `-4(%rax,%edx,4)' is not a valid base/index expression 101: Error: `(%rax,%edx,4)' is not a valid base/index expression 102: Error: `-4(%rax,%edx,4)' is not a valid base/index expression 我收到这些错误消息不确定如何修复这是我的代码 "movl $0, %6\n" line96 "start: \n\t" line97 "movl (%1,%3,4),%4\n\t" "movl
10 2024-03-17
编程技术问答社区
我如何使用地址中的变量值来访问一个变量数据,如[ var_+[second_byte]]?
我得到了此代码: BITS 16 data: bytemap: db 0x0, 0x1, 0x4; pixel_x: db 2; to return the 0x4 value main: ; code... mov al, [bytemap+[pixel_x]]; i need that byte in al register ; more code... jmp main; 但是nasm返回"表达语法错误",我尝试使用mov bl, [pixel_x]; mov al, [bytemap+bl],但是不起作用,如何正确执行操作? (如果存在)... 解决方案 您需要在解决模式的情况下使用指针width寄存器. X86没有内存 - 纵向地址模式,而只有寄存器 - 内向. 参考记忆位置的内容. (x86地址模式).您可以在一个指令中可以做的事情的限制来自机器代码可以代表的.汇编器不是编译器;每行必须用作单个机
10 2024-03-17
编程技术问答社区
这段汇编代码是无效的吗?
我试图弄清楚以下组件代码是否无效. movb $0xF, (%bl) 它无效吗?如果是这样,为什么?谢谢. 解决方案 您不说什么处理器. bl至少在x86处理器中是8位寄存器,但不能用于解决. 为什么这是无效的指令?好吧,组装指令无效的原因是,给定处理器没有这样的说明.没有可能的方法来编码此说明.在这种情况下(假设X86),使用bl或任何其他8位登记册都不被认为是必需的.在16位代码中,只有16位寄存器bx,bp,si和di可用于内存地址. 编辑:在at&t语法中movb中的字母b定义了它处理8位操作数. 要获得或多或少的目标(要使用bl进行解决),您可以执行其中之一(其中一种是Intel Yasm/NASM语法,MASM风格的组装程序,包括GNU .intel_syntax noprefix WANT byte ptr) : 对于16位代码: xor bh,bh mov byte [bx], 0x0f 对于32位代码: mov
18 2024-03-17
编程技术问答社区
x86-64地址计算在64位模式下的32位地址大小
我阅读了以64位模式下的地址计算的英特尔手册.假设我们有64位模式,默认地址大小为64位.还假设所讨论的指令之前是地址大小覆盖前缀,因此地址大小变为32位. 现在,想象指令用寄存器编号0(rax/eax/ax ...)指定的地址编码内存操作数( ) 现在我不完全理解的东西,CPU是否仅查看EAX值并在内部零扩展以形成"本机" 64位地址,还是查看整个RAX值并将其截断为有效的32位范围(例如,RAX包含5GB和CPU将其切成32位地址). 解决方案 当在64位处理器上使用32位地址时,地址计算的结果将截断为32位,然后零扩展到64位.请注意,32位地址定义为使用32位寄存器,因此,如果RAX包含140000000H(5GB),则使用EAX(40000000H)的值.尽管这在实践上没有太大的不同. 来自Intel 64和IA-32架构软件开发人员的手册1: 基本体系结构: 所有16位和32位地址计算以IA-32E模式零扩展,以形成64位地址.地址 首先将计算截
2 2024-03-17
编程技术问答社区
如何在登记册中编写地址?
DOSSEG .MODEL SMALL .STACK .DATA PUBLIC SECTOR SECTOR DB 'R', 'o', 'b', 'e', 'r', 't', 'o', '$' .CODE EXTRN WRITE_CHAR:PROC INDEX PROC ; ==================================== 1) MOV AX, DGROUP MOV DS, AX XOR BX, BX MOV CX, 7 L1: MOV DL, SECTOR[BX] CALL WRITE_CHAR INC BX LOOP L1 ; ==================================== 2) MOV AH,
2 2024-03-17
编程技术问答社区
汇编代码和" LEA"中的地址
如果我说: lea (%eax,%eax,2), %edx 我被教导说这实际上是指: edx = eax + eax * 2 该工作的格式如何? 我想这导致了第二个问题.如果我有这样的东西: add -0x4(%esi, %ebx, 4), %eax 我了解第一操作数被添加到第二操作数,然后存储在第二个操作数中,但是我不明白的是第一个操作数的符号.另一个例子是如果我有: cmp %eax, (%esi, %ebx, 4) ...,这是否意味着将%eax的值与: 的值进行比较. esi + ebx * 4 ...?我尝试搜索很多这些内容,但我想我没有使用正确的单词来找到有意义的答案,所以我决定在这里发布. 解决方案 用lea计算值是一个让人联想到的,其中此操作要么更快(由于执行地址计算的电路计算)或代码尺寸较小.请注意,只需一个操作,您就可以在一个步骤中进行添加和乘法.当前的处理器可能会更快地进行add,其次是mul,但是鉴于投
20 2024-03-17
编程技术问答社区
为什么在LEA中使用方括号?
在汇编中,方括号[]似乎具有与 c 编程语言中的*相同的含义.它们被用来取消指针. 指示指针意味着指参考特定的内存位置以读取或编写. 因此,在MOV的情况下,使用方括号是非常合乎逻辑的. 但是,他们也将其用于lea的逻辑原因是什么? LEA EAX, [EBP -4],看起来像是指定指针,EBP - 4,参考指向内存位置,但它不会读取位置中包含的值,而是地址中包含的值. 我对此有些困惑.你能给我正确的思考方式吗? LEA是否与删除概念有任何联系? 显然,不是作为内存读数,而是主要是指内存的位置,不是为了其价值,而是为了其地址. 我不希望这成为一个哲学问题. 解决方案 LEA指令设计为看起来像记忆访问指令 - 因此可以执行所有解决模式.当然,当您注意到的是LEA加载"有效地址",而不是从该位置加载内存值. 因此,LEA类似于内存访问操作,但具体来说,在C术语中,正在采用地址 - 因此,就像C中的&a[i]一样.始终是指针尺寸的值,而不是我们可以获取/存储字
2 2024-03-17
编程技术问答社区
寄存器寻址模式与直接寻址模式
我在测试纸上遇到了这个问题.它说, 哪种给定的寻址模式更快?为什么? 注册地址模式 直接地址模式 现在根据我的寄存器地址模式应该更快,因为寄存器是计算机中最快的内存位置.这是正确的答案吗? 请帮助.谢谢 解决方案 注册访问是最快的.但是,如果您要访问的内存数据已经在CPU的数据缓存中,则内存访问可以很快. 其他解决方案 两个地址模式之间的区别是...地址的来源...对于直接地址模式,要访问的项目的地址是指令中的立即编码,因此指令更大,在某些情况下,它需要更多的时钟循环才能访问,理想情况下它是在缓存中,因为它是opcode之后的字节,并且opcode的获取通常会导致其后面至少会导致其后面的缓存线,并以其后面的缓存线.除了最古老的X86平台以外,我看不到您将如何到达执行指令的位置,而没有其余的说明以及接下来的几个/许多指令,并且在管道中.甚至旧的X86处理器都有一个大小的预取队. 寄存器地址表示所访问的项目的地址是在寄存器中.假设该地址已经存在,那么
2 2024-03-17
编程技术问答社区
X86操作码的编码:SIB字节
我目前正在尝试编写一个拆卸器.我找到了以下opcodes及其含义的列表,因此我决定在运行时解析它: org/web/20150810224114/http://mprolab.teipir.gr/vivlio80x86/pentium.txt ,但我被困在OpCode 0x00上: 其次是reg/modbyte.解析这对我来说不是什么问题. 但是我在比例尺索引基本字节上遇到了麻烦: 如果您实际将ESP指定为索引寄存器,则实际上意味着没有索引寄存器. 使用EBP的基本寄存器也适用.但是我已经使用C ++ Inline Assembler尝试了:可以编译: add [ebp*2+ebp],cl 因此,当使用EBP用作基本寄存器时,如何将EBP用作基本寄存器实际上意味着根本不使用基本寄存器!? 解决方案 仅在MODR/M.MOD字段具有值00二进制的情况下应用"缺失EBP"案例.如果您需要EBP作为基础,则汇编器将mod更改为01二进制,并添加8位位移,值为零
38 2024-03-17
编程技术问答社区
一条指令能否同时处于两种寻址模式?
我从头开始读取了以下内容编程: 处理器有多种访问数据的方式,称为 地址模式.最简单的模式是立即模式,其中 要访问的数据嵌入了说明本身.例如, 如果我们想将寄存器初始化为0,而不是给出 计算机一个读取0的地址,我们将立即指定 模式,并给它数量0. 在寄存器地址模式中,该说明包含一个 注册以访问,而不是内存位置.剩下的 模式将处理地址. 这是否意味着例如,指令mov eax, 123在立即模式下和登记地址模式? 解决方案 具有特定地址模式的不是整个指令,而是每个操作数. 在您的mov eax, 123示例中,您会说源是直接操作数,目的地是寄存器操作数. 或者您可以说该指令的机器代码将使用但是,当操作数之一是寄存器时,您可以为方便起见,简洁地说"指令使用[base+index]地址模式"(如果需要).但实际上,这是您正在谈论的记忆操作数,而不是整个说明.尤其是如果您不涉及内存地址,则将注册并立即为"地址模式". 此外, 通常,当人们说"地址模式"时,他们在谈
2 2024-03-17
编程技术问答社区
ARM汇编:存储时自动增加寄存器
是否可以使用[Rn]!自动化寄存器的基础地址?我已经凝视了文档,但无法找到确定的答案,主要是因为命令语法是针对LDR和STR提出的 - 从理论上讲,它应该适用于两者,但我找不到任何自动的示例 - 在商店上进行促进(加载可以正常运行). 我制作了一个小程序,该程序将两个数字存储在向量中.完成后,out的内容应为{1, 2},但商店覆盖了第一个字节,就好像自动插入不起作用. #include int main() { int out[]={0, 0}; asm volatile ( "mov r0, #1 \n\t" "str r0, [%0]! \n\t" "add r0, r0, #1 \n\t" "str r0, [%0] \n\t" :: "r"(out)
2 2024-03-17
编程技术问答社区
mov%eax,(%ESP)
以下语句有什么区别? mov %eax,%esp mov %eax,(%esp) 我正在研究扩散二进制炸弹,并且在大会的早期遇到了一些mov和leal命令的麻烦. 解决方案 这将%eax中的值复制到%esp. 中 mov %eax,%esp 这将值从%eax复制到内存中的位置,即%ESP指向. mov %eax,(%esp)
16 2024-03-17
编程技术问答社区
我不太清楚这个X86添加指令的作用是什么
我不确定此add指令在做什么: add 0x0(%rbp,%rbx,4),%eax 如果是: add %rbx,%eax 我知道它将添加rbx的内容,并在eax中添加内容,然后将它们存储回eax.但是,0x0(%rbp,%rbx,4)让我失望. 解决方案 那是因为它很愚蠢且令人困惑的AT&T语法. 在正常的英特尔语法中,它是add eax,dword ptr[rbp+4*rbx+0] ie添加dword在rbp+4*rbx中.
2 2024-03-17
编程技术问答社区
x86指令 "call dword ptr ds:[00923030h]"是什么意思?
以下X86汇编指令做什么? call dword ptr ds:[00923030h] 我怀疑这是一个间接的电话,但是它如何计算通话的地址? 解决方案 [编辑]更新 每当您看到一个看起来像ds:0x00923030的内存操作数时,那就是段相对地址模式. TP的实际地址是在线性地址0x00923030相对于ds段寄存器的基本地址. x86体系结构中的内存分割有些混乱,我认为 wikipedia wikipedia 做得很好解释它. 基本上,x86具有许多特殊段寄存器:cs( code 段),ds( data 段) ,es,fs,gs和ss( stack 段).每个内存访问都与某个段寄存器关联.通常,您不指定段寄存器,并且根据访问内存的方式,使用默认段寄存器.例如,cs寄存器用于阅读说明. 每个片段寄存器都有特定的基本地址和a 限制.基础地址确定线性地址0x00000000对应的物理地址,限制确定该段的最大允许线性地址.例如,如果基本地址为0x000
4 2024-03-17
编程技术问答社区
操作码中的汇编段
我注意到在装配段中使用了opcodes. 示例: MOV DWORD PTR SS:[EBP-30],30 我认为" PTR SS:"用于指定EBP-30来自堆栈吗? (SS:堆栈段) 我是对的还是我完全错了? :)而且,您能告诉我上面的示例与 之间的区别 MOV DWORD PTR[EBP-30],30 和Opcodes中使用的DS(数据段)呢? 解决方案 MOV DWORD PTR SS:[EBP-30],30 这里有两个独立的修饰符,DWORD PTR和SS:. 第一个告诉我们,我们想在指向的地址上存储一个单词.当汇编器无法从指令的操作数中分辨出来时,这是需要的. 30也可能是存储的字节. SS:是一个段前缀,说我们要使用相对于堆栈段的地址.在这种情况下,这不是严格需要的,因为使用ESP或EBP寄存器时,这是默认值.因此,第二版的指令与第一个版本相同. 您是否使用过EBX而不是EBP会有区别! 其他解决方案 ss是堆栈段
4 2024-03-17
编程技术问答社区
16位汇编:不能取消某些寄存器的定义
我正在尝试以下Intel 16位指令: mov si, word [reg] 其中reg是一些寄存器.如果reg为bx,则可以编译罚款,但是当它为ax,cx或dx时不会.我正在使用nasm作为我的汇编器.我敢肯定,这是由于指令集中的一些限制.有人可以解释限制和背后的理由吗? 解决方案 只有以下索引寄存器可以使用16位地址模式使用: bx si di bp bx + si bx + di bp + si bp + di 同样,SIB地址没有16位地址模式. 如果要使用其他索引寄存器,则可以随时使用32位地址模式,例如. [eax].只要您在80386或较新的处理器上运行代码. 此限制之所以存在,是因为MODR/M BYTE只有三个位用于(索引)寄存器.如上所述,确切的8个可能的索引寄存器组合存在.我不知道为什么他们将地址模式设计为​​那样,但是对于70年代的ERA 16 BOTEROR来说,这听起来很合理,就像8086一样. . 在32位模式和
2 2024-03-17
编程技术问答社区
将[符号+常数]英特尔语法寻址模式转换为AT&T语法?
我只是无法弄清楚如何在移动值时,特别是在英特尔语法中添加偏移量: MOV [gdtr + 2], EAX ,对于AT&T语法,我尝试将其转换为: movl %eax, gdtr(2,1) 在编译junk '(2,1)' after expression时会出现错误,但仅使用gdtr(,1)正常工作. 我不明白为什么我不能使用基本偏移,只有比例因子. 解决方案 简单地写 movl %eax, gdtr+2 基本扣除地址仅在偏移是寄存器时起作用.拥有一个地址模式可以将两个常数添加在一起是没有意义的.此操作的方式(无论语法如何)是汇编器/链接器分解为单个数字的指令编码的位移字段. 其他解决方案 只是gdtr+2 gdtr(2,1) [给出一个错误],但仅使用gdtr(,1)工作正常. () parens内部的东西在AT&T寻址模式下只能是寄存器(和比例因子):disp(base, index, scale).基本和索引是可选的
4 2024-03-17
编程技术问答社区
读取RIP寄存器给出下一条指令的地址?
我尝试读取x86_64寄存器rip的值.这是objdump显示的. 4017ec: 48 8d 35 00 00 00 00 lea 0x0(%rip),%rsi 4017f3: 41 89 d4 mov %edx,%r12d 我希望执行指令后,rsi的值应为0x4017ec.但是它是0x4017f3,这是下一个指令的地址. 我使用gdb停在0x4017ec上,当时rip的值为0x4017ec.为什么rsi当时不被rip的值加载?处理器应该从0x4017ec读取指令吗? 解决方案 取决于架构%RIP保留当前执行指令或要执行的下一个指令.在这里,您在0x4017EC之前添加了一个断点,这意味着要执行的下一个指令是0x4017EC.但是,只有在执行第一个指令后才加载%RSI.到那时,%RIP将已经更新以指向下一个指令. 其他解决方案 RIP在运行当前指令时始终保留下一个指令的地址.如果通过下一个指令的地址进行事实更新RI
2 2024-03-17
编程技术问答社区