标签: x86-64

装配基础 - movq

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。

assembly x86-64

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

x86-64 指令“shrb %​​dil”是什么意思?

我知道这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

x86 assembly x86-64 att

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

从“db 0”加载寄存器不会将 0 加载到 EAX?

我已经用头撞墙一个多小时了,我不明白为什么下面的方法不起作用。如果我改为b: db 1b: 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)

linux assembly x86-64 nasm

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

在程序集中初始化字符串数组

我想在初始化的数据部分创建一个包含 5 个字符串的数据数组。每个字符串正好有 4 个字符。每个字符串都有一些初始数据,例如第一个字符串的“abcd”,第二个字符串的“efgh”等等。\0任何字符串都不需要空字符。如何用汇编语言初始化字符串数组?

这是我目前能想到的:

string    db    "abcdefghijklmnopqrst"
Run Code Online (Sandbox Code Playgroud)

是否有一些干净的语法或方法?

我正在使用nasm64 位代码。

arrays assembly x86-64 nasm

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

为什么使用 leal 而不是 incq?

我在鬼混,发现以下

#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)

c++ assembly g++ x86-64

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

NASM 中的增量循环

我在尝试让这个汇编代码工作时遇到了问题:

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 编写的。

linux assembly x86-64 nasm

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

使用 64 位 Linux 在 x86_64 的汇编中编写 putchar?

我正在尝试使用 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 assembly x86-64 nasm system-calls

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

未调用 NASM 呼叫标签

我正在 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 验证了这一点。我还没有在其他地方找到相关的解释。如果有人能解释发生了什么以及如何解决这个问题,我将不胜感激。

linux assembly x86-64 nasm ld

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

代码段描述符中的 D 标志对 x86-64 指令有什么作用?

我试图了解D flag在 x86-64 代码中使用时代码段描述符中的工作原理。它设置在D/B代码段描述符的第 22 位,如下图所示:

在此处输入图片说明

英特尔文档(来自第3.4.5段描述符)声明如下:

在此处输入图片说明

D/B(默认操作大小/默认堆栈指针大小和/或上限)标志

根据段描述符是可执行代码段、向下扩展数据段还是堆栈段执行不同的功能。(对于 32 位代码和数据段,此标志应始终设置为 1,对于 16 位代码和数据段,应始终设置为 0。)

• 可执行代码段。该标志称为 D 标志,它表示段中指令引用的有效地址和操作数的默认长度。如果设置了标志,则假定为 32 位地址和 32 位或 8 位操作数;如果清楚,则假定为 16 位地址和 16 位或 8 位操作数。指令前缀 66H 可用于选择默认值以外的操作数大小,前缀 67H 可用于选择默认值以外的地址大小。

所以我试图了解它影响哪些 x86-64 指令以及如何影响?

附注。当我尝试通过设置该位来运行一些测试(在 Windows 内核中)时,操作系统立即出现三重故障。

windows assembly x86-64 intel memory-segmentation

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

CPU如何确定哪个内核应处理硬件中断?

这个问题哪个处理器将在muticore系统执行硬件中断及其答案似乎把重点放在这个但从操作系统的角度来看,但如何在CPU决定什么内核,能够实现硬件中断之前的OS介入?

cpu x86 x86-64 intel

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

标签 统计

x86-64 ×10

assembly ×9

nasm ×5

linux ×4

intel ×2

x86 ×2

arrays ×1

att ×1

c++ ×1

cpu ×1

g++ ×1

ld ×1

memory-segmentation ×1

system-calls ×1

windows ×1