目录
执行单元EU
BX指向的数据段,BP指向的堆栈段
该看p23
AX CX一定是数据,BX,DX可能是地址
MOV
MOV指令不影响标志位
MOV DX,09H(√)DX高八位是0,低八位是9
将 * 的ASCII码送入内存数据1000H开始的100个单元中
MOV DI,1000H
MOV CX,64H//常数100
MOV AL,2AH
AGAIN:MOV [DI],AL
INC DI
DEC CX
JNZ AGAIN//CX不为0就跳转
HLT
底下是高地址,上面是低地址,然后先压低地址,再压高地址
源操作数必须是存储器,目的操作数通常是间址寄存器
将变量的16位偏移地址写入到目标寄存器
MOV读取的内容,LEA读取的地址
将数据段中首地址为MEM1的50个字节的数据传送到同一逻辑段首地址为MEM2的区域存放,编写相应的程序段。
LEA SI,MEM1
LEA DI,MEM2
MOV CL,50
NEXT:MOV AL,[SI]
MOV [DI],AL//两个存储器中间不能直接传,需要通过寄存器
INC SI
INC DI
JNZ NEXT
HLT
I/O端口
IN acc,PORT 从端口地址读入数据到累加器
OUT PORT,acc 将累加器的值输出到端口中,acc只能是AL/AX
8位时,直接给出8位地址,16位时,端口地址由DX指定.
ADD
ADC 带进位加法 d<-d+s+C
INC,DEC将操作数视为无符号数,会影响标志位,但是不影响进位标志C
无符号进位标志看C,有符号看O
在内存的First和Secontd开始的区域中分别 存放着2F365H和 5E024 H两个数,要求求 其和,并存入Third中。
注意字长是32位,加完一次后需要再加2
MOV AX,First
ADD AX,Second
MOV Third,AX
MOV AX,First+2//要考虑进位,使用ADC
ADC AX,Second+2
MOV Third+2,AX
求内存数据段中M1为首和M2为首的两个20字节数之和,并将结果写入M2为首的区域.
//按字节
LEA SI,M1
LEA DI,M2
MOV CX,20
CLC//make CF = 0
NEXT:
MOV AL,[SI]
ADC [DI],AL// [DI]+Al+CF->[DI]
INC SI
INC DI
DEC CX
JNZ NEXT
HLT//暂停
//按字2
LEA SI,M1
LEA DI,M2
MOV CX,10
CLC//make CF = 0
NEXT:
MOV AX,[SI]
ADC [DI],AX// [DI]+Al+CF->[DI]
ADD SI,2
ADD DI,2
DEC CX
JNZ NEXT
HLT//暂停
SBB \(OPRD1-OPRD2-CF->OPRD1\)
NEG \(0-OPRD->OPRD\),执行后除非操作数为0,否则CF都是1.
80H或者8000H执行后结果不变,但是OF置1(溢出),其他情况下均置0.就是各位取反+1
LEA BX,MAX
LEA SI,BUF
MOV CL,20
MOV AL,[SI]
NEXT:
INC SI
CMP AL,[SI]
JNC GOON //CF=0转移
XCHG [SI],AL
GOON:DEC CL
JNZ NEXT//如果不为0就跳转
MOV [BX],AL
HLT
乘除运算指令
乘法指令隐含了存放被乘数的AL或AX,以及存放结果的AX或AX DX.
无符号乘法的操作数不能是立即数
除法
INC,DEC的执行不会影响CF,其他算术类指令会影响状态标志位
除了"非",其余指令的执行都会影响除AF外的标志
无论运算结果如何,都会使CFOF清零
AND AL,0FH 实现掩码
AND AX,AX 使得CFOF清零
从地址为3F8H端口读入一个字节数,如果该数bit1位为1,则可从38FH端口将DATA为首地址的1个字输出,否则不能进行数据传送
MOV DX,3F8H
WATT:IN AL,DX
AND Al,02H
JZ WATT
MOV DX,38FH
MOV AX,DATA
OUT DX,AX
OR 使得某些位为1
非运算对标志位无影响
XOR AX,AX 清零
TEST OPRD1,OPRD2,执行与运算,demo结果不写回
从地址为3F8H端口读入一个字节数,如果该数bit1位 bit3位和bit5位同时为1,则可从38FH端口将DATA为首地址的1个字输出,否则不能进行数据传送
LEA SI,DATA
MOV DX,3F8H
WATT:IN AL,DX
AND AL,2AH
XOR AL,2AH//0010 1010,如果这些位都是1,那么XOR后一定为0
JNZ WATT
MOV DX,38FH
MOV AX,[SI]
OUT DX,AX
当目标操作数为存储器操作数时,需要说明其字长,移动的位数只能是1或者是CL
算术左移逻辑左移:最高位移到CF,最低位为0
逻辑右移:最低位->CF,最高位0
算术右移:最低位->CF,最高位变符号位
循环移位可以戴震进位也可以不带CF
循环指令左右 对于某些状态进行测试
LEA SI,MI
LEA DI,M2
MOV CH,4
NEXT:MOV AL,[SI]
MOV BL,AL
AND AL,0FH
OR AL,30H
MOV [DI],AL
INC DI
MOV AL,BL//还原
MOV CL,4
SHR AL,CL
OR AL,30H
MOV [DI],AL
INC DI
INC SI
DEC CH
JNZ NEXT
HLT
要求两个操作数都在存储器,针对数据块和存储器的操作
串所在的区域 串的首地址 串的长度 方向
源串一般在数据段,偏移地址SI指定
目标串必须在附加段,由DI指定
串的长度由CX指定
操作方向DF=0增地址,DF=1减地址
REP CX!=0时,REP后的指令将继续重复执行
REPE CX!=0且ZF=1,重复执行
REPNE CX!=0且ZF=0,重复指令
MOVS
串扫描指令 用于在指定存储区域中寻找某个关键字
SCAS OPRD
MOV DI,2000H
MOV BX,DI
MOV CX,0AH
MOV AL,'A'
CLD//将DF清零,为增方向
REPNZ SCASB
JZ FOUND
MOV DI,0
JMP DONE
FOUND:DEC DI//注意停下的时候还在+1的位置
MOV DATA2,DI
INC DI
SUB DI,BX
DONE:
MOV DATA1,DI
HLT
LODS OPRD
AL<-[DS:SI]
AX<-[DS:SI]
将某个区域的数据串依次装入累加器,以便显示或输出到接口,
串存储指令
STOS OPRD
AL -> [ES:DI]
AX -> [ES:DI]
用于将内存中的某个区域置成相同的值
?
原文:https://www.cnblogs.com/Tony100K/p/11653755.html