尋址方式的靈活運(yùn)用(問(wèn)題7.6,7.7,7.9)

7.6問(wèn)題

問(wèn)題:[bx+idata]的靈活運(yùn)用

編程闰挡,將datasg段中每個(gè)單詞的頭一個(gè)字母改成大寫

assume cs:codesg,ds:datasg
datasg segment
 db '1\. file       '
 db '2\. edit       '
 db '3\. search     '
 db '4, view       '
 db '5\. option     '
 db '6\. help       '
datasg ends
?
code segment
 start:......
codesg ends
end start 

分析:

其中定義的字符串在內(nèi)存中的存放是這樣的:

1.png

定義了6個(gè)字符串锐墙,每個(gè)長(zhǎng)度都是16個(gè)字節(jié),需要進(jìn)行6次循環(huán)长酗,用一個(gè)變量R定位行溪北,用常量定位列。過(guò)程如下:

  • BX先存放第一行的地址

  • mov cx花枫,6 因?yàn)榭偣灿辛?/p>

  • s:改變第BX行刻盐,第3列的字母為大寫改變BX的值使它指向下一行的地址。

  • loop

也就是說(shuō)劳翰,使用bx作變量敦锌,定位每行的起始地址,用3定位要修改的列佳簸,用[bx+idata]的方式來(lái)對(duì)目標(biāo)單元進(jìn)行尋址

代碼:

assume cs:codesg,ds:datasg
datasg segment
 db '1\. file       '
 db '2\. edit       '
 db '3\. search     '
 db '4, view       '
 db '5\. option     '
 db '6\. help       '
datasg ends
?
code segment
 start: mov ax,datasg
 mov ds,ax
 mov bx,0

 mov cx,6
 s:mov al,[bx+3]  ;注意單位是字節(jié)乙墙,所以是al
 and al,11011111b
 mov [bx+3],al
 add bx,16
 loop s

 mov ax,4c00h
 int 21h
codesg ends
end start </pre>

7.7問(wèn)題

問(wèn)題:[bx+SI]的靈活運(yùn)用

編程,將datasg段中每個(gè)單詞改寫成大寫字母

assume cs:codesg,ds:datasg
datasg segment
 db 'ibm       '
 db 'dec       '
 db 'dos     '
 db 'vax      '
datasg ends
?
code segment
 start:......
codesg ends
end start

分析:

其中定義的字符串在內(nèi)存中的存放是這樣的:

2.png

在datasg中定義了4個(gè)字符串生均,每個(gè)長(zhǎng)度為16個(gè)字節(jié)听想,因?yàn)樗麄兪沁B續(xù)存放的,我們可以將這4個(gè)字符串看成一個(gè)4行16列的二維數(shù)組马胧,按照要求汉买,需要修改每一個(gè)單詞,即二維數(shù)組的每一行的前三列佩脊。

進(jìn)行4*3次的二重循環(huán)蛙粘,使用R定位行,變量C定位列威彰。外層循環(huán)按行來(lái)進(jìn)行出牧,內(nèi)層循環(huán)按列來(lái)進(jìn)行。過(guò)程如下:

  • R=第一行的地址

    mov cx歇盼,4

    S0:C=第一列的地址

    mov cx舔痕,3

    s:改變R行,C列的字母為大寫

    C=下一列的地址

    loop s

    R=下一行的地址

    loop s0

使用bx來(lái)作變量豹缀,定位每行的起始地址伯复,用si定位要修改的列,用[bx+si]的方式來(lái)對(duì)目標(biāo)單元進(jìn)行尋址

代碼:

assume cs:codesg,ds:datasg
datasg segment
 db 'ibm       '
 db 'dec       '
 db 'dos       '
 db 'vax       '
datasg ends
?
code segment
 start:mov ax,datasg
 mov ds,ax
 mov bx,0

 mov cx,4
 s0:mov si,0
 mov cx,3
 s:mov al,[bx+si]
 and al,11011111b
 mov [bx+si],al

 inc si
 loop s

 add bx,16
 loop s0

 mov ax,4c00h
 int 21h

codesg ends
end start

這段代碼邢笙,會(huì)陷入死循環(huán)啸如,原因是cx的使用,程序是二重循環(huán)鸣剪,但是只用了一個(gè)循環(huán)計(jì)數(shù)器组底,造成在進(jìn)行內(nèi)層循環(huán)的時(shí)候覆蓋了外層循環(huán)的循環(huán)計(jì)數(shù)值。

在debug這個(gè)程序筐骇,可以發(fā)現(xiàn)是因?yàn)閏x的錯(cuò)誤導(dǎo)致的债鸡,但是多用一個(gè)計(jì)數(shù)器又不可能,因?yàn)閘oop指令默認(rèn)使用cx為循環(huán)計(jì)數(shù)器铛纬。所以應(yīng)該在每次開(kāi)始內(nèi)層循環(huán)的時(shí)候厌均,將外層的cx值保存起來(lái),在執(zhí)行外層循環(huán)的loop指令前告唆,再恢復(fù)外層循環(huán)的cx數(shù)值棺弊,可以使用dx來(lái)保存。

