Ayala 发表于 2021-2-11 23:14:20

vb外联asm

本帖最后由 Ayala 于 2021-2-11 23:21 编辑



.686p
.model flat,stdcall
.nolist
option casemap:none
;OPTION PROC:export


include Strings.mac

include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
include msvcrt.inc
includelib msvcrt.lib


include ws2_32.inc
includelib ws2_32.lib

IDD_DLG1 EQU 1000

IDC_EDT1 EQU 1001
IDC_EDT2 EQU 1004
IDC_EDT3 EQU 1003
IDC_EDT4 EQU 1006
IDC_EDT5 EQU 1008
IDC_EDT6 EQU 1011
IDC_EDT7 EQU 1012

IDC_BTN1 EQU 1002
IDC_BTN2 EQU 1009
IDC_BTN3 EQU 1010



.data
        C2cmd   byte MAX_PATH dup(0)
        asmcmdbyte MAX_PATH dup(0)
        asmpath byte MAX_PATH dup(0)
        incpath byte MAX_PATH dup(0)
        asmfile byte MAX_PATH dup(0)
        tagfile byte MAX_PATH dup(0)
.code

DlgBuildAsmCmd proc hDlg:HWND
        invoke crt_sprintf,offset asmcmd ,$CTA0("%s %s %s %s & pause"),offset asmpath,offset incpath,offset asmfile,offset tagfile
        invoke SetDlgItemText,hDlg,IDC_EDT5,offset asmcmd
        ret
DlgBuildAsmCmd endp

DlgInit proc hDlg:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
        invoke SetDlgItemText,hDlg,IDC_EDT1,offset C2cmd
        invoke SetDlgItemText,hDlg,IDC_EDT3,offset asmpath
        invoke SetDlgItemText,hDlg,IDC_EDT4,offset incpath
        invoke SetDlgItemText,hDlg,IDC_EDT6,offset asmfile
        invoke SetDlgItemText,hDlg,IDC_EDT7,offset tagfile
        invoke DlgBuildAsmCmd,hDlg
        ret
DlgInit endp

DlgCmd proc hDlg:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

        mov eax, wParam
        and eax,0ffffh
       
        .if eax == IDC_BTN1
                invoke GetDlgItemText,hDlg,IDC_EDT1,offset C2cmd,MAX_PATH
                invoke crt_system,offset C2cmd
               
        .elseif eax == IDC_BTN2
                invoke crt_system,offset asmcmd
        .elseif eax == IDC_BTN3
                invoke DlgBuildAsmCmd,hDlg
        .endif
       
        ret
DlgCmd endp

DlgProc proc hDlg:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

        mov eax, uMsg

        .if eax == WM_INITDIALOG
                invoke DlgInit, hDlg, uMsg, wParam, lParam
                mov eax,TRUE
        .elseif eax == WM_COMMAND
                invoke DlgCmd, hDlg, uMsg, wParam, lParam
        .elseif eax == WM_CLOSE
                invoke EndDialog, hDlg, 0
                mov eax,TRUE
               
        .else
                mov eax, FALSE
               
        .endif
       
           ret
DlgProc endp


_main proc

        invoke GetCommandLine
        invoke crt_sprintf,offset C2cmd ,$CTA0("org\\%s -Fa foo.asm"),eax
        invoke crt_sprintf,offset asmpath ,$CTA0("..\\masm32\\bin\\ML.EXE /c /coff /Cp /nologo")
        invoke crt_sprintf,offset incpath ,$CTA0("/I..\\masm32\\include\\ /I..\\masm32\\macros\\")
        invoke crt_sprintf,offset asmfile ,$CTA0(".\\Module2\\Module2.asm")
        invoke crt_sprintf,offset tagfile ,$CTA0("-Fo.\\Module2.OBJ")
       
        invoke GetModuleHandle,NULL
        invoke DialogBoxParam,eax,IDD_DLG1,NULL,DlgProc,0
       
        ret
_main endp

end _main




#define IDD_DLG1 1000
#define IDC_EDT1 1001
#define IDC_BTN1 1002
#define IDC_EDT2 1004
#define IDC_EDT3 1003
#define IDC_STC1 1005
#define IDC_EDT4 1006
#define IDC_STC2 1007
#define IDC_EDT5 1008
#define IDC_BTN2 1009
#define IDC_BTN3 1010
#define IDC_EDT6 1011
#define IDC_EDT7 1012
#define IDC_STC3 1013
#define IDC_STC4 1014

