汇编语言实现字符串比较

2018-07-14  本文已影响0人  文泰ChrisTwain

基于x86处理器,32/64位机皆可运行,编译环境VS2017,使用到的链接库Irvine.32

代码段1:仅使用main过程,且未调用Irvine.32库,直接将比较结果存入EAX寄存器

.386
.model flat, stdcall
.stack 4096
ExitProcess proto,dwExitCode:dword

.data
str1 byte "hello", 0
str2 byte "hello", 0
num1 word ?
num2 word ?

.code
main proc
mov EBX, lengthof str1
mov EDX, lengthof str2
    cmp EBX, EDX
    JNE L1
    mov ecx, lengthof str1 
    sub ecx, 1
    L2: 
        mov BL, str1[ecx]
        mov DL, str2[ecx]
        cmp  EBX, EDX
        JNE L1
        loop L2
        mov eax, 1   ;1相等
        jmp L3
    L1: mov eax, 0   ;0不相等
    L3: 
    invoke ExitProcess,0
main endp
end main

附运行截图:

字符串不等 字符串相等

代码段2:使用多个过程分析逻辑代码,调用Irvine.32库输出匹配结果

.386
.model flat,stdcall
.stack 4096
ExitProcess proto,dwExitCode:dword
include Irvine32.inc

.data
MATCH BYTE "MATCH",0
NOMATCH BYTE "NOMATCH",0
STRING1 BYTE "hello world", 0
STRING2 BYTE "hello world", 0

.code
main proc
    mov eax, LENGTHOF STRING1
    CMP eax, LENGTHOF STRING2
    JNE L1
    CALL COMPARE
    JMP L3
    L1: CALL NO
    L3:
    invoke ExitProcess,0
main endp

COMPARE PROC
    mov ecx, LENGTHOF STRING1
    sub ecx, 1
L2:
    mov al, STRING1[ecx]
    cmp al, STRING2[ecx]
        JNE L4
    LOOP L2
    call YES
    JMP L5
    L4: call NO
    L5:
    RET
COMPARE ENDP

YES PROC
    mov edx, offset MATCH
    CALL WriteString
    CALL Crlf
    CALL WaitMsg
    RET
YES ENDP

NO PROC
    mov edx, offset NOMATCH
    CALL WriteString
    CALL Crlf
    CALL WaitMsg
    RET
NO ENDP

end main

附运行截图:

字符串相等 字符串不等

附:Irvine库下载地址
点击此处下载后可直接安装

附:Irvine库导入VS教程
1.工程目录右键->点击属性

打开工程属性

2.在Microsoft Macro Assemble的Include Paths里面填写Irvine库文件所在路径

Microsoft Macro Assemble的Include Paths

3.链接器->附加库目录里面也要添加附加库的路径,也就是Irvine库文件所在路径

链接器附加库目录

4.链接器->输入->附加依赖库里面添加要加载的库文件,这里是Irvine32.lib;勿忘加分号

链接器输入附加依赖库
上一篇 下一篇

猜你喜欢

热点阅读