Win32汇编数组学习2

时间:2024-02-18 16:41:42

之前学习过win32汇编数组;还不熟悉;继续熟悉;

先做几个基本的对话框,有一个静态文本框;

定义数组之后,用 wsprintf 函数格式化,然后调用 SetDlgItemText 赋值给静态文本框;

arr1 dd 101,202,303,607,903

    定义一个数组并赋初值,每个元素占4字节;
arr2 dd 3 dup(77)

    定义一个数组,3个元素,每元素占4字节,每个元素初始化为77;
arr3 dd 3 dup(?)

    定义数组,未初始化,将用0填充;
arr4 dd 2 dup(3 dup(7,9))

    定义嵌套数组,数组值依次是:7 9 7 9 7 9 7 9 7 9 7 9,一共占 48 字节;

格式化符;

fmt1   db '%d, %d, %d, %d, %d',0dh,0ah
       db '%d, %d, %d', 0dh,0ah
       db '%d, %d, %d', 0dh,0ah,0

0dh,0ah 是换行; 到0结束;

本来是想4个数组的值都显示在一个静态文本框;

但是4个数组的值一起格式化的时候,总显示这个错误;

根据资料,说要分行写,

invoke wsprintf,addr szbuf,addr fmt1,arr1, arr1[4], arr1[8], arr1[12], arr1[16],\
                               arr2, arr2[4], arr2[8],\
                               arr3, arr3[4], arr3[8],\
                               arr4,arr4[4],arr4[8],\
                               arr4[12],arr4[16],arr4[20],\
                               arr4[24],arr4[28],arr4[32],\
                               arr4[36],arr4[40],arr4[44]

已经分了多行;还是报这个错;

使用2个静态文本框,把arr4的值显示在第2个静态文本框;

asm,

		.386
		.model flat, stdcall
		option casemap :none

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

ICO_MAIN	equ	1000
DLG_MAIN	equ	100
IDC_INFO	equ 	101
IDC_INFO2	equ 	102

                .data
arr1 dd 101,202,303,607,903
arr2 dd 3 dup(77)
arr3 dd 3 dup(?)
arr4 dd 2 dup(3 dup(7,9))

szbuf db 500 dup(0)

		.data?

hInstance	dd	?
hWinMain	dd	?

		.const
fmt1   db '%d, %d, %d, %d, %d',0dh,0ah
       db '%d, %d, %d', 0dh,0ah
       db '%d, %d, %d', 0dh,0ah,0
fmt2   db '%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d', 0dh,0ah,0

		.code

_ProcDlgMain	proc	uses ebx edi esi hWnd,wMsg,wParam,lParam

		mov	eax,wMsg
		.if	eax ==	WM_CLOSE
			invoke	KillTimer,hWnd,1
			invoke	EndDialog,hWnd,NULL

		.elseif	eax ==	WM_INITDIALOG
			push	hWnd
			pop	hWinMain
			invoke	LoadIcon,hInstance,ICO_MAIN
			invoke	SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
                        invoke wsprintf,addr szbuf,addr fmt1,arr1, arr1[4], arr1[8], arr1[12], arr1[16],\
                               arr2, arr2[4], arr2[8],\
                               arr3, arr3[4], arr3[8]
                        invoke	SetDlgItemText,hWinMain,IDC_INFO,addr szbuf
                        invoke wsprintf,addr szbuf,addr fmt2,arr4,arr4[4],arr4[8],\
                               arr4[12],arr4[16],arr4[20],\
                               arr4[24],arr4[28],arr4[32],\
                               arr4[36],arr4[40],arr4[44]
                        invoke	SetDlgItemText,hWinMain,IDC_INFO2,addr szbuf

		.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

rc文件,


#include		<resource.h>

#define	ICO_MAIN		1000
#define	DLG_MAIN		100
#define	IDC_INFO		101
#define	IDC_INFO2		102

ICO_MAIN	ICON		"Main.ico"

DLG_MAIN DIALOG 188, 193, 140, 120
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "数组示例"
FONT 9, "宋体"
{
 LTEXT "", IDC_INFO, 6, 6, 135, 65
 LTEXT "", IDC_INFO2, 6, 80, 135, 45
}

 结果;