王爽 汇编语言第三版 第8章( 寻址方式 ) --- 数据处理的两个问题
生活随笔
收集整理的這篇文章主要介紹了
王爽 汇编语言第三版 第8章( 寻址方式 ) --- 数据处理的两个问题
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
?
?
?
第八章? ? 數(shù)據(jù)處理的兩個(gè)基本問題
?
?
?
?
?
?
?
8.6?綜合應(yīng)用
?
?
示例代碼 1:
assume cs:codesg,ds:datasgdatasg segmentdb 1024 dup (0) datasg endscodesg segmentstart:mov ax,datasgmov ds,axmov bx,60h ; 確定記錄地址 ds:bxmov word ptr [bx+0ch],38 ; 排名字段改為 38add word ptr [bx+0eh],70 ; 收入字段增加 70mov si,0mov byte ptr [bx+10h+si], 'V' ;用 si 來定位產(chǎn)品字符串中的字符inc simov byte ptr [bx+10h+si], 'A' inc simov byte ptr [bx+10h+si], 'X'mov ax,4c00hint 21hcodesg ends end startdebug?的?反匯編結(jié)果截圖:
示例代碼 2(?使用?C?語言風(fēng)格?):
assume cs:codesg,ds:datasgdatasg segmentdb 1024 dup (0) datasg endscodesg segmentstart:mov ax,codesgmov ds,ax mov bx,60h ;記錄首地址mov word ptr [bx].0ch, 38 ; 排名字段改為 38, 相當(dāng)于 C 中的 dec.pm = 38 add word ptr [bx].0eh, 70 ; 收入字段增加 70, 相當(dāng)于 C 中的 dec.sr = dec.sr + 38mov si,0 ; 相當(dāng)于 C 中的 i = 0mov byte ptr [bx].10h[si], 'V' ; dec.cp[i] = 'V'inc si ; i++mov byte ptr [bx].10h[si], 'A' ; dec.cp[i] = 'A'inc si ; i++mov byte ptr [bx].10h[si], 'X' ; dec.cp[i] = 'X'mov ax,4c00hint 21h codesg ends end startdebug?的?反匯編結(jié)果截圖:
可以看到反匯編結(jié)果和上面的結(jié)果是一樣的。
?
?
?
8.7? div?指令 (?除法?指令?)
?
運(yùn)行截圖:
?
?
?
8.8?偽指令?dd (?定義?雙字?)
?
?
?
?
8.9?dup?指令 (?數(shù)據(jù)的重復(fù)?)
?
?
?
?
實(shí)驗(yàn) 7
示例代碼 1(?使用絕對定位 ):
assume cs:codesg,ds:datadata segmentdb '1975','1976','1977','1978','1979','1980','1981','1982','1983'db '1984','1985','1986','1987','1988','1989','1990','1991','1992'db '1993','1994','1995';84字節(jié)??偣?21 個(gè)年份,一個(gè)年份4個(gè)字節(jié),總共 84 字節(jié)dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000;84字節(jié)dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw 11542,14430,15257,17800;通過計(jì)算得到每一個(gè)代碼段相對于起始的偏移量 data ends table segmentdb 21 dup('year summ ne ?? ') table endscodesg segmentstart:mov ax,datamov ds,ax;mov ax,table;mov es,axsub bx,bx ; mov bx,0sub di,di ; mov di,0mov cx,21;日期導(dǎo)入write_data:mov ax,ds:[di]mov ds:[bx+224],ax ; 224為從data段起始跳到table起始 add di,2 ; 日期為四個(gè)字節(jié)一組,而16位寄存器最大只能存兩個(gè)字節(jié),所以每次加二 mov ax,ds:[di] mov ds:[bx+226],ax add di,2 add bx,16 ;在table字段里換行輸入日期 loop write_data sub bx,bx mov cx,21 ;收入導(dǎo)入wite_salary:mov ax,ds:[di] ;此di是上段循環(huán)最后的di,沒有重置mov ds:[bx+229],ax ;229為從data段起始跳到table段收入輸入的起始 add di,2 ;收入為四個(gè)字節(jié)一組,而16位寄存器最大只能存兩個(gè)字節(jié),所以每次加二 mov ax,ds:[di] mov ds:[bx+231],ax add di,2 add bx,16 ;在table字段里換行輸入收入 loop wite_salary sub bx,bx mov cx,21;雇員數(shù)導(dǎo)入write_employees:mov ax,ds:[di] ;此di是上段循環(huán)最后的di,沒有重置mov ds:[bx+234],ax ;234為從data段起始跳到table雇員數(shù)輸入的起始 add di,2 add bx,16 ;在table字段里換行輸入雇員數(shù) loop write_employees sub di,di ;數(shù)據(jù)來源不再是數(shù)據(jù)段的順序讀取 sub bx,bx sub si,si mov cx,21;人均收入導(dǎo)入write_average:mov ax,ds:[di+84] ;定位到收入起始,將收入數(shù)據(jù)導(dǎo)入ax,dx中mov dx,ds:[di+86] div word ptr ds:[si+168] ;定位到雇員數(shù)起始 mov ds:[bx+237],ax ;將算數(shù)結(jié)果存入table的人均收入位置 add di,4 add si,2 add bx,16 ;在table字段里換行輸入人均收入 loop write_averagemov ax,4c00hint 21h codesg ends end start示例代碼 2:(?使用相對定位 )
assume cs:codesg,ds:datasgdatasg segmentdb '1975','1976','1977','1978','1979','1980','1981','1982','1983'db '1984','1985','1986','1987','1988','1989','1990','1991','1992'db '1993','1994','1995';84字節(jié)??偣?21 個(gè)年份,一個(gè)年份4個(gè)字節(jié),總共 84 字節(jié)dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000;84字節(jié)。收入總共 21 個(gè)字段,每個(gè)字段4個(gè)字節(jié),總共 84 字節(jié)dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw 11542,14430,15257,17800;通過計(jì)算得到每一個(gè)代碼段相對于起始的偏移量 datasg ends tablesg segmentdb 21 dup('year summ ne ?? ') tablesg endscodesg segmentstart:mov ax,datasgmov ds,axmov ax,tablesgmov es,ax; bx 指示 table 段中每一行首地址,因?yàn)槊恳恍卸颊?6個(gè)字節(jié),所以bx步長是16sub bx,bx ; mov bx,0 bx置為0,指向 tablesg 頭sub di,di ; mov di,0mov cx,21;日期導(dǎo)入write_date:mov ax,ds:[di]mov es:[bx][0],axadd di,2 ; 日期為四個(gè)字節(jié)一組,而16位寄存器最大只能存兩個(gè)字節(jié),所以每次加二 mov ax,ds:[di] mov es:[bx][2],ax add di,2 add bx,16 ; 在table字段里換行輸入日期 loop write_date sub bx,bx ;bx置為0,指向 tablesg 頭mov cx,21 ;收入導(dǎo)入wite_salary:mov ax,ds:[di] ;此di是上段循環(huán)最后的di,沒有重置mov es:[bx+5],ax ;table段收入輸入的起始 add di,2 ;收入為四個(gè)字節(jié)一組,而16位寄存器最大只能存兩個(gè)字節(jié),所以每次加二 mov ax,ds:[di] mov es:[bx+7],ax add di,2 add bx,16 ;在table字段里換行輸入收入 loop wite_salary sub bx,bx ;bx置為0,指向 tablesg 頭mov cx,21;雇員數(shù)導(dǎo)入write_employees:mov ax,ds:[di] ;此di是上段循環(huán)最后的di,沒有重置mov es:[bx+10],ax ;雇員數(shù)的起始地址 add di,2 add bx,16 ;在table字段里換行輸入雇員數(shù) loop write_employees sub di,di ;數(shù)據(jù)來源不再是數(shù)據(jù)段的順序讀取 sub bx,bx sub si,si mov cx,21;人均收入導(dǎo)入write_average:mov ax,es:[bx][5] ;定位到收入起始,將收入數(shù)據(jù)導(dǎo)入ax,dx中mov dx,es:[bx][7] div word ptr es:[bx][10] ;定位到雇員數(shù)起始 mov es:[bx][13],ax ;將算數(shù)結(jié)果存入table的人均收入位置 add bx,16 ;在table字段里換行輸入人均收入 loop write_averagemov ax,4c00hint 21h codesg ends end start第一個(gè)循環(huán)執(zhí)行年份輸入,第二個(gè)收入輸入,第三個(gè)雇員數(shù)輸入,第四個(gè)人均收入輸入,在人均收入的數(shù)據(jù)獲取時(shí)使用div除法運(yùn)算得到數(shù)據(jù)源
運(yùn)行截圖:
?
示例代碼 3(?使用一次循環(huán)?):
assume cs:codesgdata segmentdb '1975','1976','1977','1978','1979','1980','1981','1982','1983'db '1984','1985','1986','1987','1988','1989','1990','1991','1992'db '1993','1994','1995';84字節(jié)??偣?21 個(gè)年份,一個(gè)年份4個(gè)字節(jié),總共 84 字節(jié)dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000;84字節(jié)dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw 11542,14430,15257,17800;通過計(jì)算得到每一個(gè)代碼段相對于起始的偏移量data endstable segmentdb 21 dup ('year summ ne ?? ') table endscodesg segment start: mov ax,data ;取得數(shù)據(jù)段mov ds,axmov ax,tablemov es,axmov cx,21mov si,0mov di,0mov bx,0s: ;把年份送到table中mov ax,ds:[bx]mov es:[di+0],axmov ax,ds:[bx+2]mov es:[di+2],ax;把收入送到table中mov ax,ds:[bx+84]mov es:[di+5],axmov ax,ds:[bx+86]mov es:[di+7],ax;轉(zhuǎn)移雇員人數(shù)mov ax,ds:[168+si]mov es:[di+10],ax;計(jì)算人均收入并把其送到table中mov ax,ds:[84+bx]mov dx,ds:[86+bx]div WORD ptr ds:[168+si]mov es:[di+13],axadd si,2 ; 數(shù)據(jù)段中 雇員人數(shù)是 2 字節(jié)偏移量 add bx,4 ; 數(shù)據(jù)段中 年份 和 收入都是 4字節(jié)偏移量add di,16 ; table 表中行偏移量loop smov ax,4c00hint 21h codesg ends end start截圖(?注意看編譯后可執(zhí)行程序的文件名,masm編譯匯編程序的時(shí)候,其源文件名不能超過8位,超過8位時(shí),會(huì)自動(dòng)編譯成不知道什么名稱,我的源文件名是?shiyan_7_2.asm,已經(jīng)超過8位,生成的可執(zhí)行程序名是 shiyan~2.exe?):
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的王爽 汇编语言第三版 第8章( 寻址方式 ) --- 数据处理的两个问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓逆向_16 --- ARM 静态分析
- 下一篇: FRIDA - API使用篇:rpc、P