您好,欢迎访问三七文档
当前位置:首页 > 金融/证券 > 投融资/租赁 > 第七章 更灵活的寻址方式
第七章更灵活的寻址方式本章要点逻辑运算指令[bx+idata]访问内存单元SI、DI寄存器[bx+si/di+idata]访问内存单元不同寻址方式的灵活运用逻辑运算指令AND:逻辑与指令格式:AND目的操作数,源操作数功能:按位进行与运算,结果放到目的操作数例如:moval,01100011bandal,00111011b执行后al=00100011bOR:逻辑或运算格式:OR目的操作数,源操作数功能:按位进行或运算,结果放到目的操作数例如:moval,01100011boral,00111011b执行后al=01111011b逻辑运算指令(续)NOT:逻辑非格式:not操作数功能:按位进行非运算例如:moval,01100011bnotal执行后,al=10011100bXOR:逻辑异或(相同为0,不同为1)格式:xor目的操作数,源操作数功能:按位进行异或运算例如:moval,01100011bxoral,00111011b执行后,al=01011000b逻辑运算指令的作用and指令:可将操作对象相应位设为0,其他位不变例如:将al的第6位设为0:andal,10111111将al的第7位设为0:andal,01111111or指令:可将操作对象相应位设为0,其他位不变例如:将al的第6位设为1:oral,01000000将al的第7位设为1:oral,10000000逻辑运算指令的作用(续)XOR指令:可将操作数的相应位变反,其他位不变例如:将al的第0,1位变反:xoral,3ASCII码知识回顾ASCII编码:计算机系统中最常用的一种字符的编码方案,用一个字节来表示一个字符。例:‘A’41H01000001B‘a’61H01100001B‘1’31H00110001B换行0AH00001010B回车0DH00001101B空格20H00100000Bb6b5b4b3b2b1b00000010100111001011101110000NULDLESP0@P`p0001S0HDC1!1AQaq0010STXDC2“2BRbr0011ETXDC3#3CScs0100E0TDC4$4DTdt0101ENQNAK%5EUeu0110ACKSYN&6FVfv0111BELETB‘7GWgw1000BSCAN(8HXhx1001HTEM)9IYiy1010LFSUB*:JZJz1011VTESC+;K[K{1100FFFS,L\L|1101CRGS-=M]M}1110S0RS.N^N~1111S1US/?O_oDEL字符0~9的高3位编码为011,低4位0000~1001(恰好是二进制形式的0~9,有利于ASCII码与二进制码之间的转换)大写字符与小写字符的ASCII码值相差在b5位控制字符(非打印字符)控制字符(非打印字符)DEL有形字符(可打印字符)字符形式的数据assumeds:datadatasegmentdb‘unIX’;等价于db75h,6Eh,49h,58hdb‘foRK’;等价于db66h,6Fh,52h,4Bhdataendscodesegmentstart:moval,’a’movbl,’b’movax,4c00hint21hcodeendsendstart大小写转换问题问题:在codesg中填写代码,将datasg中的第一个字符串转化为大写,第二个字符串转化为小写assumecs:codesg,ds:datasgdatasgsegmentdb‘BaSic’db‘iNfOrMaTiOn’datasgendscodesgsegmentstart:?codesgendsendstart分析:[bx+idata]访问内存单元[bx+idata]表示一个内存单元,其偏移地址为(bx)+idata的值,偏移地址在DS中例如:movax,[bx+200]其他常用格式:movax,[200+bx]movax,200[bx]movax,[bx].200问题7.1用Debug查看内存,结果如下:2000:1000BE0006000000……写出下面程序执行后,ax,bx,cx寄存器的内容movax,2000Hmovds,axmovbx,1000Hmovax,[bx]movcx,[bx+1]addcx,[bx+2](ax)=00BEH,(bx)=1000H,(cx)=0606H用[bx+idata]的方式处理数组问题:在codesg中填写代码,将datasg中的第一个字符串转化为大写,第二个字符串转化为小写assumecs:codesg,ds:datasgdatasgsegmentdb‘BaSic’db‘MinIX’datasgendscodesgsegmentstart:?codesgendsendstart原来的方法改进后的方法同高级语言程序比较char[]a=BaSiC;char[]b=MinIX;main(){inti=0;do{a[i]=a[i]&0xDF;b[i]=b[i]|0x20;i++;}while(i5);}SI和DI寄存器SI和DI寄存器,可以和BX寄存器一样,实现寄存器间接寻址例如:movsi,0movdi,0movax,[si]movax,[di]movdi,0movsi,0movax,[di+123]movax,[si+123]问题7.2用寄存器SI和DI实现将字符串'welcometomasm!'复制到它后面的数据区中assumecs:codesg,ds:datasgdatasgsegmentdb'welcometomasm!'db'..............................'datasgends[bx+si]和[bx+di][bx+si]表示一个内存单元,偏移地址为(bx)+(si)movax,[bx+si]指令含义:数学描述:(ax)=((ds)*16+(bx)+(si))其他形式:movax,[bx][si]问题7.4用Debug查看内存,结果如下:2000:1000BE0006000000……写出下面程序执行后,ax,bx,cx寄存器的内容movax,2000Hmovds,axmovbx,1000Hmovsi,0movax,[bx+si]incsimovcx,[bx+si]incsimovdi,siaddcx,[bx+di][bx+si+idata]和[bx+di+idata][bx+si+idata]表示一个内存单元,偏移地址为(bx)+(si)+idatamovax,[bx+si+idata]指令含义:数学描述:(ax)=((ds)*16+(bx)+(si)+idata)其他形式:movax,[bx+200+si]movax,[200+bx+si]movax,200[bx][si]movax,[bx].200[si]movax,[bx][si].200问题7.5用Debug查看内存,结果如下:2000:1000BE0006000000……写出下面程序执行后,ax,bx,cx寄存器的内容movax,2000Hmovds,axmovbx,1000Hmovsi,0movax,[bx+2+si]incsimovcx,[bx+2+si]incsimovdi,siaddcx,[bx+2+di]不同寻址方式的灵活应用定位内存地址的方法:[idata][bx/si/di][bx/si/di+idata][bx+si/di][bx+si/di+idata]问题7.6编程,将datasg段中每个单词的头一个字母改为大写字母assumecs:codesg,ds:datasgdatasgsegmentdb‘1.file’db‘2.edit’db‘3.search’db‘4.view’db‘5.options’db‘6.help’datasgendscodesgsegmentstart:codesgendsendstartdatasg中的数据的存储结构处理过程:R=第一行的地址movcx,6s:改变R行,3列的字母为大写R=下一行的地址Loops问题7.7编程:将datasg段中每个单词改为大写字母assumecs:codesg,ds:datasgdatasgsegmentdb‘ibm’db‘dec’db‘dos’db‘vax’datasgendscodesgsegmentstart:codesgendsendstartdatasg中的数据的存储结构处理过程:R=第一行的地址;movcx,4s0:C=第一列的地址movcx,3s:改变R行,C列的字母为大写C=下一列的地址;loopsR=下一行的地址Loops0具体代码如下:movax,datasgmovds,axmovbx,0movcx,4s0:movsi,0movcx,3s:moval,[bx+si]andal,11011111bmov[bx+si],alincsiloopsandbx,16loops0注意:此处cx中内容的变化思考:此处cx中内容是多少?改进的代码——使用reg进行暂存movax,datasgmovds,axmovbx,0movcx,4s0:movdx,cxmovsi,0movcx,3s:moval,[bx+si]andal,11011111bmov[bx+si],alincsiloopsandbx,16movdx,cxloops0注意:此处cx中内容的变化思考:此处cx中内容是多少?改进的代码——使用内存进行暂存使用内存单元暂存数据可以使用栈来暂存数据问题7.9编程,将datasg段中每个单词的前4个字母改为大写字母:assumecs:codesg,ss:stacksg,ds:datasgstacksgsegmentdw0,0,0,0,0,0,0,0stacksgendsdatasgsegmentdb‘1.display’db‘2.brows’db‘3.replace’db‘4.modify’datasgendscodesgsegmentstart:codesgendsendstartdatasg中的数据的存储结构分析和处理过程:R=第一行的地址;movcx,4s0:C=第一个要修改的列相对于起始列的地址movcx,4s:改变R行,3+C列的字母为大写C=下一个要修改的列相对于起始列的地址loopsR=下一行的地址loops0本章小结寻址方式的意义和灵活应用[bx/si/di+idata][bx+si/di][bx+si/di+idata]二重循环问题的解决栈的应用大小写转换问题逻辑运算指令
本文标题:第七章 更灵活的寻址方式
链接地址:https://www.777doc.com/doc-3845356 .html