80X86汇编语言程序设计——3.4 串数据传送指令 3.3输入输出指令
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(串操作的特点)
• 串指令用后缀B, W, 和D 来处理字节, 字和双字的串。
(串操作的特点)
1)
基本上有两种方法用来编写串指令:
操作数的定义指明了传送的长度
MOVS byte1, byte2
2)
编写不带操作数的指令 LEA DI, byte2 LEA SI, byte1 MOVSB ; byte2的地址 ; byte1的地址 ;把byte1 传送到 byte2
3.4 串数据传送指令
REP: 重复串前缀 MOVS: 移动串 LODS: 载入串 STOS: 存储串
串操作的特点 • 每条串指令每次以字节,字和双字形 式来做重复处理。
(串操作的特点)
• 串指令MOVS, STOS, CMPS, 和 SCAS通常 要求.EXE程序初始化ES,但这不是必须的, 它可以用DS中的同样的地址: 例子: MOV AX,@data ;得到数据段的地址 MOV DS, AX ; 把它存入DS和 MOV ES, AX ; ES中
;段地址B800 ;偏移量0 ;装入计数值 ;装入数据 ;清屏 ;返回 DOS
3.3 输入/输出指令 IN
从输入端口 传送一个字节 到 AL, 一个 字到AX 或 双字到EAX。 操作: (AL/AX /EAX) ( I/O 端口编码/DX)
格式:
IN AL/AX /EAX , PORT / DX
MOVS:串传送指令
MOVS ; 内存
ES:[DI]
内存
字节, 字, 双子 (DS:[SI])
+ 或 – DI 和SI , 方向标志位D所决定
( MOVS:串传送指令 )
LODS: 从串取指令
LODS ; AL (或 AX, 或 EAX)
(AL) / ( AX ) / (EAX)
内存
(DS:[SI])
(不影响DI, 不用REP)
( LODS: 从串取指令 )
(LODS: 从串取指令)
Data Segment
1002
Figure 12-
LODSW instruction operation (D=0)
(LODS: 从串取指令)
例子: 反转序列
STOS: 存入串指令
STOS ; 内存
( ES:[DI] )
L1: MOV AX, [SI] MOV [DI], AX INC SI INC DI LOOP L1 ;从DATASTR1获取字节 ; 字节存进DATASTR2 ;递增 ;CX 递减且重复
(REP: 重复串前缀) • REP 重复操作直到CX=0。 REPE / REPZ 当零标志(ZF)指示相等/为零时,重复 该操作;当ZF指示不相等/不为零时 或 CX减到零,停止重复。 REPNE/REPNZ 当ZF指示不相等/不为零时,重复该操作; 当ZF指示相等/为零或当CX减到零时,停 止重复。
( IN) 注意: 当端口编码<256(FFH),可以在指令中直接用此 编码。 当端口编码>256 (FFH), 须先吧端口编码存入 DX 寄存器中.。 例子: 从27H 端口读取数据, 从2F8H端口输出数据: IN AL, 27H ; port 27H < FFH MOV DX, 2F8H ; port 2F8H >FFH OUT DX, AL
(串操作的特点)
REP: 重复串前缀
除了LOADS) ,它根据你在CX中设置的初始 化的计数值重复地执行。
• REP前缀 直接放在串指令的前面(任何串指令,
格式:
REP 串指令
•
Such as: REP MOVSB 重复执行串指令,每执行一次,CX内容减1, 当(cx)=0时,才执行下一条指令。
(REP: 重复串前缀)
•
1) 2) 3Байду номын сангаас 4)
准备: SI 源串的首 址(或结尾地址) DI 目标串的首址(或结尾地址) CX 串的长度计数 设置方向标志(D)
(REP: 重复串前缀)
• 方向标志位D 决定重复操作的方向。 只用于串指令中; 使DI、SI 自动递增 (D=0) 或 自动递减 (D=1) • 2 方向标志控制指令: CLD 清除方向标志位D(D=0) 选择 自动递增。 STD 设置方向标志位D(D=1), 选择 自动递减
AL (或 AX, 或 EAX)
(AL) / ( AX ) / (EAX)
(不影响SI)
(STOS: 存入串指令)
(STOS: 存入串指令)
(STOS: 存入串指令)
例子: 用STOS 指令清屏 .MODEL TINY 0000 .CODE .STARTUP 0100 FC CLD 0101 B8 B800 MOV AX,0B800H 0104 8EC0 MOV ES,AX 0106 BF 0000 MOV DI,0 0109 B9 07D0 MOV CX,25*80 010C B8 0720 MOV AX,0720H 010F F3/ AB REP STOSW .EXIT END
( IN)
对比: IN AX, 27H MOV AX, 27H
;(AX) (27H port) ; executed,(AX)= 27H
OUT :
从AL传送一个字节, 从AX传送一个字 或 者 从EAX传送一个双字到输出端口。 操作: (I/O 端口编码/DX)
(AL/AX /EAX)
格式:
OUT PORT/DX, AX/AL
等效 :
例: (REP: 重复串前缀) DATASTR1 DB 25 DUP(‘*’) ;发送字段 DATASTR2 DB 25 DUP(‘ ‘) ;接受字段 … CLD ;清除方向标志 MOV CX,25 ;初始化25 个字节 LEA DI, DATASTR2 ;初始化接收 LEA SI, DATASTR1 ;初始化发送地址 REP MOVSB ;把 datastr1复制到 datastr2