小编Sep*_*and的帖子

YASM mov 指令给出错误:操作数 1 的大小无效

我正在尝试做一些来自 TASM 的基本 YASM,这行代码会出错:

mov [var], 7
Run Code Online (Sandbox Code Playgroud)

我已经定义,像这样的变量:var db 5
即使在尝试这样做var: db 5之后仍然出错并说:

错误:操作数 1 的大小无效

assembly tasm yasm

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

使用 Shift-Left (shl) 得到 2^N,给定 N?

尝试使用 Shift-Left 指令进行乘法运算。

SHL (移位左)指令对所述目的地操作数的逻辑左移,填充的最低位为0。

SHL指令

我不明白如何为 N 使用寄存器或内存,因为当我尝试这样做时,我被告知“指令操作数无效”

  1. 用户在 RequestNumber 过程中输入一个数字 N(返回EAX)。
  2. 我正在尝试的计算是:结果 = 1 * 2^N

我的代码:

mov ebx, 1   
call RequestNumber      ; returns eax   
shl ebx, eax   
mov result, ebx
Run Code Online (Sandbox Code Playgroud)

我正在处理的任务要求使用 Shift 来获得结果 = 2^N 据我所知,您只能在此寄存器中使用 imm8 数字CL(尝试使用ECX具有相同结果的较低数字)。

SHL 的操作数类型

问题:如果必须从用户那里获取N,如何正确使用Shift指令?

x86 assembly bit-shift multiplication

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

什么是加宽整数运算?

让我们检查AddMultiply作为例子。哪一种可以归类为加宽

假设输入是2 的补码中的有符号字符(即长度为 8 位),除非另有声明。

正数加法

1+2 = 3
Run Code Online (Sandbox Code Playgroud)

这个操作似乎没有扩大。1、2 和 3 都适合一个字符。

但是,250 + 6溢出无符号字符。那么这是在扩大吗?

同样可以用有符号类型完成,将有符号125 + 5字符溢出到符号位中。这是在扩大吗?

负数加法

-2-3 = -5
Run Code Online (Sandbox Code Playgroud)

这会使二进制字符溢出 1 位:

   1 1 1 1 1 1 1 0
+  1 1 1 1 1 1 0 1
------------------ 
 1 1 1 1 1 1 0 1 1 
Run Code Online (Sandbox Code Playgroud)

溢出通常会被丢弃,但是,这是否被视为扩大操作?

正数乘法

1 * 2 = 2
Run Code Online (Sandbox Code Playgroud)

即使结果仍然适合原始数据类型,所有乘法是否都在扩大?

上面的例子2仍然适合一个 8 位字符,但是,如果我用二进制手工进行数学运算,额外的0s会附加到结果的左侧,结果被丢弃。 …

assembly cpu-architecture twos-complement integer-arithmetic

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

当 `reg` 包含内存地址时,`test reg, const`

在尝试对“crackme”二进制文件进行逆向工程时,我偶然发现了一个像这样开头的函数:

mov ecx, [esp+4]
test ecx, 3
jz short loc_106A9F0
Run Code Online (Sandbox Code Playgroud)

该函数的第一个参数(这是MOV“d到ECX在该函数的第一行)是一个指针为字符串。如果我理解正确,下一行执行TEST操作,其中一个操作数是内存地址,另一个是常量。我想知道为什么程序会这样做,考虑到内存地址本身应该无关紧要。
简而言之,我想知道为什么要编程TEST一个具有非零常量的指针。

x86 assembly reverse-engineering

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

Solidity 汇编错误:必须调用内置函数“gas”

我正在用 Solidity 编写代理合约。为了在我的后备函数中转发传入呼叫,我使用内联汇编代码。我是一名学生,下面的代码是我的老师在教程中编写的代码。

不过,我的代码收到以下错误:

必须调用内置函数“gas”。

我假设自本教程制作以来 Solidity 已经不断发展,但我在网上找不到任何东西(谷歌或文档)。

这是代码:

assembly {
        let result := delegatecall(gas, implementation, add(data, 0x20), mload(data), 0, 0)
        let size := returndatasize
        let ptr := mload(0x40)
        returndatacopy(ptr, 0, size)
        switch result   
        case 0 {revert(ptr, size)}  
        default{return(ptr, size)}  
}
Run Code Online (Sandbox Code Playgroud)

该错误是指第 2 行中带有红色下划线的单词“gas”。
有什么改变吗?

assembly solidity evm

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

