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

2024-12-29 19:40:29
推荐回答(4个)
回答1:

字符串操作指令是对一片连续存储单元进行处理,这片存储单元是由隐含指针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

回答2:

例子就没有了 以下希望能有所帮助
1 串传送指令:DF决定DI增减当DF=0时(由CLD指令设置),按增量修改;若DF=1(由STD指令设置),按减量修改。
格式:
MOVS 目的串,源串
MOVSB ;字节操作
MOVSW ;字操作
功能: [ES:DI] ← [DS:SI]
SI ← SI±1,DI ← DI±1 (字节操作) 或
SI ← SI±2,DI ← DI±2 (字操作)

2 串比较指令:将由SI作为指针的源串中的一个元素(字节或字)与由DI为指针的目的串的相应元素相比较(源串减去目的串,结果不送回目的串,但影响标志位)
格式:
CMPS 源串,目的串
CMPSB ;字节操作
CMPSW ;字操作
功能: [DS:SI] - [ES:DI]
SI ← SI±1,DI ← DI±1 (字节操作) 或
SI ← SI±2,DI ← DI±2 (字操作)

3 串扫描指令:将AL或AX的内容减去由DI作为指针的目的串元素,结果影响标志寄存器,但AL/AX内容不变。
格式:
SCAS 目的串
SCASB ;字节操作
SCASW ;字操作
功能: AL/AX - [ES:DI]
DI ← DI±1(字节操作) 或
DI ← DI±2(字操作)

4 串送存指令:将AL或AX的内容传送到由DI作为指针的目的串中,然后自动修改地址指针,指向下一元素。
格式:
STOS 目的串
STOSB ;字节操作
STOSW ;字操作
功能: [ES:DI] ← AX/AL
DI ← DI±1(字节操作) 或
DI ← DI±2(字操作)

回答3:

LODS是用来取指令和字符的,基本就是用来取内存的数据!其中SB是按字节取,sw按字取,sd是按双字取!这个指令基本不与rep一起用。
mov al soucre[si]
lodsb
这里吧指令取了以后放在AL中,让字去以后放在ax中,双字则放在DX:AX中
STOB显然是存指令的,而stosb是按字节存,sw是按字存,sd是按双字存!
比如
stosb则是与lodsb相反,他把al中的内容放在目标寄存器里!
其他的都差不多!!!呵呵,这个主要是自学,做几个题!!!自己慢慢就懂了!

回答4:

阿门 这个只能去intel网站下载intel指令手册了 如何能说得清楚。