相关疑难解决方法(0)

括号在x86 asm中的含义是什么?

给出以下代码:

L1     db    "word", 0

       mov   al, [L1]
       mov   eax, L1
Run Code Online (Sandbox Code Playgroud)

括号([L1])代表什么?

x86 assembly

56
推荐指数
4
解决办法
4万
查看次数

x86程序集pushl/popl不能与"错误:后缀或操作数无效"

我是汇编编程的新手,在GNU汇编程序v2.20.1的Ubuntu x86_64桌面上使用Programming Ground Up.

我已经能够组装/链接执行我的代码,直到我使用pushl/popl指令来操作堆栈.以下代码无法汇编:

 .section .data  # empty

 .section .text
.globl _start
_start:
 pushl $1       # push the value 1 onto the stack
 popl %eax      # pop 1 off the stack and into the %eax register
 int $0x80      # exit the program with exit code '1'
Run Code Online (Sandbox Code Playgroud)

使用"as test.s -o test.o",这些错误出现在终端上并且未创建test.o:

test.s: Assembler messages: 
test.s:9: Error: suffix or operands invalid for 'push'
test.s:10:  Error: suffix or operands invalid for 'popl'
Run Code Online (Sandbox Code Playgroud)

我检查了文档,我用于pushl和popl的操作数是有效的.这不是一个调试问题 - 所以我的代码出了什么问题?或者是我的汇编程序?

x86 assembly x86-64

27
推荐指数
3
解决办法
3万
查看次数

错误:"push"的指令后缀无效

我试图通过assmbly中的堆栈研究将参数传递给函数.我正在使用Fedora 20,64位系统.

当我尝试以下代码时,

pushl%ebp

popl%ebp

我得到错误,错误:"推"的无效指令后缀

我将如何克服这个错误!

我编译它,如-ggstabs -o Function_Stack.o Function_Stack.c

assembly x86-64

15
推荐指数
1
解决办法
2万
查看次数

64位模式不支持PUSH和POP指令

NASM返回如下错误:"在64位模式下不支持指令",我无法弄清楚要做什么.

主题说明pop ecxpush ecx说明.我可以使用什么代替它们,还是有其他方法来解决这个问题?

assembly x86-64 nasm

9
推荐指数
1
解决办法
9790
查看次数

在长模式下使用64/32位寄存器可能会有任何处罚吗?

可能这甚至都不是微观但纳米优化,但主题让我感兴趣,我想知道在长模式下使用非本机寄存器大小时是否存在任何惩罚?

我从各种来源了解到,部分寄存器更新(比如ax代替eax)会导致eflags停顿并降低性能.但我不确定长模式.对于此处理器操作模式,哪个寄存器大小被视为原生?x86-64仍然是x86架构的扩展,因此我相信32位仍然是原生的.还是我错了?

例如,像

sub eax, r14d
Run Code Online (Sandbox Code Playgroud)

要么

sub rax, r14
Run Code Online (Sandbox Code Playgroud)

具有相同的尺寸,但在使用其中任何一种时可能会有任何处罚吗?在如下连续指令中混合寄存器大小时可能会有任何处罚吗?(假设高dword在所有情况下均为零)

sub ecx, eax
sub r14, rax
Run Code Online (Sandbox Code Playgroud)

optimization x86 assembly micro-optimization

8
推荐指数
1
解决办法
186
查看次数

推动64位英特尔osx

我想在堆栈上按64位地址,如下所示,

__asm("pushq $0x1122334455667788");
Run Code Online (Sandbox Code Playgroud)

但我得到编译错误,我只能按照以下方式推送,

__asm("pushq $0x11223344");
Run Code Online (Sandbox Code Playgroud)

有人能帮助我理解我的错误吗?

我是集会的新手,所以如果我的问题听起来很愚蠢,请原谅.

macos assembly x86-64

7
推荐指数
4
解决办法
6803
查看次数

每个PUSH指令是否在x64上推送8个字节的倍数?

在x64上,每个PUSH指令是否会推送8个字节的倍数?如果没有,它会推动多少?

此外,每个函数参数消耗多少堆栈空间?

assembly x86-64 calling-convention

7
推荐指数
2
解决办法
3104
查看次数

英特尔IA32架构中的堆栈宽度是多少?

对于IA32架构和所有类型的微处理器/微控制器,堆栈的宽度是否为8位宽.

我目前正在阅读有关汇编语言的http://ozark.hendrix.edu/~burch/csbsju/cs/350/handouts/x86.html.在解释"call"时,它表示堆栈指针减少了4并且程序计数器被推入堆栈.这是否意味着堆栈缓冲区的宽度为8位宽,因为程序计数器长32位?我尝试在intel IA32架构软件开发手册中找到它但似乎无法证实它.

谢谢Sziang

assembly stack

5
推荐指数
1
解决办法
1128
查看次数

为什么gcc将8字节格式的char类型传递给函数汇编

为了学习汇编,我正在查看GCC使用-S命令为一些简单的c程序生成的汇编.我有一个add函数,它接受一些int和一些char并将它们加在一起.我只是想知道为什么char参数被压缩到8个字节(pushq)?为什么不只推一个字节?

    .file   "test.c"
    .text
    .globl  add
    .type   add, @function
add:
.LFB0:
    .cfi_startproc
    pushq   %rbp
    .cfi_def_cfa_offset 16
    .cfi_offset 6, -16
    movq    %rsp, %rbp
    .cfi_def_cfa_register 6
    movl    %edi, -4(%rbp)
    movl    %esi, -8(%rbp)
    movl    %edx, -12(%rbp)
    movl    %ecx, -16(%rbp)
    movl    %r8d, -20(%rbp)
    movl    %r9d, -24(%rbp)
    movl    16(%rbp), %ecx
    movl    24(%rbp), %edx
    movl    32(%rbp), %eax
    movb    %cl, -28(%rbp)
    movb    %dl, -32(%rbp)
    movb    %al, -36(%rbp)
    movl    -4(%rbp), %edx
    movl    -8(%rbp), %eax
    addl    %eax, %edx
    movl    -12(%rbp), %eax
    addl    %eax, %edx
    movl    -16(%rbp), %eax
    addl    %eax, …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc x86-64

5
推荐指数
2
解决办法
424
查看次数

ASM x64 中 40h REX 操作码的目的是什么?

我一直试图了解0x40ASM x64 指令的REX 操作码的用途。例如,在 Kernel32.dll 的这个函数序言中:

在此处输入图片说明

如您所见,它们push rbx用作:

40 53      push        rbx 
Run Code Online (Sandbox Code Playgroud)

但仅使用53h操作码(不带前缀)也会产生相同的结果:

在此处输入图片说明

根据此站点,REX 前缀的布局如下:

在此处输入图片说明

所以40h操作码似乎没有做任何事情。有人可以解释它的目的吗?

windows 64-bit x86-64 opcode disassembly

5
推荐指数
1
解决办法
1926
查看次数