這個學期准備考研,於是就沒有怎么聽別的課,現在臨近期末,匯編成了個難題。下面是我學校的實驗報告
做一個復習的記錄吧,下面的代碼都是在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 ;匯編結束
