news 2026/4/3 7:57:51

汇编语言全接触-40.一个例子

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
汇编语言全接触-40.一个例子

这一章,我们要把我们已学的知识集合起来。具体来讲,我们来写一个使用ODBC APIs的程序.为简单起见,这个程序中我使用Microsoft的Access数据库(Microsoft Access 97) .

下载例子源程序.

注意:如果你使用的windows.inc 是1.18及其以下版本,在开始编译之前要修改其中的一个小bug.在windows.inc中查找 "SQL_NULL_HANDLE",将得到下面这行:

SQL_NULL_HANDLE equ 0L

将0后面的"L"删除,象这样:

SQL_NULL_HANDLE equ 0

这个程序是一个基于对话框的程序,有一个简单的菜单.当用户选择"connect"时,它将试图连接test.mdb数据库,如果连接成功,将显示由ODBC驱动程序返回的完整连接字符串.接下来,用户可选择"View All Records"命令,程序会使用listview control来显示数据库中的所有数据.用户还可以选择"Query"命令来查询特定的记录.例子程序将会显示一个小对话框提示用户输入想找的人名.当用户按下OK钮或回车键,程序将执行一个查询来查找符合条件的记录.当用户完成对数据库的操作时,可以选择"disconnect"命令与数据库断开连接.

现在看一下源程序:

.386

.model flat,stdcall

include \masm32\include\windows.inc

include \masm32\include\kernel32.inc

include \masm32\include\odbc32.inc

include \masm32\include\comctl32.inc

include \masm32\include\user32.inc

includelib \masm32\lib\odbc32.lib

includelib \masm32\lib\comctl32.lib

includelib \masm32\lib\kernel32.lib

includelib \masm32\lib\user32.lib

IDD_MAINDLG equ 101

IDR_MAINMENU equ 102

IDC_DATALIST equ 1000

IDM_CONNECT equ 40001

IDM_DISCONNECT equ 40002

IDM_QUERY equ 40003

IDC_NAME equ 1000

IDC_OK equ 1001

IDC_CANCEL equ 1002

IDM_CUSTOMQUERY equ 40004

IDD_QUERYDLG equ 102

DlgProc proto hDlg:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD

QueryProc proto hDlg:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD

SwitchMenuState proto :DWORD

ODBCConnect proto :DWORD

ODBCDisconnect proto :DWORD

RunQuery proto :DWORD

.data?

hInstance dd ?

hEnv dd ?

hConn dd ?

hStmt dd ?

Conn db 256 dup(?)

StrLen dd ?

hMenu dd ? ; 主菜单句柄

hList dd ? ; listview control句柄

TheName db 26 dup(?)

TheSurname db 26 dup(?)

TelNo db 21 dup(?)

NameLength dd ?

SurnameLength dd ?

TelNoLength dd ?

SearchName db 26 dup(?)

ProgPath db 256 dup(?)

ConnectString db 1024 dup(?)

.data

SQLStatement db "select * from main",0

WhereStatement db " where name=?",0

strConnect db "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=",0

DBName db "test.mdb",0

ConnectCaption db "Complete Connection String",0

Disconnect db "Disconnect successful",0

AppName db "ODBC Test",0

AllocEnvFail db "Environment handle allocation failed",0

AllocConnFail db "Connection handle allocation failed",0

SetAttrFail db "Cannot set desired ODBC version",0

NoData db "You must type the name in the edit box",0

ExecuteFail db "Execution of SQL statement failed",0

ConnFail db "Connection attempt failed",0

AllocStmtFail db "Statement handle allocation failed",0

Heading1 db "Name",0

Heading2 db "Surname",0

Heading3 db "Telephone No.",0

.code

start:

invoke GetModuleHandle, NULL

mov hInstance,eax

call GetProgramPath

invoke DialogBoxParam, hInstance, IDD_MAINDLG,0,addr DlgProc,0

invoke ExitProcess,eax

invoke InitCommonControls

DlgProc proc hDlg:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD

.if uMsg==WM_INITDIALOG

invoke GetMenu, hDlg

mov hMenu,eax

invoke GetDlgItem, hDlg, IDC_DATALIST

mov hList,eax

call InsertColumn

.elseif uMsg==WM_CLOSE

invoke GetMenuState, hMenu, IDM_CONNECT,MF_BYCOMMAND

