数据处理的两个基本问题---汇编学习笔记
數(shù)據(jù)處理的兩個(gè)基本問(wèn)題
計(jì)算機(jī)是進(jìn)行數(shù)據(jù)處理、運(yùn)算的機(jī)器,那么有兩個(gè)基本的問(wèn)題就包含在其中:
我們定義兩個(gè)描述性符號(hào):reg和sreg。
reg的集合包括:ax、bx、cx、dx、ah、al、bh、bl、ch、cl、dh、dl、sp、bp、si、di。
sreg的集合包括:ds、ss、cs、es。
8.1 bx、si、di和bp
bp和其他3個(gè)寄存器一樣。都可以進(jìn)行下面幾種模式:
mov ax,[bp] mov ax,[bp+idata] mov ax,[bp+si] mov ax,[bp+si+idata]8.2 機(jī)器指令處理的數(shù)據(jù)在什么地方
對(duì)于機(jī)器指令這一層來(lái)說(shuō),并不關(guān)心數(shù)據(jù)的值是多少,而關(guān)心指令執(zhí)行前一刻,它將要處理的數(shù)據(jù)所在的位置,所要處理的數(shù)據(jù)可以在3個(gè)地方:CPU內(nèi)部、內(nèi)存、端口(端口將在后面的課程中進(jìn)行討論)。
| 8E1E0000 | mov bx,[0] | 內(nèi)存,ds:0單元 |
| 89C3 | mov bx,ax | CPU內(nèi)部,ax寄存器 |
| BB0100 | mov bx,1 | CPU內(nèi)部,指令緩沖器 |
8.3 匯編語(yǔ)言中數(shù)據(jù)位置的表達(dá)
匯編語(yǔ)言中用3個(gè)概念來(lái)表達(dá)數(shù)據(jù)的位置。
(1)立即數(shù)(idata)
對(duì)于直接包含在機(jī)器指令中的數(shù)據(jù)(執(zhí)行前在CPU的指令緩沖器中),在匯編語(yǔ)言中稱(chēng)為:立即數(shù)(idata),在匯編指令中直接給出。例如:mov ax,1 | add bx,2000h | or bx,00010000b | mov al,'a'。
(2)寄存器
指令要處理的數(shù)據(jù)在寄存器中,在匯編指令中給出相應(yīng)的寄存器名。例如:mov ax,bx | mov ds,ax | push bx | mov ds:[0],bx | push ds | mov ss,ax | mov sp,ax。
(3)段地址(SA)和偏移地址(EA)
指令要處理的數(shù)據(jù)在內(nèi)存中,在匯編指令中可用[X]格式給出EA,SA在某個(gè)段寄存器中。
8.4 尋址方式
指令要處理的數(shù)據(jù)有多長(zhǎng)
8086CPU的指令,可以處理兩種尺寸的數(shù)據(jù),byte和word。所以在機(jī)器指令中藥指明,指令進(jìn)行的是字操作還是字節(jié)操作。對(duì)于這個(gè)問(wèn)題,匯編語(yǔ)言中用以下方法處理。
(1)通過(guò)寄存器名指明要處理的數(shù)據(jù)的尺寸。例如:
(2)在沒(méi)有寄存器名存在的情況下,用操作符X pt 指明內(nèi)存單元的長(zhǎng)度,X在匯編指令中可以為word或byte。例如:
(3)其他方法。有些指令默認(rèn)訪(fǎng)問(wèn)的是字單元還是字節(jié)單元。例如:push [1000H]就是訪(fǎng)問(wèn)字。
8.6 尋址方式的綜合應(yīng)用
這個(gè)內(nèi)容自己看,很簡(jiǎn)單的一個(gè)例子。
8.7 div指令
div是除法指令,使用div做除法的時(shí)候應(yīng)該注意以下問(wèn)題:
格式如:div reg | div 內(nèi)存單元。
例子:
(1)div byte ptr ds:[0],含義:
(al)=(ax)/((ds)?16+0)的商(al)=(ax)/((ds)?16+0)的商
(ah)=(ax)/((ds)?16+0)的余數(shù)(ah)=(ax)/((ds)?16+0)的余數(shù)
(2)div word ptr es:[0],含義:
(ax)=[(dx)?10000H+(ax)]/((es)?16+0)的商(ax)=[(dx)?10000H+(ax)]/((es)?16+0)的商
(dx)=[(dx)?10000H+(ax)]/((es)?16+0)的余數(shù)(dx)=[(dx)?10000H+(ax)]/((es)?16+0)的余數(shù)
(3)div byte ptr [bx+si+8],含義:
(al)=(ax)/((ds)?16+(bx)+(si)+8)的商(al)=(ax)/((ds)?16+(bx)+(si)+8)的商
(ah)=(ax)/((ds)?16+(bx)+(si)+8)的余數(shù)(ah)=(ax)/((ds)?16+(bx)+(si)+8)的余數(shù)
(4)div word ptr [bx+si+8],含義:
(ax)=[(dx)?10000H+(ax)]/((ds)?16+(bx)+(si)+8)的商(ax)=[(dx)?10000H+(ax)]/((ds)?16+(bx)+(si)+8)的商
(ax)=[(dx)?10000H+(ax)]/((ds)?16+(bx)+(si)+8)的余數(shù)(ax)=[(dx)?10000H+(ax)]/((ds)?16+(bx)+(si)+8)的余數(shù)
編程,利用除法指令計(jì)算100001/100。
分析:先將100001轉(zhuǎn)換為16進(jìn)制形式是186A1H。程序如下:
8.8 偽指令dd
dd是用來(lái)定義dword(double word,雙字)型數(shù)據(jù)。比如:
data segmentdb 1 ;占1個(gè)字節(jié)dw 1 ;占2個(gè)字節(jié)dd 1 ;占4個(gè)字節(jié) data ends問(wèn)題 8.1
用div計(jì)算data段中第一個(gè)數(shù)據(jù)除以第二個(gè)數(shù)據(jù)后的結(jié)果,商存在第三個(gè)數(shù)據(jù)的存儲(chǔ)單元中。
答案:
code segmentstart:;初始化mov ax,datamov ds,datamov bx,0;將被除數(shù)存入ax和dx中mov dx,[bx+2]mov ax,[bx];除數(shù)是第二個(gè)數(shù)據(jù),做除法操作div word ptr [bx+4];將結(jié)果存入第三個(gè)數(shù)據(jù)mov [bx+6],ax ;結(jié)束 mov ax,4c00hint 21h code ends end start8.9 dup
dup是一個(gè)操作符,在匯編語(yǔ)言中同db、dw、dd等一樣,也是由編譯器識(shí)別處理的符號(hào)。它是和db、dw、dd等數(shù)據(jù)定義偽指令配合使用的,用來(lái)進(jìn)行數(shù)據(jù)的重復(fù)。比如:db 3 dup(0)是定義了3個(gè)字節(jié),它們的值都是0,相當(dāng)于db 0,0,0;db 3 dup (0,1,2)是定義了9個(gè)字節(jié),相當(dāng)于db 0,1,2,0,1,2,0,1,2。
dup的使用格式如下:
db 重復(fù)的次數(shù) dup (重復(fù)的字節(jié)型數(shù)據(jù)) dw 重復(fù)的次數(shù) dup (重復(fù)的字型數(shù)據(jù)) dd 重復(fù)的次數(shù) dup (重復(fù)的雙字型數(shù)據(jù))dup是一個(gè)十分有用的操作符,比如要定義一個(gè)容量為200個(gè)字節(jié)的棧段。就可以直接簡(jiǎn)寫(xiě)為:db 200 dup (0)。
實(shí)驗(yàn)7 尋址方式在結(jié)構(gòu)化數(shù)據(jù)訪(fǎng)問(wèn)中的應(yīng)用
Power idea公司從1975年成立一支到1995年的基本情況如下。
| 1975 | 16 | 3 | ? |
| 1976 | 22 | 7 | ? |
| 1977 | 382 | 9 | ? |
| 1978 | 1356 | 13 | ? |
| 1979 | 2390 | 28 | ? |
| 1980 | 8000 | 38 | ? |
| M | |||
| 1995 | 5937000 | 17800 | ? |
下面的程序中,已經(jīng)定義好了這些數(shù)據(jù):
data segmentdb '1975','1976','1977','1978','1979'db '1980','1981','1982','1983','1984'db '1985','1986','1987','1988','1989'db '1990','1991','1992','1993','1994'db '1995',;以上是表示21年的21個(gè)字符串dd 16,22,382,1356,2390dd 8000,16000,24486,50065,97479dd 140417,197514,345980,590827,803530dd 1183000,1843000,2759000,3753000,4649000dd 5937000;以上是表示21年公司總收入的21個(gè)dword型數(shù)據(jù)dw 3,7,9,13,28dw 38,130,220,476,778dw 1001,1442,2258,2793,4037dw 5635,8826,11542,14430,15257dw 17800;以上是表示21年公司雇員人數(shù)的21個(gè)word型數(shù)據(jù) data endstable segmentdb 21 dup ('year sumn ne ?? ') table ends編程,將data段中的數(shù)據(jù)按如下格式寫(xiě)入table段中,并計(jì)算21年中的人均收入(取整),結(jié)果也按照下面的格式保存在table段中。
assume cs:code,ss:stack,ds:data data segmentdb '1975','1976','1977','1978','1979'db '1980','1981','1982','1983','1984'db '1985','1986','1987','1988','1989'db '1990','1991','1992','1993','1994'db '1995';以上是表示21年的21個(gè)字符串dd 16,22,382,1356,2390dd 8000,16000,24486,50065,97479dd 140417,197514,345980,590827,803530dd 1183000,1843000,2759000,3753000,4649000dd 5937000;以上是表示21年公司總收入的21個(gè)dword型數(shù)據(jù)dw 3,7,9,13,28dw 38,130,220,476,778dw 1001,1442,2258,2793,4037dw 5635,8826,11542,14430,15257dw 17800;以上是表示21年公司雇員人數(shù)的21個(gè)word型數(shù)據(jù) data endstable segmentdb 21 dup ('year sumn ne ?? ') table endsstack segmentdb 256 dup(0) stack endscode segmentstart:;初始化data段mov ax,datamov ds,axmov bx,0mov si,84mov di,168;初始化table段mov ax,tablemov es,axmov bp,0;初始化stack段mov ax,stackmov ss,axmov sp,0mov cx,21s: ;年push cxmov cx,2s0:mov ax,ds:[bx]mov word ptr es:[bp],axadd bp,2add bx,2loop s0inc bp;收入 mov cx,2s1:mov ax,ds:[si]mov word ptr es:[bp],axadd bp,2add si,2loop s1inc bp;雇員數(shù)mov ax,ds:[di]mov word ptr es:[bp],axadd bp,3add di,2;人均收入mov ax,ds:[si-4]mov dx,ds:[si-2]div word ptr ds:[di-2]mov word ptr es:[bp],axadd bp,3pop cxloop smov ax,4c00hint 21h code ends end start結(jié)果如下:
總結(jié)
以上是生活随笔為你收集整理的数据处理的两个基本问题---汇编学习笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 你觉得你有那些特质让你比别人更适合做产品
- 下一篇: 数据产品经理的5大阶段和6步作战模型