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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

数据处理的两个基本问题---汇编学习笔记

發布時間:2025/3/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据处理的两个基本问题---汇编学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

數據處理的兩個基本問題

計算機是進行數據處理、運算的機器,那么有兩個基本的問題就包含在其中:

  • 要處理的數據在什么地方?
  • 要處理的數據有多長?
  • 我們定義兩個描述性符號: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內部、內存、端口(端口將在后面的課程中進行討論)。

    機器碼匯編指令指令執行前數據的位置
    8E1E0000mov bx,[0]內存,ds:0單元
    89C3mov bx,axCPU內部,ax寄存器
    BB0100mov bx,1CPU內部,指令緩沖器


    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)通過寄存器名指明要處理的數據的尺寸。例如:

  • 字操作:mov ax,1 | mov bx,ds:[0] | mov ds,ax | mov ds:[0],ax | inc ax | add ax,1000。
  • 字節操作:mov al,1 |mov al,bl | mov al,ds:[0] | mov ds:[0],al | inc al | add al,100。
  • (2)在沒有寄存器名存在的情況下,用操作符X pt 指明內存單元的長度,X在匯編指令中可以為word或byte。例如:

  • 字操作:mov word ptr ds:[0],1 | inc word ptr [bx] | inc word ptr ds:[0] | add word ptr [bx],2。
  • 字節操作:mov byte ptr ds:[0],1 | inc byte ptr [bx] | inc byte ptr ds:[0] | add byte ptr [bx],2。
  • (3)其他方法。有些指令默認訪問的是字單元還是字節單元。例如:push [1000H]就是訪問字。


    8.6 尋址方式的綜合應用

    這個內容自己看,很簡單的一個例子。


    8.7 div指令

    div是除法指令,使用div做除法的時候應該注意以下問題:

  • 除數:有8位和16位兩種,在一個reg或內存單元中
  • 被除數:默認放在AX或DX和AX中,如果除數為8位,被除數則為16位,默認在AX中存放;如果除數為16位,被除數則為32位,在DX和AX中存放,DX存放高16位,AX存放低16位
  • 結果:如果除數為8位,則AL存儲除法操作的商,AH存儲除法操作的余數;如果除數為16位,則AX存儲除法操作的商,DX存儲除法操作的余數
  • 格式如: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。程序如下:

    mov dx,1 mov ax,86A1H mov bx,100 div bx

    8.8 偽指令dd

    dd是用來定義dword(double word,雙字)型數據。比如:

    data segmentdb 1 ;占1個字節dw 1 ;占2個字節dd 1 ;占4個字節 data ends

    問題 8.1
    用div計算data段中第一個數據除以第二個數據后的結果,商存在第三個數據的存儲單元中。

    data segmentdd 100001dw 100dw 0 data ends

    答案:

    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 start

    8.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年的基本情況如下。

    年份收入(千美元)雇員(人)人均收入(千美元)
    1975163?
    1976227?
    19773829?
    1978135613?
    1979239028?
    1980800038?
    M
    1995593700017800?

    下面的程序中,已經定義好了這些數據:

    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年公司雇員人數的21word型數據 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年公司雇員人數的21word型數據 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

    結果如下:

    總結

    以上是生活随笔為你收集整理的数据处理的两个基本问题---汇编学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

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