不支持的指令“mov”

我正在研究基本的 shell 代码和orw代码。
但是,在此过程中,我收到以下错误消息:

错误:不支持的指令mov

这是我的 C 和汇编代码框架:

// File name: orw.c
// Compile: gcc -o orw orw.c -masm=intel

__asm__(

    ".global run_sh\n"
    "run_sh:\n"

    "push 0x67\n"
    "mov rax, 0x616c662f706d742f \n"
    "push rax\n"
    "mov rdi, rsp\n"
    "xor rsi, rsi\n"
    "xor rdx, rdx\n"
    "xor eax, eax\n"
    "mov eax, 2\n"
    "syscall"
    "\n"
    "mov rdi, eax\n"
    "mov rsi, rsp\n"
    "sub rsi, 0x30\n"
    "mov rdx, 0x30\n"
    "xor eax, eax\n"
    "syscall"
    "\n"
    "mov rdi,1\n"
    "mov eax,1\n"
    "syscall" 
);

void run_sh();

int main() { run_sh(); …
Run Code Online (Sandbox Code Playgroud)

assembly x86-64 gnu-assembler inline-assembly att

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

这些“丰富”的汇编代码是用来做什么的,为什么要编译出来呢?

我不熟悉 C++ 编译器的实现,我正在编写这样的 C++ 代码片段(用于学习):

\n
#include <vector>\n\nvoid vector8_inc(std::vector<unsigned char>& v) {\n    for (std::size_t i = 0; i < v.size(); i++) {\n        v[i]++;\n    }\n}\n\nvoid vector32_inc(std::vector<unsigned int>& v) {\n    for (std::size_t i = 0; i < v.size(); i++) {\n        v[i]++;\n    }\n}\n\nint main() {\n    std::vector<unsigned char> my{ 10,11,2,3 };\n    vector8_inc(my);\n    std::vector<unsigned int> my2{ 10,11,2,3 };\n    vector32_inc(my2);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

vector8_inc通过生成其汇编代码并反汇编其二进制文件,我找到了 \n和的段vector32_inc

\n
g++ -S test.cpp -o test.a -O2\n\n
Run Code Online (Sandbox Code Playgroud)\n
_Z11vector8_incRSt6vectorIhSaIhEE:\n.LFB853:\n    .cfi_startproc\n    endbr64\n    movq    (%rdi), %rdx\n    cmpq    8(%rdi), %rdx\n    je  .L1\n    xorl …
Run Code Online (Sandbox Code Playgroud)

c++ assembly compilation disassembly compiler-optimization

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

低音域和高域是否交换了位置?

IDEAL
MODEL small
STACK 100h
jumps
p186
DATASEG

array dw 312, 340, 311, 300

CODESEG
proc example
    pusha
    mov al ,4 ;number of elements in array
    mov bl, 0 ;index
    label1:
    mov cx, [array + bx] ;here, every second element ch and cl are swapped
    inc bl
    cmp bl, al
    jb label1
    popa
    ret
endp example

start:
    mov ax, @data
    mov ds, ax
    
    call example
exit:
    mov ax, 4c00h
    int 21h
END start
Run Code Online (Sandbox Code Playgroud)

在我的汇编代码中,cx在第一次和第三次迭代中没问题,但在第二次和第四次迭代中由于某种原因clch相互交换了它们的值。我真的对此不知所措,希望得到一些帮助,谢谢!

arrays x86 assembly loops cpu-registers

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

本例中按位运算的目的

在函数中outb(0x3D5, (uint8_t) (pos & 0xFF));,我无法理解按位运算的目的。pos是一个uint16_t变量。

&仅 8 位 1 的按位运算的目的是什么。该&操作只是将该值与 8 位 1 进行比较,据我所知,这只会产生相同的值。这个操作如何改变pos的值?

作为背景,如果它很重要,则该函数outb旨在将右侧参数的值移动到由端口(左侧参数)索引的寄存器中。在本例中,pos是 VGA 适配器内存中的位置。该函数outb使用内联汇编和汇编指令out

c x86 assembly operating-system osdev

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

C 中的 printf() 使用什么调用约定?

因此,我一直在练习使用 CDECL 和 STDCALL 调用约定在 FASMW 中编写简单的子例程,这让我想知道printfC 中的函数将使用什么。

此外,x86 32 位汇编中的函数定义也很棒。如果这还不算过分的话。

c x86 assembly variadic-functions calling-convention

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