改進(jìn)后的代碼:

assume cs:codesg,ds:datasg
datasg segment
 db 'ibm       '
 db 'dec       '
 db 'dos       '
 db 'vax       '
datasg ends
?
code segment
 start:mov ax,datasg
 mov ds,ax
 mov bx,0

 mov cx,4
 s0:mov dx,cx          ;使用dx寄存器來(lái)臨時(shí)保存cx的值
 mov si,0
 mov cx,3
 s:mov al,[bx+si]
 and al,11011111b
 mov [bx+si],al

 inc si
 loop s

 add bx,16
 mov cx,dx          ;在這里再恢復(fù)cx的值
 loop s0

 mov ax,4c00h
 int 21h

codesg ends
end start 

這個(gè)程序使用dx來(lái)臨時(shí)保存cx的值擒悬,這是可以的模她,但是有可能dx這個(gè)值在內(nèi)層循環(huán)中也會(huì)被使用,在這個(gè)程序中懂牧,si侈净,cx,ax僧凤,bx畜侦,顯然不能存放cx中的數(shù)據(jù),因?yàn)檫@些寄存器在循環(huán)中也要使用躯保,cs旋膳,ip,ds當(dāng)然也不能使用途事,因?yàn)閏s:ip時(shí)刻指向當(dāng)前指令验懊,ds指向datasg段。

所以現(xiàn)在討論的是盯孙,程序中經(jīng)常需要進(jìn)行數(shù)據(jù)的暫存鲁森,可能是寄存器中的也可能是內(nèi)存中的,我們應(yīng)該怎么樣做更為合理振惰。

通用的方案是:使用內(nèi)存歌溉,可以將需要暫存的數(shù)據(jù)放到內(nèi)存單元中,需要使用的時(shí)候骑晶,再?gòu)膬?nèi)存單元中恢復(fù)痛垛,這樣就需要開(kāi)辟一段內(nèi)存空間。

再改進(jìn)后的代碼:

assume cs:codesg,ds:datasg
datasg segment
 db 'ibm       '
 db 'dec       '
 db 'dos       '
 db 'vax       '
 dw 0          ;定義一個(gè)字桶蛔,用來(lái)保存cx
datasg ends
?
code segment
 start:mov ax,datasg
 mov ds,ax
 mov bx,0

 mov cx,4
 s0:mov ds:[40H],cx          ;使用定義的字ds:[40H]來(lái)臨時(shí)保存cx的值
 mov si,0
 mov cx,3
 s:mov al,[bx+si]
 and al,11011111b
 mov [bx+si],al

 inc si
 loop s

 add bx,16
 mov cx,ds:[40H]          ;在這里再恢復(fù)cx的值
 loop s0

 mov ax,4c00h
 int 21h

codesg ends
end start 

多定義一個(gè)字匙头,也就是說(shuō),使用ds:[40H]來(lái)存放cx的值仔雷。

但是蹂析,上面的方法還是很麻煩舔示,因?yàn)槿绻枰4娑鄠€(gè)數(shù)據(jù)的時(shí)候,必須要記住數(shù)據(jù)存放到了哪個(gè)單元电抚,容易混亂惕稻,所以更好的方法是使用棧

最終改進(jìn)的程序:

assume cs:codesg,ds:datasg,ss:stacksg
datasg segment
 db 'ibm       '
 db 'dec       '
 db 'dos       '
 db 'vax       '
 dw 0          ;定義一個(gè)字,用來(lái)保存cx
datasg ends
?
stacksg segment
 dw 0,0,0,0,0,0,0,0  ;定義一個(gè)棧段蝙叛,容量為16個(gè)字節(jié)
stacksg segment
?
code segment
 start:mov ax,stackag
 mov ss,ax
 mov sp,16
 mov ax,datasg
 mov ds,ax
 mov bx,0

 mov cx,4
 s0:push cx      ;使用定義的棧臨時(shí)保存cx的值 
 mov si,0
 mov cx,3
 s:mov al,[bx+si]
 and al,11011111b
 mov [bx+si],al

 inc si
 loop s

 add bx,16
 pop cx      ;在這里再恢復(fù)cx的值 
 loop s0

 mov ax,4c00h
 int 21h

codesg ends
end start 

7.9問(wèn)題

問(wèn)題:[bx+si+idata]的靈活運(yùn)用

編程俺祠,將datasg段中每個(gè)單詞的前四個(gè)字母改為大寫字母

assume cs:codesg,ds:datasg,ss:stacksg
stacksg segment
 dw 0,0,0,0,0,0,0,0
stacksg ends
datasg segment
 db '1.display       '
 db '2.brows         '
 db '3.replace       '
 db '4.modify        '
datasg ends
code segment
 start:......
codesg ends
end start

分析:

其中定義的字符串在內(nèi)存中的存放是這樣的:
3.png

