Emu8086三種格式的代碼-(順序,分支,循環)


這個學期准備考研,於是就沒有怎么聽別的課,現在臨近期末,匯編成了個難題。下面是我學校的實驗報告

做一個復習的記錄吧,下面的代碼都是在Emu8086上運行出來的代碼

下面先介紹一下,匯編里面的格式問題

簡化段格式定義.MODEL SMALL ;定義程序的存儲模式 

.MODEL SMALL   ;定義程序的存儲模式
.STACK          ;定義堆棧段
.DATA           ;定義數據段
                
.......             ;數據定義
                 
.CODE            ;定義代碼段
.STARTUP         ;程序起始點,並建立DS,SS內容

.......             ;程序定義

.EXIT 0         ;程序結束點,返回DOS

.......            ;子程序定義

END             ;匯編結束    

  

完整段定義格式

STACK SEGMENT STACK         ;定義堆棧段STACK
    .....                   ;分配堆棧段的大小
    
STACK ENDS                  ;堆棧段結束
DATA  SEGMENT               ;定義數據段DATA
    .....                   ;定義數據  
    
CODE SEGMENT 'CODE'         ;定義代碼段
    ASSUME CS:CODE,DS:DATA,SS:STACK  
    ;確定CS/DS/SS指向的邏輯段
    START :MOV AX,DATA
    MOV DS,AX           ;設置數據段的段地址DS
    
    ......              ;程序代碼
    
    MOV AX,4C00H        ;返回DOS
    INT 21H
    
    ......              ;子程序代碼
    
    CODE ENDS
ENDS START              ;匯編結束

 

順序語句

 

前提的知識,AL和AH都是8位的寄存器.AL是低字節,AH是高字節。(很好理解,HHHH就是高的意思嘛)

.MODEL SMALL    ;定義程序的存儲模式 
.STACK          ;定義堆棧段
.DATA           ;定義數據段
                
X DB 8CH        ;定義了一個名為DB類型的X
Y DB 64H        ;定義了一個名為DB類型的Y
Z DB 0H         ;定義了一個名為DB類型的Z
                 
.CODE            ;定義代碼段
.STARTUP         ;程序起始點,並建立DS,SS內容

MOV AL,X        ;把X的內容傳遞到AL里面
ADD AL,Y        ;把AL的內容和Y的內容相加
MOV AH,00H      ;把AH里面的值清0
ADC AH,00H      ;把CF里面的值給AH

MOV BL,2        ;賦值BL為2
DIV BL          ;把讓AL除以BL,並把結果賦值給AL
MOV Z,AL        ;把AL給Z

.EXIT 0         ;程序結束點,返回DOS
END             ;匯編結束

  分支結構

單分支結構

知識前提:

CMP是比較指令,將目標操作數與源操作數相減,不送回結果,只根據結果置標志位。

CMP dest,src      ;(dest)-(src)

CMP A,B

① 判斷是否相等

看ZF ,ZF=1,A=B,   ZF=0  A ≠B

② 判斷兩個操作數的大小

無符號的

CF=1 ,A<B     CF=0 ,A≧B

有符號的,SF⊕OF,看SF和OF的異或

SF⊕OF=1 ,A<B     SF⊕OF=0 ,A≧B

代碼如下

.MODEL SMALL
.STACK          ;定義堆棧段
.DATA           ;定義數據段
                
RESULT DW 0     ;DW是16位的類型
                 
.CODE            ;定義代碼段
.STARTUP         ;程序起始點,並建立DS,SS內容
                                         
MOV AX,1        ;把寄存器存到AX 1里面
                                         
CMP AX,0        ;把寄存器和AX里面相比,大於的地方就跳轉,
                ;小於的話就不跳轉

JGE     NONNEG          ;分支條件:AX>=0
NEG     AX              ;NEG是取補指令, 
;NEG將操作數取補數,然后在末尾位+1

;條件不滿足,為負數,需要執行分支體進行求補
NONNEG: MOV RESULT,AX       ;條件滿足,為正數,保存結果
        ;NONNEG就是一個符號位置,跳轉的位置.


.EXIT 0         ;程序結束點,返回DOS


END             ;匯編結束 

 

  多分支結構

前提的知識。

帶符號數的乘積

IMUL  reg/mem    ;dest 隱含着被乘數AL/AX乘以乘數reg/men

JGE /JNL SF=OF   ;若大於等於則轉移

.MODEL SMALL   ;定義程序的存儲模式
.STACK          ;定義堆棧段
.DATA           ;定義數據段
                
    _A  DB  00H
    _B  DB  00H
    _C  DB  00H
                    ;    _D  DB  0H
    TAG DB  00H          
    ;定義了四個變量,_A,_B,_C,_D 
    ;他們都是DB類型的
                 
.CODE            ;定義代碼段
.STARTUP         ;程序起始點,並建立DS,SS內容

      MOV AL,_B     ;把_B里面的值賦值給AL
      IMUL AL        ;IMUL 是帶符號的乘法指令,
      ;完成兩個帶符號的8位或16位2進制數乘法計算. 
      ;將AL的內容乘以_B 乘積放入到AL中.
      ;乘積存放在AH,AL,DX,AX中。
      MOV BX,AX      ;BX把AX中的值傳遞給BX,BX里面為B*B
      MOV AL,_A      ;在把_A的值給AL
      IMUL _C        ;把AL的值和_C的值想乘,結果放入到此AX中
                       ;現在AX里面為AC
                       
      
      MOV CX,4       ;把4給CX
      IMUL CX        ;AL的值乘4,結果給AX
                      ;AX現在里面的值是4AC
      
      CMP BX,AX      ;將AX和BX進行比較
      ;BX-AX會標志位會產生改變
      ;SF OF 
      JGE YES         ;如果BX大於AX的話 TAG=0
      MOV TAG,0         ;分支語句體1:條件不滿足,TAG<-0 
      
      JMP DONE         ;BX小於AX的話,TAG=1
YES:  MOV TAG,1

DONE:   
        .EXIT 0        ;程序結束點,返回DOS

        END             ;匯編結束 

循環結果

.MODEL SMALL   ;定義程序的存儲模式
.STACK          ;定義堆棧段
.DATA           ;定義數據段
                
    SUM DW 00H    ;設置一個SUM類型為DW函數值為0H            
                 
.CODE            ;定義代碼段
.STARTUP         ;程序起始點,並建立DS,SS內容


    XOR AX,AX           ;XOR是把操作數"異或" 
    ;這就是一個置零功能
    MOV CX,100          ;把100這個立即數送給CX
    
    AGAIN:ADD    AX,CX  ;AGAIN就是循環的標識符
    LOOP AGAIN      ;執行LOOP的時候,自動將CX里面的內容減一
    ;直到CX里面的值為0
    
    MOV SUM,AX      ;把AX里面的值送給SUM
    


.EXIT 0         ;程序結束點,返回DOS

    

END             ;匯編結束    

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM