首页 > 编程语言 >记录第一次使用c++和汇编联合编译

记录第一次使用c++和汇编联合编译

时间:2022-10-28 23:12:07浏览次数:49  
标签:loc 汇编 al c++ mov 编译 edx esi ecx

32位

从Ida把目标函数扣出来

toUapper        proc near               

arg_0           = dword ptr  4

                push    esi
                mov     esi, [esp+4+arg_0]
                push    edi
                mov     edi, esi
                or      ecx, 0FFFFFFFFh
                xor     eax, eax
                repne scasb
                not     ecx
                dec     ecx
                xor     edx, edx
                test    ecx, ecx
                jle     short loc_40102D

loc_401018:                             
                mov     al, [edx+esi]
                cmp     al, 61h
                jl      short loc_401028
                cmp     al, 7Ah
                jg      short loc_401028
                sub     al, 20h
                mov     [edx+esi], al

loc_401028:                           
                                       
                inc     edx
                cmp     edx, ecx
                jl      short loc_401018

loc_40102D:                             
                pop     edi
                pop     esi
                retn
toUapper        endp

汇编代码进行修正,并放入<filename>.asm中

.model flat, c
option casemap :none
.code
toUapper        proc arg_0:DWORD ;函数入口


                push    esi
                mov     esi, arg_0	;语法修正
                push    edi
                mov     edi, esi
                or      ecx, 0FFFFFFFFh
                xor     eax, eax
                repne scasb
                not     ecx
                dec     ecx
                xor     edx, edx
                test    ecx, ecx
                jle     short loc_40102D

loc_401018:                             
                mov     al, [edx+esi]
                cmp     al, 61h
                jl      short loc_401028
                cmp     al, 7Ah
                jg      short loc_401028
                sub     al, 20h
                mov     [edx+esi], al

loc_401028:                           
                                       
                inc     edx
                cmp     edx, ecx
                jl      short loc_401018

loc_40102D:                             
                pop     edi
                pop     esi
                ret		;把n删掉,汇编不认retn
toUapper        endp
end	;最后一定要加一个end

将<filename>.asm 使用ml.exe编译成<filename>.obj

ml.exe 是vs自带的,用evething 搜一下

ml.exe /c toUapper.asm

将<filename>.obj添加到vs工程中,并声明使用目标函数

test.cpp

#include <iostream>

extern "C" void toUapper(char* src);  //一定要加入 extern "C"的说明,不然会因c++的命名粉碎而导致找不到目标函数而出现无法解析的符号错误
int main()
{
    char szBuf[256] = {0,};
    scanf_s("%s", szBuf, 256);
    toUapper(szBuf);
    std::cout << szBuf;
    getchar();
}

运行结果
image

64位

标签:loc,汇编,al,c++,mov,编译,edx,esi,ecx
From: https://www.cnblogs.com/czlnb/p/16837743.html

相关文章

  • C++ primer笔记 7.1 定义抽象数据类型
    7.1定义抽象数据类型structSales_data{std::stringbookNo;unsignedunits_sold=0;doublerevenue=0.0;std::stringisbn()const{returnboo......
  • Homework 3 : C++ class inheritance Answer
    Homework3:C++classinheritanceAnswerHomework3:C++classinheritanceInstructor:ZhiyaoLiangCIS111&EIE1112021Spring源码传送门传送门:https://pan.ba......
  • 英雄联盟用什么语言编写?C/C++ yyds
    一直有读者咨询C/C++可以干什么,今天这篇文章分享一下具体应用领域。 1、操作系统MicrosoftWindows:汇编->C语言->C++Linux:C语言AppleMacOS: 主要为C语言,部......
  • C++——new和malloc的区别
    new是关键字/操作符,而malloc是函数new一个对象的时候,不但分配内存,而且还会调用类的构造函数(当然如果类没有构造函数,系统也没有给类生成构造函数,那没法调用构造函数了)......
  • 新编译安装 NGINX
    2.1安装nginx2.1.1在这个时候我们需要安装依赖包yum-yinstallpcrepcre-devel zlibzlib-devel opensslopenssl-devel2.1.2下载并且解压到(/usr/local/src目录......
  • Homework 1 : Knowledge items of C++ Answer (part 1)
    Homework1:KnowledgeitemsofC++Answer(part1)Homework1:KnowledgeitemsofC++(part1)C++:CS111EIE111LP104MUST2021SpringInstructor:ZhiyaoL......
  • VSCode-多文件编译执行
    VSCode-配置多文件编译默认VSCode只能编译单个文件,若多个文件一起编译,经常会报undefinedreference找不到引用的错误,比如下面的问题:这个时候即使你把所有的cppcode......
  • C语言笔记 | C与汇编
    函数通过栈传递参数平衡栈(函数调用约定)cdecl参数从右至左入栈调用者清栈stdcall参数从右至左入栈自身清栈fastcall:ecx和edx传前两个参数,剩下的参......
  • C++——指针作为函数参数传递需要注意的问题
    指针作为函数参数传递的一些问题总结:#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<iostream>#include<cstdlib>#include<cstring>usingnamespace......
  • CMake —— 跨平台 编译 软件 & visual studio支持
    CMakeisanopen-source,cross-platformfamilyoftoolsdesignedtobuild,testandpackagesoftware.CMakeisusedtocontrolthesoftwarecompilationprocess......