RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-656632

Tester2112's questions

Martin Hope
Tester2112
Asked: 2024-11-28 19:23:28 +0000 UTC

如何用汇编插入替换C++代码?

  • 5

我已经用 C++ 编写了一个函数,我需要用汇编代码替换它,并使用 VS2019 IDE 的汇编插入插入格式它,有人可以帮忙或告诉我在哪里可以阅读到此内容吗?该函数获取输入的姓名和年龄并将它们插入到列表中。下面是代码本身。

void insert(Node*& head, const char* name, const char* age) {

Node* newNode = new Node;
strncpy_s(newNode->name, name, 8);
newNode->name[8] = '\0';  // Обеспечиваем корректное завершение строки
strncpy_s(newNode->age, age, 2);
newNode->age[2] = '\0';
newNode->next = nullptr;


if (head == nullptr || strcmp(name, head->name) < 0) {
    // Вставка в начало списка
    newNode->next = head;
    head = newNode;
}
else {
    Node* current = head;
    while (current->next != nullptr && strcmp(name, current->next->name) > 0) {
        current = current->next;
    }
    newNode->next = current->next;
    current->next = newNode;
}

}

用汇编语言编写的代码

void insert(Node*& head, const char* name, const char* age) {
__asm {
    // Входные параметры:
    // head (esi) - указатель на указатель на голову списка
    // name (edx) - указатель на строку имени
    // age (ecx) - указатель на строку возраста

    // Сохраняем текущие значения регистров
    push ebx
    push edi
    push esi
    push edx
    push ecx

    // Получаем указатель на голову списка
    mov esi, [esp + 20]     // head
    mov edx, [esp + 24]     // name
    mov ecx, [esp + 28]     // age

    // Выделяем память для нового узла (Node)
    push 8                   // Размер структуры Node (9 байт для name, 3 для age, 4 для next)
    call malloc             // Вызов malloc
    add esp, 4              // Очистка стека после вызова malloc
    mov ebx, eax            // Новый узел сохраняем в ebx

    // Копируем имя в новый узел (newNode->name)
    lea edi, [ebx]          // edi указывает на новый узел
    lea eax, [edi + 0]      // Адрес поля name в новом узле
    mov ebx, edx            // ebx указывает на строку name
    call strncpy_s         // Копирование строки name
    // Завершаем строку null-символом для name
    lea eax, [edi + 8]
    mov byte ptr[eax], 0

    // Копируем возраст в новый узел (newNode->age)
    lea eax, [edi + 8]      // Адрес поля age в новом узле
    mov ebx, ecx            // ebx указывает на строку age
    call strncpy_s         // Копирование строки age
    // Завершаем строку null-символом для age
    lea eax, [edi + 10]
    mov byte ptr[eax], 0

    // Устанавливаем указатель next в nullptr
    lea eax, [edi + 12]     // Адрес поля next
    mov dword ptr[eax], 0  // newNode->next = nullptr

    // Если список пуст (head == nullptr), вставляем в начало
    mov eax, [esi]          // Загружаем head
    cmp eax, 0              // Если head == nullptr
    je InsertAtStart        // Переход к вставке в начало

    // Если список не пуст, ищем место для вставки
    SearchLoop :
    mov edx, [eax + 0]      // Загружаем имя текущего узла
        lea ecx, [edi + 0]      // Адрес нового имени (name)
        call strcmp             // Сравниваем строки
        jg ContinueSearch       // Если current->name > newNode->name, продолжаем

        // Вставляем узел после текущего
        mov edx, [eax + 4]      // Загружаем указатель на следующий узел
        lea ecx, [edi + 12]     // Адрес next нового узла
        mov[ecx], edx          // newNode->next = current->next
        lea edx, [eax + 4]      // Адрес next текущего узла
        lea ecx, [edi + 12]     // Адрес next нового узла
        mov[edx], ecx          // current->next = newNode

        jmp EndInsert

        ContinueSearch :
    mov eax, [eax + 4]      // Переходим к следующему узлу
        jnz SearchLoop          // Если не конец списка, продолжаем

        InsertAtStart :
    // Вставка в начало списка
    lea eax, [edi + 12]     // Адрес поля next в новом узле
    mov dword ptr[eax], [esi]  // newNode->next = *head
    mov[esi], ebx          // *head = newNode

        EndInsert :
    // Восстанавливаем регистры
    pop ecx
    pop edx
    pop esi
    pop edi
    pop ebx
}

}

ассемблер
  • 1 个回答
  • 33 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5