日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

王爽 汇编语言第三版 第8章( 寻址方式 ) --- 数据处理的两个问题

發布時間:2024/7/23 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 王爽 汇编语言第三版 第8章( 寻址方式 ) --- 数据处理的两个问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

?

?

第八章? ? 數據處理的兩個基本問題

?

?

?

?

?

?

?

8.6?綜合應用

?

?

示例代碼 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 來定位產品字符串中的字符inc simov byte ptr [bx+10h+si], 'A' inc simov byte ptr [bx+10h+si], 'X'mov ax,4c00hint 21hcodesg ends end start

debug?的?反匯編結果截圖:

示例代碼 2(?使用?C?語言風格?):

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, 相當于 C 中的 dec.pm = 38 add word ptr [bx].0eh, 70 ; 收入字段增加 70, 相當于 C 中的 dec.sr = dec.sr + 38mov si,0 ; 相當于 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 start

debug?的?反匯編結果截圖:

可以看到反匯編結果和上面的結果是一樣的。

?

?

?

8.7? div?指令 (?除法?指令?)

?

運行截圖:

?

?

?

8.8?偽指令?dd (?定義?雙字?)

?

?

?

?

8.9?dup?指令 (?數據的重復?)

?

?

?

?

實驗 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字節。總共 21 個年份,一個年份4個字節,總共 84 字節dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000;84字節dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw 11542,14430,15257,17800;通過計算得到每一個代碼段相對于起始的偏移量 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;日期導入write_data:mov ax,ds:[di]mov ds:[bx+224],ax ; 224為從data段起始跳到table起始 add di,2 ; 日期為四個字節一組,而16位寄存器最大只能存兩個字節,所以每次加二 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 ;收入導入wite_salary:mov ax,ds:[di] ;此di是上段循環最后的di,沒有重置mov ds:[bx+229],ax ;229為從data段起始跳到table段收入輸入的起始 add di,2 ;收入為四個字節一組,而16位寄存器最大只能存兩個字節,所以每次加二 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;雇員數導入write_employees:mov ax,ds:[di] ;此di是上段循環最后的di,沒有重置mov ds:[bx+234],ax ;234為從data段起始跳到table雇員數輸入的起始 add di,2 add bx,16 ;在table字段里換行輸入雇員數 loop write_employees sub di,di ;數據來源不再是數據段的順序讀取 sub bx,bx sub si,si mov cx,21;人均收入導入write_average:mov ax,ds:[di+84] ;定位到收入起始,將收入數據導入ax,dx中mov dx,ds:[di+86] div word ptr ds:[si+168] ;定位到雇員數起始 mov ds:[bx+237],ax ;將算數結果存入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字節。總共 21 個年份,一個年份4個字節,總共 84 字節dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000;84字節。收入總共 21 個字段,每個字段4個字節,總共 84 字節dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw 11542,14430,15257,17800;通過計算得到每一個代碼段相對于起始的偏移量 datasg ends tablesg segmentdb 21 dup('year summ ne ?? ') tablesg endscodesg segmentstart:mov ax,datasgmov ds,axmov ax,tablesgmov es,ax; bx 指示 table 段中每一行首地址,因為每一行都占16個字節,所以bx步長是16sub bx,bx ; mov bx,0 bx置為0,指向 tablesg 頭sub di,di ; mov di,0mov cx,21;日期導入write_date:mov ax,ds:[di]mov es:[bx][0],axadd di,2 ; 日期為四個字節一組,而16位寄存器最大只能存兩個字節,所以每次加二 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 ;收入導入wite_salary:mov ax,ds:[di] ;此di是上段循環最后的di,沒有重置mov es:[bx+5],ax ;table段收入輸入的起始 add di,2 ;收入為四個字節一組,而16位寄存器最大只能存兩個字節,所以每次加二 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;雇員數導入write_employees:mov ax,ds:[di] ;此di是上段循環最后的di,沒有重置mov es:[bx+10],ax ;雇員數的起始地址 add di,2 add bx,16 ;在table字段里換行輸入雇員數 loop write_employees sub di,di ;數據來源不再是數據段的順序讀取 sub bx,bx sub si,si mov cx,21;人均收入導入write_average:mov ax,es:[bx][5] ;定位到收入起始,將收入數據導入ax,dx中mov dx,es:[bx][7] div word ptr es:[bx][10] ;定位到雇員數起始 mov es:[bx][13],ax ;將算數結果存入table的人均收入位置 add bx,16 ;在table字段里換行輸入人均收入 loop write_averagemov ax,4c00hint 21h codesg ends end start

第一個循環執行年份輸入,第二個收入輸入,第三個雇員數輸入,第四個人均收入輸入,在人均收入的數據獲取時使用div除法運算得到數據源

運行截圖:

?

示例代碼 3(?使用一次循環?):

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字節。總共 21 個年份,一個年份4個字節,總共 84 字節dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514dd 345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000;84字節dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226dw 11542,14430,15257,17800;通過計算得到每一個代碼段相對于起始的偏移量data endstable segmentdb 21 dup ('year summ ne ?? ') table endscodesg segment start: mov ax,data ;取得數據段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;轉移雇員人數mov ax,ds:[168+si]mov es:[di+10],ax;計算人均收入并把其送到table中mov ax,ds:[84+bx]mov dx,ds:[86+bx]div WORD ptr ds:[168+si]mov es:[di+13],axadd si,2 ; 數據段中 雇員人數是 2 字節偏移量 add bx,4 ; 數據段中 年份 和 收入都是 4字節偏移量add di,16 ; table 表中行偏移量loop smov ax,4c00hint 21h codesg ends end start

截圖(?注意看編譯后可執行程序的文件名,masm編譯匯編程序的時候,其源文件名不能超過8位,超過8位時,會自動編譯成不知道什么名稱,我的源文件名是?shiyan_7_2.asm,已經超過8位,生成的可執行程序名是 shiyan~2.exe?):

?

?

?

?

總結

以上是生活随笔為你收集整理的王爽 汇编语言第三版 第8章( 寻址方式 ) --- 数据处理的两个问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。