win32汇编实现拼接SQL语句

字符串合并,在汇编语言,一般是用loop循环和cx寄存器,自己编程实现;

如果是win32汇编,可以使用movsb指令;

一般开发应用程序都会碰到拼接SQL语句,在C#这些语言用字符串连接的加号就可以了;在汇编中如果用上述两种方法,要拼接出SQL语句极其麻烦;

考虑使用调用win32 API来实现;

1.asm; 使用了lstrcpy,lstrcat函数;

MessageBox是调试用的,可注释掉;

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; by bobo
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		.386
		.model flat, stdcall
		option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include		windows.inc
include		user32.inc
includelib	user32.lib
include		kernel32.inc
includelib	kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN	equ		1000h	;图标
DLG_MAIN	equ		1
IDC_TXT1        equ             2001
IDC_TXT2	equ      	2002
IDC_TXT3        equ             2003
IDC_TXT4	equ      	2004
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		.data?
hInstance	dd		?
sztxt1		db	50 dup (?)
sztxt2		db	50 dup (?)
sztxt3		db	50 dup (?)

		.data
insstr BYTE "insert into mytable ",0h
jhstr BYTE " + ",0h
caption db "SQL拼接",0
sqlstr BYTE SIZEOF insstr DUP(0),0h

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcDlgMain	proc	uses ebx edi esi hWnd,wMsg,wParam,lParam
 
		mov	eax,wMsg
		.if	eax == WM_CLOSE
			invoke	EndDialog,hWnd,NULL
		.elseif	eax == WM_INITDIALOG
			invoke	LoadIcon,hInstance,ICO_MAIN
			invoke	SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
		.elseif	eax == WM_COMMAND
			mov	eax,wParam
			.if	ax == IDOK
				;invoke	EndDialog,hWnd,NULL
                                invoke	GetDlgItemText,hWnd,IDC_TXT1,addr sztxt1,sizeof sztxt1
                                invoke	GetDlgItemText,hWnd,IDC_TXT2,addr sztxt2,sizeof sztxt2
                                invoke	GetDlgItemText,hWnd,IDC_TXT3,addr sztxt3,sizeof sztxt3

                                invoke      lstrcpy, addr sqlstr, addr insstr
                                invoke      lstrcat, addr sqlstr, addr sztxt1
                                invoke      lstrcat, addr sqlstr, addr jhstr
                                invoke      lstrcat, addr sqlstr, addr sztxt2
                                invoke      lstrcat, addr sqlstr, addr jhstr
                                invoke      lstrcat, addr sqlstr, addr sztxt3

		invoke	MessageBox,NULL,addr sqlstr,addr caption,MB_OK
                                invoke	SetDlgItemText,hWnd,IDC_TXT4,addr sqlstr
			.endif
		.else
			mov	eax,FALSE
			ret
		.endif
		mov	eax,TRUE
		ret
 
_ProcDlgMain	endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
start:
		invoke	GetModuleHandle,NULL
		mov	hInstance,eax
		invoke	DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
		invoke	ExitProcess,NULL
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		end	start

1.rc;

 #include		<resource.h>
 
#define	ICO_MAIN		0x1000	//图标
#define	DLG_MAIN		1
#define	IDC_TXT1		2001
#define	IDC_TXT2		2002
#define	IDC_TXT3		2003
#define	IDC_TXT4		2004
 
ICO_MAIN	ICON		"Main.ico"
 
DLG_MAIN DIALOG 350, 250, 300, 250
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "Win32汇编拼接SQL语句"
FONT 9, "宋体"
{
 EDITTEXT IDC_TXT1, 50, 15, 200, 25, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP
 CTEXT "姓名:", -1, 5, 15, 40, 25
 EDITTEXT IDC_TXT2, 50, 60, 200, 25, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP
 CTEXT "职务:", -1, 5, 60, 40, 25
 EDITTEXT IDC_TXT3, 50, 105, 200, 25, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP
 CTEXT "部门:", -1, 5, 105, 40, 25
 EDITTEXT IDC_TXT4, 50, 150, 200, 25, ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP
 CTEXT "拼接的SQL:", -1, 5, 150, 40, 25
 DEFPUSHBUTTON "GO!", IDOK, 58, 210, 50, 14
 CONTROL "", -1, "Static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 6, 190, 103, 1
}

运行如下;拼接出的内容放到最后一个文本框;

构建过程;

    看上去基本可用;拼接出的SQL中的双引号、字段名这些,可自己加、改代码;界面可自己调rc文件;

猜你喜欢

转载自blog.csdn.net/bcbobo21cn/article/details/113804170
今日推荐