给出以下代码:
L1 db "word", 0
mov al, [L1]
mov eax, L1
Run Code Online (Sandbox Code Playgroud)
括号([L1])代表什么?
我是汇编编程的新手,在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的操作数是有效的.这不是一个调试问题 - 所以我的代码出了什么问题?或者是我的汇编程序?
我试图通过assmbly中的堆栈研究将参数传递给函数.我正在使用Fedora 20,64位系统.
当我尝试以下代码时,
pushl%ebp
popl%ebp
我得到错误,错误:"推"的无效指令后缀
我将如何克服这个错误!
我编译它,如-ggstabs -o Function_Stack.o Function_Stack.c
NASM返回如下错误:"在64位模式下不支持指令",我无法弄清楚要做什么.
主题说明pop ecx和push ecx说明.我可以使用什么代替它们,还是有其他方法来解决这个问题?
可能这甚至都不是微观但纳米优化,但主题让我感兴趣,我想知道在长模式下使用非本机寄存器大小时是否存在任何惩罚?
我从各种来源了解到,部分寄存器更新(比如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) 我想在堆栈上按64位地址,如下所示,
__asm("pushq $0x1122334455667788");
Run Code Online (Sandbox Code Playgroud)
但我得到编译错误,我只能按照以下方式推送,
__asm("pushq $0x11223344");
Run Code Online (Sandbox Code Playgroud)
有人能帮助我理解我的错误吗?
我是集会的新手,所以如果我的问题听起来很愚蠢,请原谅.
在x64上,每个PUSH指令是否会推送8个字节的倍数?如果没有,它会推动多少?
此外,每个函数参数消耗多少堆栈空间?
对于IA32架构和所有类型的微处理器/微控制器,堆栈的宽度是否为8位宽.
我目前正在阅读有关汇编语言的http://ozark.hendrix.edu/~burch/csbsju/cs/350/handouts/x86.html.在解释"call"时,它表示堆栈指针减少了4并且程序计数器被推入堆栈.这是否意味着堆栈缓冲区的宽度为8位宽,因为程序计数器长32位?我尝试在intel IA32架构软件开发手册中找到它但似乎无法证实它.
谢谢Sziang
为了学习汇编,我正在查看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) 我一直试图了解0x40ASM x64 指令的REX 操作码的用途。例如,在 Kernel32.dll 的这个函数序言中:
如您所见,它们push rbx用作:
40 53 push rbx
Run Code Online (Sandbox Code Playgroud)
但仅使用53h操作码(不带前缀)也会产生相同的结果:
根据此站点,REX 前缀的布局如下:
所以40h操作码似乎没有做任何事情。有人可以解释它的目的吗?