.if eax==MF_GRAYED

invoke ODBCDisconnect, hDlg

.endif

invoke EndDialog,hDlg, 0

.elseif uMsg==WM_COMMAND

.if lParam==0

mov eax,wParam

.if ax==IDM_CONNECT

invoke ODBCConnect,hDlg

.elseif ax==IDM_DISCONNECT

invoke ODBCDisconnect,hDlg

.elseif ax==IDM_QUERY

invoke RunQuery,hDlg

.elseif ax==IDM_CUSTOMQUERY

invoke DialogBoxParam, hInstance, IDD_QUERYDLG,hDlg, addr QueryProc, 0

.endif

.endif

.else

mov eax,FALSE

ret

.endif

mov eax,TRUE

ret

DlgProc endp

GetProgramPath proc

invoke GetModuleFileName, NULL,addr ProgPath,sizeof ProgPath

std

mov edi,offset ProgPath

add edi,sizeof ProgPath-1

mov al,"\"

mov ecx,sizeof ProgPath

repne scasb

cld

mov byte ptr [edi+2],0

ret

GetProgramPath endp

SwitchMenuState proc Flag:DWORD

.if Flag==TRUE

invoke EnableMenuItem, hMenu, IDM_CONNECT, MF_GRAYED

invoke EnableMenuItem, hMenu, IDM_DISCONNECT, MF_ENABLED

invoke EnableMenuItem, hMenu, IDM_QUERY, MF_ENABLED

invoke EnableMenuItem, hMenu, IDM_CUSTOMQUERY, MF_ENABLED

.else

invoke EnableMenuItem, hMenu, IDM_CONNECT, MF_ENABLED

invoke EnableMenuItem, hMenu, IDM_DISCONNECT, MF_GRAYED

invoke EnableMenuItem, hMenu, IDM_QUERY, MF_GRAYED

invoke EnableMenuItem, hMenu, IDM_CUSTOMQUERY, MF_GRAYED

.endif

ret

SwitchMenuState endp

ODBCConnect proc hDlg:DWORD

invoke SQLAllocHandle, SQL_HANDLE_ENV, SQL_NULL_HANDLE, addr hEnv

.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO

invoke SQLSetEnvAttr, hEnv,SQL_ATTR_ODBC_VERSION, SQL_OV_ODBC3,0

.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO

invoke SQLAllocHandle, SQL_HANDLE_DBC, hEnv, addr hConn

.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO

invoke lstrcpy,addr ConnectString,addr strConnect

invoke lstrcat,addr ConnectString, addr ProgPath

invoke lstrcat, addr ConnectString,addr DBName

invoke SQLDriverConnect, hConn, hDlg, addr ConnectString, sizeof ConnectString, addr Conn, sizeof Conn,addr StrLen, SQL_DRIVER_COMPLETE

.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO

invoke SwitchMenuState,TRUE

invoke MessageBox,hDlg, addr Conn,addr ConnectCaption,MB_OK+MB_ICONINFORMATION

.else

invoke SQLFreeHandle, SQL_HANDLE_DBC, hConn

invoke SQLFreeHandle, SQL_HANDLE_ENV, hEnv

invoke MessageBox, hDlg, addr ConnFail, addr AppName, MB_OK+MB_ICONERROR

.endif

.else

invoke SQLFreeHandle, SQL_HANDLE_ENV, hEnv

invoke MessageBox, hDlg, addr AllocConnFail, addr AppName, MB_OK+MB_ICONERROR

.endif

.else

invoke SQLFreeHandle, SQL_HANDLE_ENV, hEnv

invoke MessageBox, hDlg, addr SetAttrFail, addr AppName, MB_OK+MB_ICONERROR

.endif

.else

invoke MessageBox, hDlg, addr AllocEnvFail, addr AppName, MB_OK+MB_ICONERROR

.endif

ret

ODBCConnect endp

ODBCDisconnect proc hDlg:DWORD

invoke SQLDisconnect, hConn

invoke SQLFreeHandle, SQL_HANDLE_DBC, hConn

invoke SQLFreeHandle, SQL_HANDLE_ENV, hEnv

invoke SwitchMenuState, FALSE

invoke ShowWindow,hList, SW_HIDE

invoke MessageBox,hDlg,addr Disconnect, addr AppName,MB_OK+MB_ICONINFORMATION

