我正在尝试解码指令,目前在 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)
有人可以向我解释一下假设源操作数是立即值的话解码是如何工作的吗?
我想我发现 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)