参考:MASM32+Visual studio 2010写汇编程序入门
连接:https://blog.csdn.net/MaxWoods/article/details/44649685?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160182254019725222408586%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=160182254019725222408586&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v28-1-44649685.pc_first_rank_v2_rank_v28&utm_term=MASM32%2bVisual%20studio%202010%E5%86%99%E6%B1%87%E7%BC%96%E7%A8%8B%E5%BA%8F&spm=1018.2118.3001.4187
.386.model flat, stdcall
include kernel32.inc
includelib kernel32.lib
include msvcrt.inc
includelib msvcrt.lib
.data
szText db "xie chuan long is shuai",0
format db "length = %d",0AH,0.code
main PROC
LEA EDI, szText ;将字符串的初始地址放到EDI中去
MOV ECX,0FFFFFFFFH
MOV EAX,0;计数,初始值设为0
count:
CMP BYTE PTR [EDI],0;比较[EDI]的值(字符串的某个字符)是否为\0
PUSHFD ;将标志寄存器压入栈中
ADD EDI,1;将地址位+1
INC EAX ;还没看出[EDI]是否为\0,先加上再说
POPFD ;将标志寄存器出栈
LOOPNZ count ;观察ZF是否为0,如果不为0,循环count
DEC EAX ;因为最后把\0也加上了,所以要减去1
INVOKE crt_printf, addr format, EAX
INVOKE crt_getchar
INVOKE ExitProcess,0
main ENDP
END main
(4)结果展示
计算"xie chuan long is shuai"的长度=23
3.3.strcmp函数
(1)strcmp函数功能
int strcmp(string s1,string s2):如果s1=s2,输出为0;如果s1>s2
(s2更短,或s2对应字符的ASCII更小),输出为1;如果前两种情况都不是
,输出为-1。
(2)程序流图
注意:s1(i)的含义为:s1字符串的第i个字符
(3)代码实现
szText db "Reverse Engineering",0
szText2 db "Reverse Engineering",0;szText==szText2
szText3 db "Reverse Eng",0;szText>szText3
szText4 db "Reverse Engj",0;szText<szText4
szText5 db "Reverse Engh",0;szText>szText5
.code
main PROC
LEA ESI, szText
LEA EDI, szText2 ;result=0;LEA EDI, szText3 ;result=1;LEA EDI, szText4 ;result=-1;LEA EDI, szText5 ;result=1;话不多说,都在图中
compare:
MOV BL,[EDI]
CMP BYTE PTR [ESI],BL
JNE noequal
CMP BYTE PTR [ESI],0
JE equal
ADD ESI,1
ADD EDI,1
JMP compare
equal:
MOV EAX,0
JMP print
noequal:
MOV BL,[EDI]
CMP BYTE PTR [ESI],BL
JA bigger
smaller:
MOV EAX,-1
JMP print
bigger:
MOV EAX,1
print:
INVOKE crt_printf, addr format, EAX ;EAX=result
INVOKE crt_getchar
INVOKE ExitProcess,0
main ENDP
END main
.386.model flat, stdcall
include kernel32.inc
includelib kernel32.lib
include msvcrt.inc
includelib msvcrt.lib
.data
szText db "Reverse Engineering",0
chr db 'i'
format db "%d",0AH,0
result db "The program is over",0.code
main PROC
LEA EDI, szText
MOV ECX,0FFFFFFFFH
MOV EBX,1;EBX记录现在在字符串的哪个位置
equ0:
MOV CL,chr ;将要寻找的字符给CL
CMP BYTE PTR [EDI],0;比较现在EDI所在的位置字符是否为0
JE over ;如果为0,则程序结束
CMP BYTE PTR [EDI],CL ;否则,比较EDI所在字符是否为要找的字符'i'
JNE noprint ;如果不是,则直接开启下一个equ0循环
INVOKE crt_printf, addr format,EBX ;我们找到了'i'并输出,但是也许后面也有'i'哦!
noprint:
ADD EDI,1
ADD EBX,1
JMP equ0
over:
INVOKE crt_printf, addr result
INVOKE crt_getchar
INVOKE ExitProcess,0
main ENDP
END main
.386.model flat, stdcall
include kernel32.inc
includelib kernel32.lib
include msvcrt.inc
includelib msvcrt.lib
.data
szText db "xie chuan long is shuaige",0
chr db 'x'
siz db 3
format db "%d",0AH,0.code
main PROC
LEA EDI,szText
MOV ECX,0FFFFFFFFH
XOR ECX,ECX
XOR EDX,EDX
MOV DH,chr ;将要重复的字符chr->DH
MOV CL,siz ;将要复制的长度siz->CL
change:
CMP CL,0;比较CL是否为0,如果为0,则输出转换后的结果
JE print
MOV [EDI],DH ;将siz->EDI所处位置
ADD EDI,1;更新EDI与CL
DEC CL
JMP change
print:
INVOKE crt_printf, addr szText
INVOKE crt_getchar
INVOKE ExitProcess,0
main ENDP
END main
.386.model flat, stdcall
include kernel32.inc
includelib kernel32.lib
include msvcrt.inc
includelib msvcrt.lib
.data
szText db "xie chuan long is shuaige",0
chr db 128dup(0)
format db "%d",0AH,0.code
main PROC
LEA EDI,szText ;EDI指向要复制的字符串,ESI指向目的地址
LEA ESI,chr
MOV ECX,0FFFFFFFFH
copy:
CMP BYTE PTR [EDI],0;判断此时[EDI]是否为0
JE print ;如果为0,说明字符串已经到末尾,应该结束了
PUSH [EDI];将[EDI]->[ESI]
POP [ESI]
ADD EDI,1;将EDI与ESI增加1
ADD ESI,1
JMP copy
print:
INVOKE crt_printf, addr chr
INVOKE crt_getchar
INVOKE ExitProcess,0
main ENDP
END main