标签: inline-assembly

如何在函数调用期间保存ESP的值

我对下面的代码有问题:


void swap(int* a, int* b) {
    __asm {
        mov eax, a;
        mov ebx, b;
        push[eax];
        push[ebx];
        pop[eax];
        pop[ebx];
    }
}
int main() {
    int a = 3, b = 6;
    printf("a: %d\tb: %d\n", a, b);
    swap(&a, &b);
    printf("a: %d\tb: %d\n", a, b);
}
Run Code Online (Sandbox Code Playgroud)

我正在 Visual Studio 中运行此代码,当我运行此代码时,它显示:

运行时检查失败 - ESP 的值未在函数调用中正确保存。这通常是用一种调用约定声明的函数和用另一种调用约定声明的函数指针调用的结果。

我缺少什么?

c x86 assembly inline-assembly

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

C++中的汇编程序

我有以下代码.

#include<iostream>
using namespace std;
int main() {
    int result=0;
    _asm {
         mov eax,2
         mov eax,result;
    }

    cout<<result<<endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道汇编程序很好,但为什么程序输出2到屏幕?

c++ x86 inline-assembly visual-c++ intel-syntax

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

汇编语言部门 - 剩余DX寄存器

我的程序差不多完成了.我试图将CBA0123h除以B000h.商出来了.但是,应该在dx寄存器中的余数应该是:EA61(http://www.miniwebtool.com/hex-calculator/?number1=CBA0123&operate=4&number2=B000),而不是它的A123.我认为这与小端或其他东西有关.但我需要解决这个问题.我怎么能够?我旋转位?我以前从未见过如何做到这一点.如何从这个除法问题中得到正确的余数?

int main(int argc, char* argv[])
{
unsigned short int IDQUO = 0x0;
unsigned short int IDREM = 0x0;

    mov     dx, 0CBAh       
    mov     ax, 0123h       
    mov     bx, 0B000h      
    div     bx              
    mov     IDQUO, ax       
    mov     IDREM, dx       
return(0);
}
Run Code Online (Sandbox Code Playgroud)

c x86 assembly division inline-assembly

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

使用内联汇编计算数字的位数

如何使用 Delphi 的内联汇编器获取数字的位数?

例如 :

13452     should return 5
1344      should return 4
9721343   should return 7
Run Code Online (Sandbox Code Playgroud)

等等

我的尝试是这样的:

function CalculateLength(Number : integer) : Integer;
begin
asm
  PUSH Length(Number)
  MOV @Result, EAX
end;
end;
Run Code Online (Sandbox Code Playgroud)

delphi assembly inline-assembly

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

C/汇编中的双冒号“::”运算符

首先,不,我不是在谈论 C++ 范围解析运算符。

我有以下语法:

asm(
"mov R0,%0\n"
"mov R1,%1\n"
"mov R3,%2\n"
"mov R4,%3\n"
"mov R5,%4\n"
::"r"(<A_VALUE>),
"r"(<A_VALUE>),
"r"(<A_VALUE>),
"r"(<A_VALUE>),
"r"(<A_VALUE>),
:"r0","r1","r2"
)
Run Code Online (Sandbox Code Playgroud)

冒号和双冒号是什么意思?我确实记得在动态创建变量名时与字符串连接有关。

万提前致谢!

c assembly inline-assembly colon

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

c变量存储在eax寄存器中

我在这做错了什么?

int val = 15;
asm ("movl %1, %%eax"::"r"(val):"%eax" );
__asm__ volatile ("int $0x80");
Run Code Online (Sandbox Code Playgroud)

我想在eax中移动15然后调用中断

"错误":'asm':操作数超出范围

c assembly gcc inline-assembly

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

汇编代码 fsqrt 和 fmul 指令

我正在尝试1.34 *sqrt(lght)使用内联汇编在此函数中进行计算,但出现以下错误:

'_asm' 未声明(首次在此函数中使用)每个未声明的标识符仅针对它出现在预期中的每个函数报告一次 ';' 在“{”标记之前


我一直在研究如何解决这个问题,但找不到太多信息。有人可以建议一种方法来让它发挥作用吗?

我的代码是:

   double hullSpeed(double lgth) {
       _asm {
           global _start
           fld lght; //load lght
           fld st(0); //duplicate lght on Top of stack
           fsqrt;
           square root of lght
           fld st(0); //load square result on top of stack
           fld 1.34; //load 1.34 on top of stack
           fld st(i);
           duplicate 1.34 on TOS
           fmulp st(0), st(i); //multiply them 
           fst z;
           save result in z
       }
       return z; // return result of [ 1.34 *sqrt(lght) ] …
Run Code Online (Sandbox Code Playgroud)

c x86 assembly gcc inline-assembly

-6
推荐指数
1
解决办法
5056
查看次数

标签 统计

inline-assembly ×7

assembly ×6

c ×5

x86 ×4

gcc ×2

c++ ×1

colon ×1

delphi ×1

division ×1

intel-syntax ×1

visual-c++ ×1