相关疑难解决方法(0)

汇编x86寄存器有符号或无符号

我知道这是一个非常简单的问题,但我找不到答案.x86汇编中的寄存器(eax,ebx edx等)是否已签名或未签名?如果它们是默认签名的,那么计算机如何知道将寄存器视为无符号的,例如我们将变量声明为unsigned int?谢谢!

x86 assembly

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

unsigned int to unsigned long long well defined?

我想看看当unsigned long long被分配了一个值的幕后发生了什么unsigned int.我做了一个简单的C++程序来尝试它并将所有io移出main():

#include <iostream>
#include <stdlib.h>

void usage() {
        std::cout << "Usage: ./u_to_ull <unsigned int>\n";
        exit(0);
}

void atoiWarning(int foo) {
        std::cout << "WARNING: atoi() returned " << foo << " and (unsigned int)foo is " <<
 ((unsigned int)foo) << "\n";
}

void result(unsigned long long baz) {
        std::cout << "Result as unsigned long long is " << baz << "\n";
}

int main(int argc, char** argv) {
        if (argc != 2) usage();

        int …
Run Code Online (Sandbox Code Playgroud)

c++ x86 assembly x86-64 unsigned-integer

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

为什么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
查看次数

rax = 1的最短Intel x86-64操作码?

什么是最短的Intel x86-64操作码设置rax为1?

我试着xor rax,raxinc al(在NASM语法); 它给出了5字节的操作码48 31 c0 fe c0.是否有可能以4个字节实现相同的结果?

您可以修改或读取任何其他寄存器,但不能假设特定值将来自之前的指令中的任何一个.

assembly x86-64 micro-optimization code-size

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

为什么我不能直接将字节移动到64位寄存器?

为什么我不能直接将一个字节从内存移动到Intel x86-64汇编中的64位寄存器?

例如,这段代码:

extern printf

global main

segment .text

main:
    enter   2, 0

    mov     byte [rbp - 1], 'A'
    mov     byte [rbp - 2], 'B'

    mov     r12, [rbp - 1]
    mov     r13, [rbp - 2]             

    xor     rax, rax           
    mov     rdi, Format                                                                                             
    mov     rsi, r12                                                                                                
    mov     rdx, r13                                                                                                
    call    printf                                                                                                  

    leave                                                                                                           
    ret                                                                                                             

segment .data                                                                                                       
Format:     db "%d %d", 10, 0
Run Code Online (Sandbox Code Playgroud)

打印:

65 16706
Run Code Online (Sandbox Code Playgroud)

我需要将移动字节更改为寄存器r12和r13,以使代码正常工作:

xor     rax, rax
mov     al, byte [rbp - 1]
mov     r12, rax
xor     rax, rax
mov     al, …
Run Code Online (Sandbox Code Playgroud)

assembly x86-64

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

为什么uint8_t + uint8_t导致int?

我注意到,对于8位变量的简单操作,变量int在操作完成之前转换为32位s,然后转换回8位变量.

举个例子,这个c ++程序:

#include <iostream>
#include <cstdint>

int main( void )
{
  uint8_t a = 1;
  uint8_t b = 2;

  std::cout << "sizeof(a)   = " << sizeof( a ) << std::endl;
  std::cout << "sizeof(b)   = " << sizeof( b ) << std::endl;
  std::cout << "sizeof(a+b) = " << sizeof( a+b ) << std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

产生以下输出:

sizeof(a)   = 1
sizeof(b)   = 1
sizeof(a+b) = 4
Run Code Online (Sandbox Code Playgroud)

所以我们可以理解发生的事情是:

uint8_t c = (uint8_t)((int)(a) + (int)(b));
Run Code Online (Sandbox Code Playgroud)

显然,它似乎在论坛中所说的C的规范中.

另外,在Visual Studio …

c++ types

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

在Windows上的Ubuntu上的Bash上汇编编译可执行文件不会产生输出

我一直在寻找汇编教程,我正在尝试运行一个hello world程序.我在Windows上使用Ubuntu上的Bash.

这是集会:

section .text
    global _start     ;must be declared for linker (ld)

_start:             ;tells linker entry point
    mov edx,len     ;message length
    mov ecx,msg     ;message to write
    mov ebx,1       ;file descriptor (stdout)
    mov eax,4       ;system call number (sys_write)
    int 0x80        ;call kernel

    mov eax,1       ;system call number (sys_exit)
    int 0x80        ;call kernel

section .data
    msg db 'Hello, world!', 0xa  ;string to be printed
    len equ $ - msg     ;length of the string
Run Code Online (Sandbox Code Playgroud)

我正在使用这些命令来创建可执行文件:

nasm -f elf64 hello.asm -o hello.o
ld …
Run Code Online (Sandbox Code Playgroud)

linux x86 assembly nasm windows-subsystem-for-linux

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

为什么 Linux 上的 NASM 会更改 x86_64 程序集中的寄存器

我是 x86_64 汇编编程的新手。我正在用 x86_64 程序集编写简单的“Hello World”程序。下面是我的代码,它运行得很好。

global _start

section .data

    msg: db "Hello to the world of SLAE64", 0x0a
    mlen equ $-msg

section .text
    _start:
            mov rax, 1
            mov rdi, 1
            mov rsi, msg
            mov rdx, mlen
            syscall

            mov rax, 60
            mov rdi, 4
            syscall 
Run Code Online (Sandbox Code Playgroud)

现在,当我在 gdb 中反汇编时,它会给出以下输出:

(gdb) disas
Dump of assembler code for function _start:
=> 0x00000000004000b0 <+0>:     mov    eax,0x1
   0x00000000004000b5 <+5>:     mov    edi,0x1
   0x00000000004000ba <+10>:    movabs rsi,0x6000d8
   0x00000000004000c4 <+20>:    mov    edx,0x1d
   0x00000000004000c9 <+25>:    syscall
   0x00000000004000cb <+27>:    mov …
Run Code Online (Sandbox Code Playgroud)

assembly x86-64 nasm micro-optimization shellcode

4
推荐指数
2
解决办法
1274
查看次数

MOVZX缺少32位寄存器到64位寄存器

这是复制(转换)未签名寄存器的指令:http : //www.felixcloutier.com/x86/MOVZX.html

基本上,该指令具有8-> 16、8-> 32、8-> 64、16-> 32和16-> 64。

32-> 64转换在哪里?我需要为此使用签名版本吗?
如果是这样,如何将全64位用于无符号整数?

assembly x86-64 instruction-set

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

在x86-64中将寄存器移至自身会有什么好处

我正在x86-64 NASM中做一个项目,遇到了以下说明:

mov rdi, rdi
Run Code Online (Sandbox Code Playgroud)

我的教授在编译器的输出中写道。

我到处搜索,但是找不到为什么需要这样做的提法。它会影响标志,还是我不理解的聪明之处?

为了提供一些上下文,它在循环使用递减同一寄存器之前就存在于循环中sub

assembly x86-64 nasm

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