1.说明寻址方式(1)ADDAX,0A51H源:立即数寻址目的:寄存器寻址(2)MOVBL,DATA1源:直接寻址(变量作为符号位移量)EA=DATA1目的:寄存器寻址(3)MOVDS,AX源:寄存器寻址目的:寄存器寻址(4)ANDAL,VAR1+2源:直接寻址(表达式的计算在汇编阶段完成)EA=VAR1+2目的:寄存器寻址(5)TEST[SI],CL源:寄存器寻址目的:寄存器间接寻址EA=(SI)(6)ORARRY[BX],-1源:立即数寻址目的:基址寻址(位移量:ARRY,基址:(BX))EA=ARRY+(BX)(7)SUBDS:[01FEH],DX源:寄存器寻址目的:直接寻址(使用数值位移量作为偏移量)EA=01FEH(8)ADC[BP][DI],BH源:寄存器寻址目的:基址变址寻址(基址:(BP),变址:(DI),位移量:0,0位移量在语法上省略,但在机器指令中是存在的)EA=(BP)+(DI)+0(9)ANDCX,-19[BX][SI]源:基址变址寻址注意位移量部分,这里给了一个负数,语法上是允许的,汇编时位移量确定为-19的补码,但是实行寻址时这个补码被解释为无符号数,应该是0EDH。这条指令中给出负数位移量语法上可以通过,但是不符合常规用法。EA的三个分量在做加法时可以解释为补码(一般不这样解释),但是最终形成的EA一定是看作无符号数。EA=0FFEDH+(BX)+(SI);(注意,语法上使用负数做位移量,做加法时要使用它的16位补码,不是8位)目的:寄存器寻址(10)PUSHES源:寄存器寻址目的:目的操作数隐含使用(SP)指向的栈顶字单元(内存中),在机器指令中,其寻址由OPCODE决定,不由寻址方式字段决定,故不需要说明它的寻址方式。由OPCODE决定的寻址统称为隐含寻址。(11)CLC源:无源操作数目的:隐含使用FR的CF标志(寄存器中),由OPCODE决定,为隐含寻址。3.求执行两条指令后,各标志位的状态MOVAL,91;执行后,(AL)=91=5BHADDAL,0BAH加法执行如下:(十六进制加法,如果不习惯,也可采用先前的二进制加法)0BAH+05BH115HCF:显然最高位产生了进位(两个加数都是两位的,和却有三位),CF=1AF:低四位向高四位产生了进位(A+B产生进位),AF=1ZF:运算结果不为0,ZF=0SF:运算结果最高位为0(高四位:1H=0001B),SF=0OF:正+正=正(两个加数与和的符号位都为0),没有溢出,OF=04.求程序段分别的运行结果(1)MOVCL,20H[BX][SI]EA=20H+(BX)+(SI)=20H+0024H+0012H=0056H默认使用段寄存器DS,段基址:091D0H物理地址:段基址+EA=091D0H+0056H=09226H(09226H)=00F6H,这是以字为单位的内容描述,变成字节:(09226H)=0F6H,(09227H)=00H指令执行后,(CL)=(09226H)=0F6H(2)MOV[BP][DI],CXEA=0+(BP)+(DI)=0024H+0032H=0056H默认使用段寄存器SS,段基址:1E4A0H物理地址:段基址+EA=1E4A0H+0056H=1E4F6H指令执行完后,(1E4F6H)=(CX)=5678H(3)共两条指令,按顺序逐条分析1)LEABX,20H[BX][SI]EA=20H+(BX)+(SI)=20H+0024H+0012H=0056H指令执行完后,(BX)=EA=0056H2)MOVAX,2[BX]注意,此时BX的内容已变,不要再参照初始值,应该始终参照上一条指令的结果EA=2H+(BX)=2H+0056H=0058H默认使用段寄存器DS,段基址为091D0H物理地址=段基址+EA=091D0H+0058H=09228H指令执行完后,(AX)=(09228H)=1E40H(4)1)LDSSI,[BX][DI]EA=0+(BX)+(DI)=0024H+0032H=0056H默认使用段寄存器DS,段基址为091D0H物理地址为:段基址+EA=091D0H+0056H=09226H指令执行完后,(SI)=(09226H)=00F6H(DS)=(09228H)=1E40H2)MOV[SI],BX注意,此时SI、DS的内容已变,不要再参照初始值,应该始终参照上一条指令的结果EA=(SI)=00F6H默认使用段寄存器DS,段基址为1E400H物理地址为:1E400H+00F6H=1E4F6H指令执行完后,(1E4F6H)=(BX)=0024H(5)1)XCHGCX,32H[BX]EA=32H+(BX)=32H+0024H=0056H默认使用段寄存器DS,段基址为091D0H物理地址=091D0H+0056H=09226H执行指令后,(CX)=00F6H(09226H)=5678H2)XCHG20H[BX][SI],AXEA=20H+(BX)+(SI)=20H+0024H+0012H=0056H默认使用段寄存器DS,段基址为091D0H物理地址=091D0H+0056H=09226H注意,(09226H)经过上条指令已经发生变化指令执行完后,(09226H)=1234H(AX)=5678H5.使用4种不同寻址方式对同一个物理地址进行访问1)MOVAX,[BP]寄存器间接寻址,默认使用段寄存器SS2)MOVAX,100H[DI]MOVAX,220H[SI]变址寻址,默认使用段寄存器DS3)MOVAX,240H[BX]基址寻址,默认使用段寄存器DS4)MOVAX,[2C0H]MOVAX,SS:[470H]直接寻址,第一种使用DS段寄存器6.给了一定初始寄存器条件,问执行一段程序后,几个寄存器中应该是什么内容遇到这种题目,应当把所有寄存器列一个表格,每一条指令分析完后,填上新的一行寄存器内容,这样才不容易出错,逐条指令分析,每条指令都使用上条指令执行完后新的寄存器内容。下面我们按照这种思路来分析这段程序。(DS)=1234H,(SI)=124H,(12464H)=30ABH,(12484H)=464H(考试时可以用自己的方式简写寄存器状态,提高速度)1)LEASI,[SI]分析:EA=(SI)=124H指令执行完后,(SI)=(SI)=124H(注意LEA指令的功能,不要搞成MOV指令了)引起的寄存器内容变化:无(仅列出当前变化了的,能提高解题速度)2)MOVAX,[SI]分析:EA=(SI)=124H默认使用DS物理地址=12340H+124H=12464H执行后,寄存器变化为:(AX)=(12464H)=30ABH3)MOV[SI+22H],1200H分析:[SI+22H]=22H[SI]EA=22H+(SI)=22H+124H=146H默认使用DS物理地址=12340H+146H=12486H执行后,寄存器没有变化,存储单元变化为:(12486H)=1200H4)LDSSI,[SI+20H]分析:[SI+20H]=20H[SI]EA=20H+(SI)=20H+124H=144H默认使用DS物理地址=12340H+144H=12484H当前:(12484H)=464H(12486H)=1200H执行后,变化:(SI)=(12484H)=464H,(DS)=(12486H)=1200H5)ADDAX,[SI]分析:EA=(SI)=464H默认使用DS物理地址=12000H+464H=12464H执行后,变化:(AX)=(AX)+(12464H)=30ABH+30ABH=6156H7.假定了一些寄存器初始内容,问执行一段程序后某些寄存器和标志位的内容。初始:(AX)=0A5C6H,(CX)=0F03H1)STC执行后,CF=12)RCLAX,CL当前(CL)=03H,(AX)=1010010111000110B,CF=1执行后:(AX)=0010111000110110B=2E36H,CF=1,3)ANDAH,CH当前(AH)=02EH=00101110B(CH)=0FH=00001111B功能为提取低4位,执行后,AH=0EH,CF=0(强制清0)4)RCRAX,CL当前(CL)=03H,CF=0,(AX)=0E36H=0000111000110110B,执行后:CF=1,(AX)=1000000111000110B=81C6H8.初始:(AX)=0FC77H,(CX)=504H1)CLC执行后,CF=02)SARAX,CL当前(CL)=04H,(AX)=0FC77H=1111110001110111B算术右移4位(记得最高位补充符号),执行后(AX)=1111111111000111B=0FFC7H,CF=0。3)XCHGCH,CL当前(CH)=05H,(CL)=04H执行后,(CH)=04H,(CL)=05H4)SHLAX,CL当前(CL)=05H,(AX)=0FFC7H=1111111111000111B逻辑左移5位,执行后(AX)=1111100011100000B=0F8E0H,CF=110.初始:(AX)=0FFFFHINCAX执行后,(AX)=0000HNEGAX执行后,(AX)=0000HDECAX执行后,(AX)=0FFFFHNEGAX执行后,(AX)=0001H11.初始:(BX)=12FFH1)MOVCL,8执行后,(CL)=82)ROLBX,CL循环左移8位,相当于低8位和高8位交换,CF中保存高8位的最低位执行后,(BX)=0FF12H,CF=03)ANDBX,0FFH提取低8位,执行后,(BX)=0012H,CF=04)CMPBX,0FFH执行后,(BX)不变,(BX)=0012H因为作为无符号数,0012H00FFH,所以一定不够减,最高位产生借位,CF=1。被减数不等于减数,运算结果一定不为0,所以ZF=0。13.初始:(AX)=0FF60H1)STC执行后,CF=12)MOVDX,96执行后,(DX)=96=0060H3)XORDH,0FFH(DH)每位都被变反,执行后,(DH)=0FFH,特别注意CF=0(逻辑运算把CF强行清0)4)SBBAX,DX当前(AX)=0FF60H,(DX)=0FF60H,CF=0减法完成后(AX)=0,最高位没有产生借位,CF=015.编写程序片段(1)说明:SF标志在FR的第7位LAHFORAH,10000000B;使用置位模板SAHF(2)说明:高低4位互换,即循环移位4位。当然可以采用其它方法。MOVCL,4ROLAL,CL(3)注意:要求不使用ADD和ADC,那么可以考虑使用减法和求相反数结合MOVBX,BNEGBXPUSHAPOPCSUBC,BX(4)说明:32位无符号数右移,应结合使用SHR和RCR指令,由高到低进行右移,一次一次的进行移位,不要同时移动多位。SHRDX,1RCRAX,1SHRDX,1RCRAX,1(5)说明:奇数特征为其二进制表示最低位一定为1,把最低位置1即可,只需一条OR指令ORCX,1(6)说明:设置特定的16位变反模板,第1、3位取1,其余位取0,并使用XOR指令即可XORAX,0AH(7)说明:只需要把AX按位取反就得到需要的变反模板NOTAXXORBX,AX