#include "../../../masm32/include/resource.h"

IDD_DLG1 DIALOGEX 10,10,513,273
CAPTION "IDD_DLG"
FONT 8,"MS Sans Serif",0,0,0
STYLE WS_VISIBLE|WS_OVERLAPPEDWINDOW
BEGIN
CONTROL "",IDC_EDT1,"Edit",WS_CHILDWINDOW|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|ES_MULTILINE,3,150,372,42,WS_EX_CLIENTEDGE
CONTROL "编译源文件",IDC_BTN1,"Button",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP,387,150,123,42
CONTROL "",IDC_EDT2,"Edit",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP,3,198,507,72,WS_EX_CLIENTEDGE
CONTROL "",IDC_EDT3,"Edit",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP|ES_MULTILINE,3,3,369,24,WS_EX_CLIENTEDGE
CONTROL "汇编编译器路径",IDC_STC1,"Static",WS_CHILDWINDOW|WS_VISIBLE|SS_CENTERIMAGE,384,6,114,21
CONTROL "",IDC_EDT4,"Edit",WS_CHILDWINDOW|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|ES_MULTILINE,3,30,369,33,WS_EX_CLIENTEDGE
CONTROL "头文件路径",IDC_STC2,"Static",WS_CHILDWINDOW|WS_VISIBLE|SS_CENTERIMAGE,384,36,114,21
CONTROL "",IDC_EDT5,"Edit",WS_CHILDWINDOW|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|ES_MULTILINE,3,111,372,36,WS_EX_CLIENTEDGE
CONTROL "编译asm",IDC_BTN2,"Button",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP,387,111,123,36
CONTROL "重生成编译命令",IDC_BTN3,"Button",WS_CHILDWINDOW|WS_VISIBLE|WS_TABSTOP,387,84,93,21
CONTROL "",IDC_EDT6,"Edit",WS_CHILDWINDOW|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|ES_MULTILINE,3,66,303,21,WS_EX_CLIENTEDGE
CONTROL "",IDC_EDT7,"Edit",WS_CHILDWINDOW|WS_VISIBLE|WS_VSCROLL|WS_TABSTOP|ES_MULTILINE,3,87,303,21,WS_EX_CLIENTEDGE
CONTROL "汇编源文件",IDC_STC3,"Static",WS_CHILDWINDOW|WS_VISIBLE,312,69,54,21
CONTROL "目标文件",IDC_STC4,"Static",WS_CHILDWINDOW|WS_VISIBLE,312,90,54,21
END



测试代码

'主窗体
Private Sub Command1_Click()
    newthread "111111111111111"
End Sub
'模块2
Public Function threadproc(ByVal p As Long)
    MsgBox "threadproc"
End Function

Public Function newthread(s As String)
    threadproc 0
End Function





.686p
.model flat,stdcall
.nolist
;option casemap:none



include Strings.mac

include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
includelib Vbaexe6.lib


.code


?threadproc@Module2@@AAGXXZ proc syscalls

        invoke MessageBoxW,NULL,$CTW0("xxxx"),$CTW0("xxxx"),MB_OK
        ret
?threadproc@Module2@@AAGXXZ endp

?newthread@Module2@@AAGXXZ proc syscalla1,a2
       
        mov eax,a2
        mov eax,
        invoke MessageBoxW,NULL,$CTW0("1111"),eax,MB_OK
       
        invoke CreateThread,NULL,0,?threadproc@Module2@@AAGXXZ,0,0,0
       
        ret 8
?newthread@Module2@@AAGXXZ endp




end

vb目录里新建目录org,将原来c2房里,把这个换上

陈布衣 发表于 2021-2-13 00:43:46

好棒(看不懂
戈登这几天才从A5那知道如何把ASM在VB内调用(long数组

0xAA55 发表于 2021-2-21 03:11:37

戈登走過去 发表于 2021-2-13 00:43
好棒(看不懂
戈登这几天才从A5那知道如何把ASM在VB内调用(long数组

Long数组只是众多方法之一,这里的则是更自然的方法——使用汇编器编译.obj直接参与VB6的链接过程。

类似于直接用汇编器编写VB6的Module、Class、Form之类的东西。
页: [1]
查看完整版本: vb外联asm