我知道这是一个非常简单的问题,但我找不到答案.x86汇编中的寄存器(eax,ebx edx等)是否已签名或未签名?如果它们是默认签名的,那么计算机如何知道将寄存器视为无符号的,例如我们将变量声明为unsigned int?谢谢!
我想看看当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) 为了学习汇编,我正在查看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) 什么是最短的Intel x86-64操作码设置rax为1?
我试着xor rax,rax和inc al(在NASM语法); 它给出了5字节的操作码48 31 c0 fe c0.是否有可能以4个字节实现相同的结果?
您可以修改或读取任何其他寄存器,但不能假设特定值将来自之前的指令中的任何一个.
为什么我不能直接将一个字节从内存移动到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) 我注意到,对于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 …
我一直在寻找汇编教程,我正在尝试运行一个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) 我是 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) 这是复制(转换)未签名寄存器的指令:http : //www.felixcloutier.com/x86/MOVZX.html
基本上,该指令具有8-> 16、8-> 32、8-> 64、16-> 32和16-> 64。
32-> 64转换在哪里?我需要为此使用签名版本吗?
如果是这样,如何将全64位用于无符号整数?
我正在x86-64 NASM中做一个项目,遇到了以下说明:
mov rdi, rdi
Run Code Online (Sandbox Code Playgroud)
我的教授在编译器的输出中写道。
我到处搜索,但是找不到为什么需要这样做的提法。它会影响标志,还是我不理解的聪明之处?
为了提供一些上下文,它在循环使用递减同一寄存器之前就存在于循环中sub。