第9章(轉(zhuǎn)移指令):
8086轉(zhuǎn)移指令:
無(wú)條件轉(zhuǎn)移指令祸憋,條件轉(zhuǎn)移指令,循環(huán)指令肖卧,過(guò)程蚯窥,中斷
offset(偽指令):取得標(biāo)號(hào)偏移地址(也就是要配合標(biāo)號(hào)使用))取得值相當(dāng)于一個(gè)常數(shù)(不能直接給段寄存器)
jmp(無(wú)條件跳轉(zhuǎn)):可以修改ip也可以修改cs和ip
?????? (基于偏移) jmp short 標(biāo)號(hào):修改ip機(jī)器指令不包含目的地址,包含偏移地址
??????????????? short 8位的轉(zhuǎn)移(-128~127)塞帐,near ptr 16位的轉(zhuǎn)移(-32769~32767)
?????? (基于目的地址)jmp far ptr 標(biāo)號(hào)
??????? (基于寄存器)jmp? 16位寄存器(存有轉(zhuǎn)移目的地址)
???????? (基于內(nèi)存)jmp word ptr 內(nèi)存單元地址(存有轉(zhuǎn)移目的地址)
???????????????? word段內(nèi)轉(zhuǎn)移 拦赠,dword段間轉(zhuǎn)移
jcxz(有條件跳轉(zhuǎn)指令)(都是短轉(zhuǎn)移(基于偏移(-127~128)))
???????? jcxz 標(biāo)號(hào)(若cx=0則轉(zhuǎn)移到標(biāo)號(hào)處)
loop(短轉(zhuǎn)移)循環(huán)cx次 loop會(huì)先對(duì)cx-1再判斷cx與0的關(guān)系(基于偏移(-127~128))
短跳轉(zhuǎn)越界會(huì)報(bào)錯(cuò)。
實(shí)際操作暴露的問(wèn)題:
??????? 1.32位方式cs在后葵姥,ip在前
???????? 2.不同數(shù)據(jù)段偏移地址互不影響
? ? ? ? 3.數(shù)據(jù)不能直接賦給內(nèi)存
? ? ? ? 4.實(shí)驗(yàn)8原理荷鼠,標(biāo)號(hào)代表的是偏移地址,在執(zhí)行之前得到并轉(zhuǎn)化榔幸,所以向上跳允乐。
實(shí)驗(yàn)9(彩色打印):
B8000H~BFFFFH為顯示緩沖區(qū)削咆,分8頁(yè)牍疏,默認(rèn)顯示第一頁(yè)(B8000H~B8F9FH)
??????? 一行共160個(gè)字節(jié),兩個(gè)字節(jié)表示一個(gè)字符(偶地址放ascii拨齐,奇地址放屬性各1字節(jié))(從0到159)
??????? 屬性: ? ? ? |? 7 ? ? ? ?? |? 6? |? 5? |? 4? | ? ? ? 3 ? ? ? |? 2? |? 1? |? 0? |
????????????????????????? BL??? ??? ? ? ? R??? G???? B?? ? ? ? I???? ? ?? R???? G?? B
??????????????????????? 閃爍??????????? 背景???????????????? 高亮??????? 前景
編程暴露的問(wèn)題:1.ss,cs值不能直接改變鳞陨,不能有像mov ss,ax這種
? ? ? ? ? ? ? ? ? 2.初始化應(yīng)在入棧,循環(huán)(標(biāo)號(hào))前
????????????????? 3.注意一個(gè)字占兩個(gè)內(nèi)存單元瞻惋,add bx,2而不是inc bx
第10章(call和ret):
ret指令:用棧中命令修改ip(出棧)(ip先正常加再被覆蓋)
retf指令:依次出棧ip和cs
call指令:將當(dāng)前ip(call指令下一個(gè)指令開(kāi)始地址)或cs和ip入棧厦滤,轉(zhuǎn)移(非短轉(zhuǎn)移)
??????? 基于標(biāo)號(hào): (段內(nèi))call 標(biāo)號(hào):ip入棧后到標(biāo)號(hào)處執(zhí)行
? ? ? ?? ? ? ? ? ? ? ? ? ?? (段間)call far ptr 標(biāo)號(hào) :cs入棧援岩,ip入棧后到標(biāo)號(hào)處執(zhí)行
???????? 基于寄存器:(段內(nèi)) ???? call 16位寄存器
??????? 基于內(nèi)存:(段內(nèi))call word ptr 內(nèi)存單元地址(ip入棧后執(zhí)行內(nèi)存單元中的地址)
?????????????????????????? (段間)call dword ptr 內(nèi)存單元地址(存放順序cs ip)(csip入棧后執(zhí)行內(nèi)存單元中的地址)
call+ret實(shí)現(xiàn)子程序:call和ret配對(duì)
???????? call到mov ax,4c00h int 21h后,再用ret返回回來(lái)就可以實(shí)現(xiàn)子程序調(diào)用
???????????? 子程序參數(shù)和結(jié)果需要寄存器較少時(shí)存放在寄存器中(參數(shù)寄存器掏导,結(jié)果寄存器)
????????????????????? 參數(shù)和結(jié)果較多時(shí)將批量數(shù)據(jù)存在內(nèi)存中或棧中享怀,首地址放在寄存器中
發(fā)生寄存器沖突(不同操作依賴同一寄存器)使用棧push pop來(lái)避免沖突
mul:乘法命令(mul 寄存器;mul byte ptr 內(nèi)存地址碘菜;mul word存在 ptr 內(nèi)存地址)
??????????????????????? 8位*8位(結(jié)果放入ax)默認(rèn)al*
?????????????????? ? ? 16位*16位(結(jié)果放入dx+ax)默認(rèn)ax*
實(shí)驗(yàn)代碼不難凹蜈,魚(yú)c論壇上都有(判斷0用cx+jcxz的方法)
檢測(cè)點(diǎn)暴露的問(wèn)題:1.sp和bp默認(rèn)段寄存器都是ss
??????????????????????????? 2.0B8000h部分是顯卡地址是動(dòng)態(tài)變化的,debug跟蹤會(huì)有問(wèn)題
?????????????????????????? 3.子程序設(shè)計(jì)時(shí)開(kāi)始入棧忍啸,ret出棧以提高通用性