Benina (2007)
Bài này chỉ có tính
chất tổng hợp lưu trữ để tra cứu khi lập trình. Hòan tòan ko có gì cao siêu
cả.
- Nối 2 string
lại với nhau:
Sử dụng: hàm lstrcat
Cú pháp:
Hàm lstrcat function nối một string với một string khác.
LPTSTR lstrcat(
LPTSTR lpString1, // address
of buffer for concatenated strings
LPCTSTR lpString2 // address
of string to add to string1
);
Parameters
lpString1
Points đến một null-terminated string. Buffer phải lớn đủ đến chứa cá hai
strings.
lpString2
Points đến một null-terminated string để nối với
string đươc chỉ định trong lpString1 parameter.
Return Values
Nếu hàm thành công, giá trị
trả về là một pointer buffer (biến vùng
đệm).
Nếu hàm bị fails,giá trị trả về là NULL. Lấy thông
tin lỗi bằng cách gọi hàm GetLastError.
Ví dụ:
Ta có 2
biến:
szText1 db "Newbie hihi",0
szText2 db
"-Benina Haha",0
Gọi
hàm:
invoke lstrcat,addr szText1,addr szText2
Kết quả :
szText1=”Newbie
hihi- Benina Haha”
- Tính chiều
dài của một string:
Dùng hàm lstrlen
Cú pháp:
Hàm lstrlen trả về chiều dài đơn vị bytes (ANSI version) hay các ký tự
characters (Unicode version) của string
được chỉ định (ko bao
gồm ký tự kết thúc null).
int lstrlen(
LPCTSTR lpString // address
of string to count
);
Parameters
lpString
Trỏ đến một null-terminated string.
Return Values
Nếu thành công, giá trị trả về
chỉ định chiều dài của string đơn vị bytes (ANSI version) hay các ký tự
characters (Unicode version) của string
được chỉ định (ko bao
gồm ký tự kết thúc null).
Ví dụ:
invoke lstrlen,addr szText1
Chú ý: Khai báo
int là
vTemp dd 10 (bằng
với 1 giá trị thanh ghi)
Khác với khai báo
biến
vTemp db 10
Khai
báo biến trong asm:
dd
là dword (4bytes)
dw
là word (2bytes)
db
là byte (1byte)
- Convert một
string
Cú pháp:
The wsprintf
function formats and stores a series of characters and values in a buffer. Any
arguments are converted and copied to the output buffer according to the
corresponding format specification in the format string. The function appends a
terminating null character to the characters it writes, but the return value
does not include the terminating null character in its character count.
Hàm
wsprintf định dạng và chứa một chuổi các ký tự và các giá trị trong
buffer. Bất kỳ đối số nào được convert và copy đến buffer xuất ra
ngòai được accord (thu
lại)
thành chi tiết định dạng
tương ứng trong chuổi định dạng
format
string. Hàm dựa vào ký tự kết thúc null của chuổi ký tự mà nó
write, nhưng giá trị trả về ko bao hàm ký tự kết thúc null trong tổng
số các ký tự của nó
int
wsprintf(
LPTSTR lpOut, // pointer to buffer for output
LPCTSTR lpFmt, // pointer to format-control string
... // optional
arguments
);
Parameters
lpOut
Points to a buffer
to receive the formatted output.
Trỏ
đến buffer để nhận dữ liệu xuất ra được định
dạng
lpFmt
Points to a
null-terminated string that contains the format-control specifications. In
addition to ordinary ASCII characters, a format specification for each argument
appears in this string. For more information about the format specification, see
the Remarks section.
Trỏ
đến a null-terminated string chứa các chi tiết điều khiển định dạng.
Thêm vào các ký tự ASCII thông thường, chi tiết định dạng cho mỗi đối số xuất
hiện trong string này. Xem
thêm
thông tin về chi tiết định dạng, xem trong phần remark (nhận
xét)
...
Specifies one or
more optional arguments. The number and type of argument parameters depend on
the corresponding format-control specifications in the lpFmt parameter.
Chỉ định một hay nhiều hơn
các đối số định dạng. Số và lọai của các thông số đối số dựa vào
các chi tiết điều khiển định dạng trong tham số
lpFmt
Return
Values
If the function
succeeds, the return value is the number of characters stored in the output
buffer, not counting the terminating null character.
If the function
fails, the return value is less than the length of the format-control string. To
get extended error information, call GetLastError.
Nếu
hàm thành công, giá trị trả về là một số các ký tự trong output
buffer, ko tính ký tự kết thúc null,. Nếu hàm bị sai (fail), giá trị trả về nhỏ hơn chiều dài của
format-control string. Để lấy thêm
thông
tin về lỗi xảy ra error, hảy gọi hàm
GetLastError
Remarks
The format-control
string contains format specifications that determine the output format for the
arguments following the lpFmt parameter. Format specifications, discussed below,
always begin with a percent sign (%). If a percent sign is followed by a
character that has no meaning as a format field, the character is not formatted
(for example, %% produces a single percent-sign character).
Chuổi điều khiển format chứa các thông số kỹ thuật định dạng
để xác định các định dạng xuất ra cho các đối số theo tham số lpFmt.
Các thông số kỹ thuật cho định dạng, được thảo luận bên dưới phần
này, luôn luôn bắt đầu bằng dấu phần trăm (%). Nếu dấu phần trăm được
theo bởi một ký tự mà ko có ý nghĩa như format field , ký tự này ko
được định dạng (ví dụ, %% sẽ sinh ra một ký tự đơn dấu phần
trăm(percent-sign, %)
The format-control
string is read from left to right. When the first format specification (if any)
is encountered, it causes the value of the first argument after the
format-control string to be converted and copied to the output buffer according
to the format specification. The second format specification causes the second
argument to be converted and copied, and so on. If there are more arguments than
format specifications, the extra arguments are ignored. If there are not enough
arguments for all of the format specifications, the results are undefined.
String điều khiển định dạng
(format-control string) được read từ trái sang phải. Khi
thông số kỹ thuật định dạng đầu tiên (hay bất kỳ) được chạm đến, nó
gây ra giá trị của đối số đầu tiên sau format-control string để được converted và copy đến
output buffer thâu lại thông số
format. Thông số định dạng thứ 2 gây ra đối số thứ hai được converted
và copy và vân vân. Nếu có nhiều hơn các đối số so với thông số
format, các đối số dư được bỏ qua. Nếu ko có đủ các đối số cho tất
cả các thông số định dạng, các kết quả ko được
xác
định
A format
specification has the following form:
Một
thông số kỹ thuật format theo dạng sau:
%[-][#][0][width][.precision]type
Each field is a
single character or a number signifying a particular (riêng biệt)format option.
The type characters that appear after the last optional format field determine
whether(được hay ko) the associated (kết hợp)argument is interpreted (thể
hiện) as a character, a string, or a number. The simplest format specification
contains only the percent sign and a type character (for example, %s). The
optional fields control other aspects of the formatting. Following are the
optional and required fields and their meanings:
Mỗi
field là một ký tự đơn hay một số đánh dấu một lựa chọn định dạng
riêng biệt. Các lọai ký tự mà nó xuất hiện sau field lựa chọn định
dạng sau hết, xác định được hay ko đối số kết hợp được thể hiện như
một ký tự, một string, hay là một số. Thông số kỹ thuật định dạng
đơn giản nhấtchỉ chứa dấu phần trăm và một lọai ký tự (ví dụ: %s).
Các fields lựa chọn(optional) điều khiển các diện mạo của sự định
dạng. Sau đây là các optional và các fields yêu cầu và ý nghĩa của
chúng
Field Meaning
-
Pad the output
with blanks or zeros to the right to fill the field width, justifying output to
the left. If this field is omitted, the output is padded to the left, justifying
it to the right.
-
Thêm
vào output các khỏang trống hay zero lắp từ fải sang chiều rộng field, canh lề output từ trái. Nếu field này
được bỏ qua, output được nối (pad)từ trái , canh lề
phải.
#
Prefix hexadecimal values with 0x (lowercase) or 0X
(uppercase).
Tiền tố các
giá trị hexa với 0x (lowercase) or 0X (uppercase).
0 Pad the output value with zeros
to fill the field width. If this field is omitted, the output value is padded
with blank spaces.
Nối giá trị
output với zeros lắp vào chiều rộng field. Nếu field này được bỏ qua ,
giá trị output được pad với các khỏang trống
sapces
width Copy the specified minimum number of
characters to the output buffer. The width field is a nonnegative integer. The
width specification never causes a value to be truncated; if the number of
characters in the output value is greater than the specified width, or if the
width field is not present, all characters of the value are printed, subject to
the precision specification.
Copy số các
ký tự nhỏ nhất được chỉ định đến output buffer. Chiều rộng field là
một int ko âm. Thông số width chưa bao giờ gây ra một giá trị bị cắt
bỏ; nếu số các ký tự trong giá trị output lớn hơn width được chỉ
định, hay nếu width field ko hiện diện, tất cả các ký tự của giá trị
được in ra, subject thông số chính xác rõ ràng
.precision(độ
chính xác) For numbers, copy the
specified minimum number of digits to the output buffer. If the number of digits
in the argument is less than the specified precision, the output value is padded
on the left with zeros. The value is not truncated when the number of digits
exceeds the specified precision. If the specified precision is 0 or omitted
entirely, or if the period (.) appears without a number following it, the
precision is set to 1.
For strings, copy the specified maximum
number of characters to the output buffer.
Cho
các số, copy số các digits nhỏ nhất được chỉ định đến output buffer.
Nếu số các digits trong đối số nhỏ hơn precision được chỉ định, giá
trị output được pad bên trái các zeros. Giá trị ko bị cắt xén khi số
các digits vưỡt quá specified precision. Nếu specified precision là 0 hay
được bỏ qua hòan tòan, hay nếu period (.) xuất hiện ngòai number sau
nó, precision là set bằng 1
Đối với string, copy số lớn nhất
được chỉ định ra output buffer.
type Output the corresponding argument as
a character, a string, or a number. This field can be any of the following
character sequences:
Ouput đối số tương ứng như một ký tự, một string, hay một
number. Field này có thể là bất kỳ sự phối hợp (dãy) ký tự sau
đây
Sequence Insert
(sự phối
hợp)
c A single character. The wsprintf
function ignores character arguments with a numeric value of zero. This sequence
is interpreted as type WCHAR when the calling application uses the #define
UNICODE compile flag and as type CHAR otherwise.
Một ký tự
đơn. Hàm wsprintf bỏ qua các đối số ký tự với giá trị số là zero. Sự phối hợp này được hiểu (được
phiên dịch) như là lọai WCHAR khi ứng dụng calling dùng #define UNICODE
làm biên dịch cờ flag và mặt khác như lọai CHAR
C A single character. This sequence
is interpreted as type CHAR when the calling application uses the #define
UNICODE compile flag and as type WCHAR otherwise.
Một ký tự đơn. Sự phối hợp này được hiểu (được
phiên dịch) như là lọai CHAR khi ứng dụng calling dùng #define UNICODE
làm biên dịch cờ flag và mặt khác
như lọai WCHAR
d
A signed decimal integer argument. This sequence is equivalent to the i
sequence.
Một
đối số số nguyên int thập phân có
dấu. Sự phối hợp này tương đương sự fối hợp i
hc, hC A single character. The wsprintf
function ignores character arguments with a numeric value of zero. This sequence
is always interpreted as type CHAR, even when the calling application uses the
#define UNICODE compile flag.
Một ký tự
đơn. Hàm wsprintf bỏ qua các đối số ký tự với một giá trị số zero.
Sự fối hợp này luôn được hiểu như lọai CHAR, ngay khi calling ứng dụng
dùng #define UNICODE là cờ biên dịch
hs, hS A string. This sequence is always
interpreted as type LPSTR, even when the calling application uses the #define
UNICODE compile flag.
Một
string. Phối hợp này luôn được thể hiện như lọai LPSTR, ngay khi app gọi dùng cờ
biên dịch #define UNICODE
i
A signed decimal integer. This sequence is equivalent to the d
sequence.
Một số nguyên
int thập phân có dấu. Sự phối hợp này tương đương sự fối hợp
d
lc, lC A single character. The wsprintf
function ignores character arguments with a numeric value of zero. This sequence
is always interpreted as type WCHAR, even when the calling application does not
use the #define UNICODE compile flag.
Một
ký tự đơn. Hàm wsprintf bỏ qua các đối số ký tự với một gía trị số zero. Sự kết
hợp này luôn được hiểu như là WCHAR,
ngay khi ứng dụng gọi ko sử dụng cờ biên dịch #define UNICODE.
ld
A long signed decimal integer. This sequence is equivalent to the li
sequence.
Một số nguyên thập
phân có dấu. Sự phối hợp này tương đương li
li
A long signed decimal integer. This sequence is equivalent to the ld
sequence.
Một số nguyên thập
phân có dấu. Sự phối hợp này tương đương
ld
ls, lS A string. This sequence is always
interpreted as type LPWSTR, even when the calling application does not use the
#define UNICODE compile flag. This sequence is equivalent to the ws
sequence.
Một
string. Sự phối hợp này luôn hiểu như là LPWSTR, ngay cả ứng dụng gọi ko dùng cờ
biên dịch #define UNICODE. Sự phối hợp này
tương đương ws
lu
A long unsigned integer.
Một số nguyên ko dấu dạng
long
lx, lX A long unsigned hexadecimal integer in
lowercase or uppercase.
Một số nguyên hex ko dấu dạng
long vết thường hay viết hoa
s A string. This sequence is
interpreted as type LPWSTR when the calling application uses the #define UNICODE
compile flag and as type LPSTR otherwise.
Một
string. Sự kết hợp này được thể hiện như lọai LPWSTR khi ứng dụng gọi dùng cờ
biên dịch #define UNICODE và mặt khác
như lọai LPSTR
S A string. This sequence(sự
phối hợp) is interpreted(giải thích, thể hiện, dịch ra) as type LPSTR
when the calling application uses the #define UNICODE compile flag and as type
LPWSTR otherwise.
Một
string. Sự kết hợp này được thể hiện như lọai LPSTR khi ứng dụng gọi dùng cờ
biên dịch #define UNICODE và mặt khác
như lọai
LPWSTR
u
An unsigned integer argument.
Một đối số nguyên ko
dấu
x, X An unsigned hexadecimal integer in
lowercase or uppercase.
Một số nguyên
hex ko dấu viết thường hoặc viết hoa
Note Unlike other Windows functions, wsprintf uses
the C calling convention (_cdecl), rather than the Pascal calling convention. As
a result, it is the responsibility of the calling process to pop arguments off
the stack, and arguments are pushed on the stack from right to left. In
C-language modules, the C compiler performs this task.
Không giống như các hàm khác của Windows, wsprintf dùng quy ước
gọi hàm C (_cdecl), đúng hơn quy ước gọi hàm Pascal. Như kết quả, nó
là trách nhiệm của tiến trình gọi hàm dùng POP các đối số ra ngòai
stack, và c1c đối số được PUSHed vào stack từ phải sang trái. Trong
C-language modules, trình biên dịch C thực hiện công tác
này.
Các ví dụ :
Ví dụ 1:
szFmt db '%4X',0
buffer dd 512 dup (0)
iEnter dd 0ab12h
invoke wsprintf,addr buffer,offset szFmt, iEnter
Dùng như vầy là
ko được:
invoke wsprintf,addr buffer,’%4X’, iEnter
Ví dụ 2: Các định dạng wsprintf:
szFmt db ‘%2d” =====
> là 2 số thập phân
szFmt db ‘%4d” ====== > là 4 số thập phân
szFmt db ‘%02d” =====
> là 2 số thập phân, nhưng nếu số thập phân có 1 chử số thì sẽ lắp số “0”
trước chử số đó
Như:
szFmt db ‘%02d”
1
thành “01”
Còn
nếu khai báo szFmt db ‘%2d” thì 1 là “
1”
Ví dụ 3:
stringout
db "Base address TEB (eax=FS:[18h]):
%lX
",0dh,0Ah
db "Base address TEB (ecx=d [eax+18h]):
%lX",0Dh,0Ah
db "Base address PEB (ebx=FS:[30h]:
%lX",0Dh,0Ah
db "Base address PEB (edx=d [eax+30h]):
%lX",0Dh,0Ah
db "Value at FS:[0] (esi=FS:[0]):
%lX",0Dh,0Ah
db "Value at d [eax] (edi=d
[eax]):
%lX",0
invoke wsprintf, addr buffer, offset
stringout,eax,ecx,ebx,edx,esi,edi
- Copy một
string đến 1 string:
Ta dùng hàm
lstrcpy
Cú pháp:
Hàm lstrcpy copies một string đến một buffer.
LPTSTR
lstrcpy(
LPTSTR lpString1, // address of buffer
LPCTSTR lpString2 // address of string to copy
);
Parameters
lpString1
Trỏ đến một buffer để nhận nội dung của string được trỏ đến
bởi tham số lpString2.
Buffer phải đủ lớn để chứa string, bao gồm cả terminating null character.
lpString2
Trỏ đến null-terminated string để được copy. .
Return Values
Nếu thành công , giá trị trả về là m65t pointer đến
buffer.
Nếu hàm sai, giá trị trả về là NULL. Gọi hàm GetLastError để lấy trong tin
lỗi.
Remarks
Với ký tự double-byte set (DBCS) version
of Windows, hàm này có thể được sử dụng để một DBCS string.
Đây là một ví dụ:
KeyProc
proc
invoke lstrcpy,ADDR szSerial,ADDR szName
ret
KeyProc
endp
Kết
quả là szSerial được gắn string trong szName
5. Hàm RtlZeroMemory lắp vùng nhớ với zeros
00
Hàm này lắp
một khối vùng nhớ buffer
với 00
RtlZeroMemory
Hàm RtlZeroMemory fills (lắp) một block of
memory bằng zeros, cho một pointer trỏ đến
block và chiều dài length, đơ vị
byte, để được filled.
VOID
RtlZeroMemory(
IN VOID UNALIGNED *Destination,
IN SIZE_T
Length
);
Parameters
Destination
Tỏ đến memory để filled bằng
zeros.
Length
Chỉ định số bytes để được fill.
zeroed.
Return Value
None
Ví dụ :
invoke RtlZeroMemory, addr buffer, 512
Kết quả là tại buffer sẽ
bị fill 512 bytes zero
6. Khai báo số hex trong MASM:
Khai báo hằng số
hex:
Cách khai báo số
hexa trong MASM là
0xxxxh
Var_temp dd
0AD12h === > thì
OK
Nếu khai
báo:
Var_temp dd
AD12h === > thì chương trình
ko OK
Chú
ý: Khi viết trình ta dùng tiếp đầu ngữ sz***** để đặt tên cho string kết thúc 0
để dễ dàng đọc code.
Benina (2007)