學 彙編語言 -- 王爽 筆記

    學 彙編語言 -- 王爽  筆記
                                    -- munds


        1: 計算機是由 cpu,內存,外部儲存器,主板,等等 組成
    2: cpu 經過 數據總線,地址總線,控制總線 來與外部設備交流
        3: cpu 經過 統一地址總線 來控制 各大部件  
    4: cpu 經過 數據總線 接收和發送 數據到 內存
    5: 某些cpu 經過 DMA 來控制 速度比較慢的設備 好比 硬盤,軟盤,光盤 等




-------------------------------  廢話分割線 ------------------------------------------------------------------------------------------------
    cpu 經過各類寄存器來儲存臨時信息
    寄存器有: ax,bx,cx,dx,cs,ds,ss,es
    cpu運行一條指令的詳細動做是 : 1 從cs寄存器中取值 ,2 把給值做爲內存地址發送到地址總線上,3 內存器給cpu發送該地址的內容 ,4 cpu處理內容(這個內容就是計算機指令)
    在8086中 全部的寄存器都是16位,在 80386 中 全部的寄存器都是 32位
    ax,bx,cx,dx 都是 能夠分爲 al,ah,等的8位寄存器
    ax = ah x 2^8 + al
    cpu能夠單獨的對 al ,ah等8位寄存器直接操做
    cpu 能夠直接往控制總線上面發送 獨立顯卡的 所處在的地址 就能夠往屏幕上面顯示東西拉 ^ _ ^
    




---------------------------段地址,基地址的概念理解 ------------------------------------------------------------------------------------
    注意: 8086的地址總線是20位的,而數據總線是16位的,那麼 cpu該怎麼去定位一個地址呢? 是直接從16位寄存器中拿出內容,直接把這個內容發送到地址總線上?,可是 寄存器不是16位的嗎? 還差四位呀!!!!
    因而 8086這些逗比設計員 就把定位一個真正物理地址設計成兩部分 1: 段地址 2:基地址 。實際地址 = 段地址 x 16 + 基地址
    好吧,這樣也行,我也醉了
    可是我該怎麼去從一個內存提取信息呢?
    下面咱們來看一個例子:
            assume cs:code          //assume :僞代碼 用於給程序員識別 並不會被彙編器編譯爲機器碼
            code segment:           // 是
                mov ax,0x1000   // 給 ax 賦值
                mov ds,ax    // 由於 ds 不能夠直接接收 當即數 因此 用 ax 做爲中間者爲ds 設值
                mov bx,0x20    //
                mov ax,[bx]    //    
            ends            //
    這個例子中 ax 做爲中間變量 爲 ds 設值
    注意ds爲段地址寄存器 而 mov ax,[bx] 這條指令是從 0x1000 x 16 + 0x20 = 0x10020 的地址中取兩個字節到ax寄存器。




--------------------------柞堆的理解  ----------------------------------------------------------------------------------------------------
    8086中經常使用 ss 做爲 柞的段地址,sp 做爲 柞的柞頂    柞示意圖:     |   0x1000b | <-- sp指向一個內存空間
    例子:                                |   0x1000a |  push :  先把sp柞頂寄存器減二
    assume cs:code ss:stack                    |   0x10009 |          再把 ax寄存器中的值壓入柞中
    code segment:                            |   0x10008 |        
        mov ax,0x1000                        |   0x10007 |  pop :    先從柞中抽出內容
        mov ss:ax                        |   0x10006 |        再把sp寄存器中的值減二
        mov ax,0x0b                        |   0x10005 |                            
        mov sp,ax                        |   0x10004 |
        mov ax,10000                        |   0x10003 |
        push ax                            |   0x10002 |
    這個例子中 先初始化ss寄存器的值,選定一塊地址做爲柞 內存        |   0x10001 |
           而後初始化sp寄存器的值, 初始化 柞頂爲柞底        |   0x10000 |
                                    |   0x0ffff | <-- 柞頂





--------------------------8086彙編語言中的各個段---------------------------------------------------------------------------------------------
    一: 代碼段
        cs :提醒程序員 這裏是程序的入口 真正的程序入口是由 start 僞代碼決定的
    二: 數據段
        ds :數據段,能夠定義程序的緩存數據所在的地址,大小,(通常在程序代碼段的前面125字節處)
    三: 柞段
        ss :設置柞所在的內存的數據
    
    四: 僞代碼
        segment :程序員爲標籤後面代碼的地方作一個標誌  s1: mov ax,10000          //s1表明 「mov ax,10000" 所在的地址
                                    
        start : 整個程序的第一個命令入口 用於程序被加載完進內存後設置 cs寄存器的值
        



--------------------------常見的8086彙編命令 -----------------------------------------------------------------------------------------------
    命令                         例子
    mov R1,idata/R2: modifi of value R1=idata/R2    mov ax,1000 // ax=1000
    add R2,R3/idata add 增長            add ax, 1000 // ax=ax+1000
    inc REG  至關於c語言裏面的自加運算 REG++        inc bx   // bx 加一
    int   int 中斷                    int 21h  //產生中斷
    loop segment 循環                     s1: inc ax
                                -----
                                -----  
                                loop s1  // 返回 s1 處 作循環    

    sub R1,R2: 減法 R1=R2-R1            sub ax,bx     // ax = bx - ax
    push REG : 入柞                push ax, //把ax寄存器的值壓入 ss:sp中
    pop  REG : 取值                 pop  ax, //往 ss:sp 中取值並送入ax中
   

程序員

相關文章
相關標籤/搜索