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