商务英语口语网 加入收藏  -  设为首页
您的位置:商务英语口语网 > 英语词汇 > 正文
汇编 字符串的比较 用cmpsb指令做。
汇编 字符串的比较 用cmpsb指令做。
提示:

汇编 字符串的比较 用cmpsb指令做。

很多错误,没有改,给了注释。
;输入一个字符串 与已知字符串比较,相等match 不等dismatch
data segment
str_s db 'apple'
str_d db 30,?,30 dup(?)
len_s dw $-str_s ;想保存字符串长度,不是这么写的
len_d dw $-str_d ;使用EQU
mess1 db 'match$'
mess2 db 'mismatch$' ;dismatch写成mismatch
;数据段没有结束符号

;一个数据段即可,这个段用来干嘛?
extra segment
x db 100 dup(?)
extra ends

code segment
assume cs:code,ds:data,es:extra
main proc far
start:
mov ax,data
mov ds,ax
mov ax,extra
mov es,ax

lea dx,str_d
mov ah,0ah
int 21h

lea si,str_s
lea di,str_d

cld
mov cx,len_s
repe cmpsb
jz l1
lea dx,mess2
jmp l2
L1:
lea dx,mess1
L2:
mov ah,09h
int 21h

mov ax,4c00h
int 21h
main endp
code ends
end start

修改后如下:
;输入一个字符串 与已知字符串比较,相等match 不等dismatch
data segment
str_s db 'apple'
len_s equ $-str_s
str_d db 30,?,30 dup(?)
mess1 db 'match$'
mess2 db 'dismatch$'
data ends

CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,data
MOV DS,AX
MOV ES,AX

;输入字符串
lea dx,str_d
mov ah,0ah
int 21h

;比较字符串长度是否一致
XOR CX,CX
MOV CL,str_d+1
CMP CX,len_s
JNE MS

;比较字符串中各元素是否一致
LEA SI,str_s
LEA DI,str_d+2

MAD:
MOV AL,DS:[SI]
MOV BL,ES:[DI]
CMP AL,BL
JNE MS

INC SI
INC DI
LOOP MAD

LEA DX,mess1
JMP SHORT SHOW

MS:
LEA DX,mess2

SHOW:
;输出匹配结果信息
MOV AH,09H
INT 21H

MOV AH,4CH
INT 21H
CODE ENDS
END START

汇编中关于字符串操作的指令
提示:

汇编中关于字符串操作的指令

字符串操作指令是对一片连续存储单元进行处理,这片存储单元是由隐含指针DS:SI或ES:DI来指定的。字符串操作指令可对内存单元按字节、字或双字进行处理,并根据操作对象的字节数使变址寄存器SI(或DI)增减1、2或4。具体规定如下:
(1)、当DF=0(由CLD指令设定)时,变址寄存器SI(或DI)增加1、2或4;
(2)、当DF=1(由STD指令设定)时,变址寄存器SI(或DI)减少1、2或4。

LODS、STOS、MOVS、INS、OUTS、CMPS、SCAS
-----------------------------------------
1、读字符串数据指令(Load String Instruction)
从由指针DS:SI所指向的内存单元开始,取一个字节、字或双字进入AL、AX或EAX中,并根据标志位DF对寄存器SI作相应增减。该指令的执行不影响任何标志位。

指令格式:LODS类型标识
LODSB
LODSW
LODSD ;80386+

LODS根据其类型标识的属性来决定读取存储单元的大小并将SI相应增减。
-----------------------------------------
2、写字符串数据指令(Store String Instruction)
该指令把寄存器AL、AX或EAX中的值存于以指针ES:DI所指向内存单元为起始的一片存储单元里,并根据标志位DF对寄存器DI作相应增减。该指令不影响任何标志位。

指令格式:STOS类型标识
STOSB
STOSW
STOSD ;80386+
-----------------------------------------
3、字符串传送指令(Move String Instruction)
该指令把指针DS:SI所指向的字节、字或双字传送给指针ES:DI所指向内存单元,并根据标志位DF对寄存器DI和SI作相应增减。该指令不影响任何标志位。

指令格式:MOVS类型标识
MOVSB
MOVSW
MOVSD ;80386+
-----------------------------------------
4、输入字符串指令(Input String Instruction)
该指令从某一指定的端口接受一个字符串,并存入一片存储单元之中。输入端口由DX指定,存储单元的首地址和读入数据的个数分别由ES:DI和CX来确定。在指令的执行过程中,还根据标志位DF对寄存器DI作相应增减。该指令不影响任何标志位。

与指令有关的操作数ES、DI、DX和CX等都是隐含操作数。

指令格式:INS类型标识
INSB
INSW
INSD ;80386+
-----------------------------------------
5、输出字符串指令(Output String Instruction)
该指令把一个字符串输入到指定的输出端口中。输出端口由DX指定,其输出数据的首地址和个数分别由DS:SI和CX来确定。在指令的执行过程中,还根据标志位DF对寄存器SI作相应增减。该指令的执行不影响任何标志位。

与指令有关的操作数DS、SI、DX和CX等都是隐含操作数。

指令格式:OUTS类型标识
OUTSB/OUTSW
OUTSD ;80286+
-----------------------------------------
6、字符串比较指令(Compare String Instruction)
该指令把指针DS:SI和ES:DI所指向字节、字或双字的值相减,并用所得到的差来设置有关的标志位。同时,变址寄存器SI和DI也将根据标志位DF的值作相应增减。

指令格式:CMPS类型标识
CMPSB
CMPSW
CMPSD ;80386+

受影响的标志位:AF、CF、OF、PF、SF和ZF
-----------------------------------------
7、字符串扫描指令(Scan String Instruction)
该指令用指针ES:DI所指向字节、字或双字的值与相应的AL、AX或EAX的值相减,用所得到的差来设置有关标志位。同时,变址寄存器DI还将根据标志位DF的值进行增减。

指令格式:SCAS类型标识
SCASB
SCASW
SCASD ;80386+

受影响的标志位:AF、CF、OF、PF、SF和ZF