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文件;
还没有评论,来说两句吧...