movq %rax,%rdx
movq 13(%rax),%rdx
movq 0x47(%rax,%rcx),%rdx
rcx = 0000000000000030
rax = 0000000008048a37
Run Code Online (Sandbox Code Playgroud)
我想知道这三个流水线指令有什么区别。我知道第一个是将 8048a37 移动到 %rdx。在第二个中,我想我必须在 8048a37 上加上 13 才能得到 8048a4a,然后 8048a4a 指向的任何东西都会移动到 %rdx。在第三个中,我想我添加了 rax、rdx 和 47 来获得 8048aae,然后 8048aae 指向的任何内容都会移动到 %rdx。
我知道这shrb代表逻辑右移。通常它与两个参数一起使用,shrb amount, %register. 但是,在我查看的代码中,它没有使用移位量 - 只指定了一个寄存器:
shrb %dil
Run Code Online (Sandbox Code Playgroud)
其中%dil代表 的最低有效字节%rdi。
现在上面的命令是否意味着我们右移 1?你会怎么去发现这个?有没有办法以某种方式执行命令,看看会发生什么?该文档对于提供有关省略班次金额时会发生什么的信息没有帮助:https : //docs.oracle.com/cd/E19253-01/817-5477/817-5477.pdf
我已经用头撞墙一个多小时了,我不明白为什么下面的方法不起作用。如果我改为b: db 1,b: db 0那么它应该打印 10,否则它应该打印 0。相反,程序总是打印 10。
我一直在编写一个编写程序集的项目,这是失败的单元测试之一,我只是不明白。它必须是一些简单的东西。
extern printf, exit
section .bss
section .data
b: db 1
x: dd 5
y: dd 5
z: dd 0
int_pattern: db "%i", 10, 0
global main
section .text
main:
mov eax, dword [b]
cmp eax, dword 0
je condition_end4
; add x and y
; store into z
mov eax, dword [rel x]
add eax, dword [rel y]
mov [rel z], eax
condition_end4:
; rsi = &z …Run Code Online (Sandbox Code Playgroud) 我想在初始化的数据部分创建一个包含 5 个字符串的数据数组。每个字符串正好有 4 个字符。每个字符串都有一些初始数据,例如第一个字符串的“abcd”,第二个字符串的“efgh”等等。\0任何字符串都不需要空字符。如何用汇编语言初始化字符串数组?
这是我目前能想到的:
string db "abcdefghijklmnopqrst"
Run Code Online (Sandbox Code Playgroud)
是否有一些干净的语法或方法?
我正在使用nasm64 位代码。
我在鬼混,发现以下
#include <stdio.h>
void f(int& x){
x+=1;
}
int main(){
int a = 12;
f(a);
printf("%d\n",a);
}
Run Code Online (Sandbox Code Playgroud)
当由g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4with翻译g++ main.cpp -S生成此组件时(仅显示相关部件)
_Z1fRi:
pushq %rbp
movq %rsp, %rbp
movq %rdi, -8(%rbp)
movq -8(%rbp), %rax
movl (%rax), %eax
leal 1(%rax), %edx
movq -8(%rbp), %rax
movl %edx, (%rax)
popq %rbp
ret
main:
pushq %rbp
movq %rsp, %rbp
subq $16, %rsp
movl $12, -4(%rbp)
leaq -4(%rbp), %rax
movq %rax, %rdi
call _Z1fRi
movl -4(%rbp), %eax
movl %eax, %esi …Run Code Online (Sandbox Code Playgroud) 我在尝试让这个汇编代码工作时遇到了问题:
section .text
global _start
_start:
loop:
mov rax, 4
mov rdi, 1
add rsi, 1
mov rdx, 1
syscall
cmp rsi,11
jne loop
exit:
mov rax,60
xor rdi,rdi
syscall
Run Code Online (Sandbox Code Playgroud)
此代码的目的是增加rsi寄存器中的值并将其值打印 10 次。它是在 Linux x86_64 机器上用 NASM 编写的。
我正在尝试使用 writesyscall来重现putchar打印单个字符的功能行为。我的代码如下,
asm_putchar:
push rbp
mov rbp, rsp
mov r8, rdi
call:
mov rax, 1
mov rdi, 1
mov rsi, r8
mov rdx, 1
syscall
return:
mov rsp, rbp
pop rbp
ret
Run Code Online (Sandbox Code Playgroud) 我正在 Linux 上使用 NASM 进行一些汇编编码,但遇到了问题。
global _start
section .text
testFunctionName:
mov rdi, 12
ret
_start:
call testFunctionName
mov rax, 1
mov rbx, 0
int 0x80
Run Code Online (Sandbox Code Playgroud)
然后组装和链接:
nasm -felf64 -F dwarf -g program.asm -o program.o
ld program.o -o program
Run Code Online (Sandbox Code Playgroud)
testFunctionName 永远不会跳转到。我使用 GDB 验证了这一点。我还没有在其他地方找到相关的解释。如果有人能解释发生了什么以及如何解决这个问题,我将不胜感激。
我试图了解D flag在 x86-64 代码中使用时代码段描述符中的工作原理。它设置在D/B代码段描述符的第 22 位,如下图所示:
D/B(默认操作大小/默认堆栈指针大小和/或上限)标志
根据段描述符是可执行代码段、向下扩展数据段还是堆栈段执行不同的功能。(对于 32 位代码和数据段,此标志应始终设置为 1,对于 16 位代码和数据段,应始终设置为 0。)
• 可执行代码段。该标志称为 D 标志,它表示段中指令引用的有效地址和操作数的默认长度。如果设置了标志,则假定为 32 位地址和 32 位或 8 位操作数;如果清楚,则假定为 16 位地址和 16 位或 8 位操作数。指令前缀 66H 可用于选择默认值以外的操作数大小,前缀 67H 可用于选择默认值以外的地址大小。
所以我试图了解它影响哪些 x86-64 指令以及如何影响?
附注。当我尝试通过设置该位来运行一些测试(在 Windows 内核中)时,操作系统立即出现三重故障。
这个问题哪个处理器将在muticore系统执行硬件中断及其答案似乎把重点放在这个但从操作系统的角度来看,但如何在CPU决定什么内核,能够实现硬件中断之前的OS介入?