ret

ODBCDisconnect endp

InsertColumn proc

LOCAL lvc:LV_COLUMN

mov lvc.imask,LVCF_TEXT+LVCF_WIDTH

mov lvc.pszText,offset Heading1

mov lvc.lx,150

invoke SendMessage,hList, LVM_INSERTCOLUMN,0,addr lvc

mov lvc.pszText,offset Heading2

invoke SendMessage,hList, LVM_INSERTCOLUMN, 1 ,addr lvc

mov lvc.pszText,offset Heading3

invoke SendMessage,hList, LVM_INSERTCOLUMN, 3 ,addr lvc

ret

InsertColumn endp

FillData proc

LOCAL lvi:LV_ITEM

LOCAL row:DWORD

invoke SQLBindCol, hStmt,1,SQL_C_CHAR, addr TheName, sizeof TheName,addr NameLength

invoke SQLBindCol, hStmt,2,SQL_C_CHAR, addr TheSurname, sizeof TheSurname,addr SurnameLength

invoke SQLBindCol, hStmt,3,SQL_C_CHAR, addr TelNo, sizeof TelNo,addr TelNoLength

mov row,0

.while TRUE

mov byte ptr ds:[TheName],0

mov byte ptr ds:[TheSurname],0

mov byte ptr ds:[TelNo],0

invoke SQLFetch, hStmt

.if ax==SQL_SUCCESS || ax==SQL_SUCCESS_WITH_INFO

mov lvi.imask,LVIF_TEXT+LVIF_PARAM

push row

pop lvi.iItem

mov lvi.iSubItem,0

mov lvi.pszText, offset TheName

push row

pop lvi.lParam

invoke SendMessage,hList, LVM_INSERTITEM,0, addr lvi

mov lvi.imask,LVIF_TEXT

inc lvi.iSubItem

mov lvi.pszText,offset TheSurname

invoke SendMessage,hList,LVM_SETITEM, 0,addr lvi

inc lvi.iSubItem

mov lvi.pszText,offset TelNo

invoke SendMessa

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 7:02:36

基于VUE的健康公益平台[VUE]-计算机毕业设计源码+LW文档

摘要:随着社会对健康和公益事业的关注度不断提高,构建一个高效、便捷的健康公益平台具有重要的现实意义。本文基于Vue框架设计并实现了这样一个平台,旨在整合健康资源与公益力量,为用户提供健康知识普及、公益活动参与、公益组织管…

作者头像 李华
网站建设 2026/4/2 6:36:14

Open-AutoGLM与Applitools视觉测试对决(90%团队忽略的关键指标)

第一章:Open-AutoGLM与Applitools视觉测试对决(90%团队忽略的关键指标)在自动化测试领域,视觉回归测试正逐渐成为保障UI一致性的核心手段。然而,大多数团队仅关注截图比对的“通过率”,却忽视了诸如像素差异…

作者头像 李华
网站建设 2026/4/2 15:22:00

学术探索新航标:书匠策AI——本科硕士论文写作的智能伙伴

在学术的浩瀚海洋中,每一位本科生和硕士生都是勇敢的航海家,怀揣着对知识的渴望和对真理的追求,不断探索未知的领域。然而,面对堆积如山的文献资料、错综复杂的逻辑框架以及繁琐的格式调整,不少学子常常感到力不从心。…

作者头像 李华
网站建设 2026/3/23 2:32:20

Open-AutoGLM集成难题全解析,从零搭建报价系统的最佳路径

第一章:Open-AutoGLM报价系统的核心价值与应用场景Open-AutoGLM报价系统是一款基于大语言模型(LLM)驱动的智能报价解决方案,专为提升企业销售响应效率与定价精准度而设计。该系统融合自然语言理解、历史数据分析与动态定价算法&am…

作者头像 李华
网站建设 2026/3/27 5:56:35

为什么顶级企业都在转向Open-AutoGLM?与WinAutomation的4项碾压性优势

第一章:Open-AutoGLM与WinAutomation性能对比的全局视角在自动化技术快速演进的背景下,Open-AutoGLM 与 WinAutomation 作为两类代表性工具,分别体现了基于大语言模型的任务编排能力与传统桌面流程自动化的工程化思路。二者在架构设计、执行效…

作者头像 李华