Trao đổi với tôi

http://www.buidao.com

12/25/16

[MASM] APIs to manipulate strings

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ả.

  1. 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

  1. 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)


  1. 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


  1. 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)