由于數(shù)據(jù)是連續(xù)存放的,可以將這四個(gè)字符串看作一個(gè)4行16列的二維數(shù)組借帘,按照要求蜘渣,需要修改每個(gè)單詞的前4個(gè)字母,即二維數(shù)組的每一行的3~6列肺然。需要進(jìn)行4*4的二重循環(huán)蔫缸,用變量R定位行,常量3定位每行要修改的起始列际起,變量C定位相對(duì)于起始列的要修改的列捂龄,

首先使用R定位第一行,循環(huán)修改R行的3+C列

然后再用R定位到下一行加叁,再次循環(huán)修改R行的3+C列

使用bx來(lái)做變量倦沧,定位每行的起始地址,用si定位要修改的列它匕,用[bx+3+si]的方式來(lái)對(duì)目標(biāo)單元進(jìn)行尋址展融。

代碼:

assume cs:codesg,ds:datasg,ss:stacksg
stacksg segment
 dw 0,0,0,0,0,0,0,0
stacksg ends
?
datasg segment
 db '1.display       '
 db '2.brows         '
 db '3.replace       '
 db '4.modify        '
datasg ends
?
code segment
 start:mov ax,stacksg
 mov ss,ax
 mov sp,16          ;讓CPU知道和棧段掛鉤
 mov ax,datasg
 mov ds,ax          ;讓CPU知道和ds掛鉤
 mov bx,0

 mov cx,4
 s0:push cx          ;用來(lái)保存cx的值
 mov si,0          ;定義列
 mov cx,4
 s:mov al,[bx+si+3]  ;這里是定位到每個(gè)要索引的字母,每行總共有四個(gè)字母
 and al,11011111b
 mov [bx+si+3],al
 inc si          ;使它指向同一行的下一個(gè)字母
 loop s

 add bx,16
 pop cx
 loop s0

 mov ax,4c00h
 int 21h

codesg ends
end start
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末豫柬,一起剝皮案震驚了整個(gè)濱河市告希,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌烧给,老刑警劉巖燕偶,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異础嫡,居然都是意外死亡指么,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門榴鼎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)伯诬,“玉大人,你說(shuō)我怎么就攤上這事巫财〉了疲” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵平项,是天一觀的道長(zhǎng)赫舒。 經(jīng)常有香客問(wèn)我悍及,道長(zhǎng),這世上最難降的妖魔是什么接癌? 我笑而不...
    開(kāi)封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任并鸵,我火速辦了婚禮,結(jié)果婚禮上扔涧,老公的妹妹穿的比我還像新娘。我一直安慰自己届谈,他們只是感情好枯夜,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著艰山,像睡著了一般湖雹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上曙搬,一...
    開(kāi)封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天摔吏,我揣著相機(jī)與錄音,去河邊找鬼纵装。 笑死征讲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的橡娄。 我是一名探鬼主播诗箍,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼挽唉!你這毒婦竟也來(lái)了滤祖?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瓶籽,失蹤者是張志新(化名)和其女友劉穎匠童,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體塑顺,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汤求,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了严拒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片首昔。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖糙俗,靈堂內(nèi)的尸體忽然破棺而出勒奇,到底是詐尸還是另有隱情,我是刑警寧澤巧骚,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布赊颠,位于F島的核電站格二,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏竣蹦。R本人自食惡果不足惜顶猜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望痘括。 院中可真熱鬧长窄,春花似錦、人聲如沸纲菌。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)翰舌。三九已至嚣潜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間椅贱,已是汗流浹背懂算。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庇麦,地道東北人计技。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像山橄,于是被迫代替她去往敵國(guó)和親酸役。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 王爽匯編全書知識(shí)點(diǎn)大綱 第一章 基礎(chǔ)知識(shí) 機(jī)器語(yǔ)言 匯編語(yǔ)言的產(chǎn)生 匯編語(yǔ)言的組成 存儲(chǔ)器 cpu對(duì)存儲(chǔ)器的讀寫 ...
    2c3ba901516f閱讀 2,408評(píng)論 0 1
  • 8086匯編 本筆記是筆者觀看小甲魚老師(魚C論壇)《零基礎(chǔ)入門學(xué)習(xí)匯編語(yǔ)言》系列視頻的筆記,在此感謝他和像他一樣...
    Gibbs基閱讀 37,133評(píng)論 8 114
  • # 常見(jiàn)匯編代碼 # 1. 編寫程序:比較AX,BX,CX中帶符號(hào)數(shù)的大小呵晚,將最大的數(shù)放在AX中 code...
    喝豆腐腦加糖閱讀 2,596評(píng)論 0 0
  • 計(jì)算機(jī)通過(guò)執(zhí)行指令序列來(lái)使機(jī)器得以工作蜘腌,所以對(duì)于每一系列的計(jì)算機(jī)都有指定的一組指令集供計(jì)算機(jī)使用,這組指令...
    未來(lái)科技工作室閱讀 7,936評(píng)論 1 10
  • 算算時(shí)間,我的實(shí)習(xí)生差不多來(lái)了快一個(gè)月金矛。剛開(kāi)始的時(shí)候芯急,本來(lái)我是不打算接手的勺届,一來(lái)是因?yàn)槲易约阂彩遣锁B,擔(dān)心誤人子弟...
    煜靈兒閱讀 499評(píng)論 4 3