小编mat*_*ack的帖子

使用立即数操作数对 x86-16 指令进行编码

我正在尝试解码指令,目前在 80x86 16 位机器上,在解码没有立即值作为源操作数的指令时没有太多问题,当源操作数不再是寄存器或寄存器时,就会出现问题。位置内存而是一个立即值。下面的指令我会这样解码:

mov ax, 3

101110|11| |11|000|000| 00000011 -> 3 with sign expansion
      |       |   |  register AX
      s = 1   |  null
      w = 1   |
              the second operand is a register
Run Code Online (Sandbox Code Playgroud)

相反,这是不公平的。这是正确的解码:

mov ax, 3

10111000 00000011 0000000
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释一下假设源操作数是立即值的话解码是如何工作的吗?

x86 assembly machine-code instruction-encoding

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

从没有返回的函数中返回一个值

我想我发现 gcc 编译器处理函数的方式有问题。

我不知道这是一个错误还是我多年来忽略的东西从来没有分心。实际上,通过声明一个函数并定义后者具有返回值,编译器将在函数范围内分配的第一个变量的值存储在 EAX 寄存器中,然后依次将其存储在一个变量中。例子:

#include<stdio.h>

int add(int a, int b)
{
    int c = a + b;

    ;there isn't return
}

int main(void)
{
    int res = add(3, 2);

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

这是输出:

5
Run Code Online (Sandbox Code Playgroud)

这是具有 intel 语法的 x86-64 程序集:

功能添加:

push   rbp
mov    rbp, rsp
mov    DWORD PTR[rbp-0x14], edi  ;store first
mov    DWORD PTR[rbp-0x18], esi  ;store second
mov    edx, DWORD PTR[rbp-0x14]
mov    eax, DWORD PTR[rbp-0x18]
add    eax, esx
mov    DWORD PTR[rbp-0x4], eax
nop
pop    rbp
ret
Run Code Online (Sandbox Code Playgroud)

主要功能:

push …
Run Code Online (Sandbox Code Playgroud)

c assembly gcc undefined-behavior

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