寫匯編程序
A. 一般用什麼軟體來寫匯編程序
樓主你好
編寫匯編語言源程序一般用純文本編輯就可以了,擴展名採用.ASM比較大眾化。目前比較好的IDE是國內的masmplus,免費軟體,下載地址在:
http://www.aogosoft.com/masmplus/
國際上比較著名的是radasm,但一般用不到那麼高級,支持幾十種編譯器呢!
三級等級考試使用的是MASM 4.0的masm.exe和link.exe,知道怎麼用即可。
建議樓主下載masmplus來寫程序,或下載notepad++作為源碼編輯環境。
樓主應該可以搞定的
B. 編寫匯編語言程序
CODESEGMENT
.386
ASSUMECS:CODE
MSGDB'studentnumber:2018610801',13,10
DB'studentname:zhuzhu',13,10,'$'
MSG1DB'pressanybuttontocancel......','$'
START:PUSHCS
POPDS
PUSHCS
POPES
LEADX,MSG
MOVAH,9
INT21H
MOVAH,2AH
INT21H
MOVAX,CX
CALLDSPAX
CALLDSP1
MOVAL,DH
XORAH,AH
CALLDSPAX
CALLDSP1
MOVAL,DL
XORAH,AH
CALLDSPAX
CALLLFCR
MOVAH,2CH
INT21H
MOVAL,CH
XORAH,AH
CALLDSPAX
CALLDSP2
MOVAL,CL
XORAH,AH
CALLDSPAX
CALLDSP2
MOVAL,DH
XORAH,AH
CALLDSPAX
CALLLFCR
LEADX,MSG1
MOVAH,9
INT21H
MOVAH,1
INT21H
MOVAH,4CH
INT21H
;===============================
DSPAXPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHF
XORCX,CX
MOVBX,10
@DSPAX1:
XORDX,DX
DIVBX
INCCX
ORDX,30H
PUSHDX
CMPAX,0
JNE@DSPAX1
MOVAH,2
@DISPAX2:
POPDX
INT21H
LOOP@DISPAX2
;MOVDL,32
;INT21H
POPF
POPDX
POPCX
POPBX
POPAX
RET
DSPAXENDP
;==================================
DSP1PROCNEAR
PUSHAX
PUSHDX
MOVDL,'-'
MOVAH,2
INT21H
POPDX
POPAX
RET
DSP1ENDP
;==================================
DSP2PROCNEAR
PUSHAX
PUSHDX
MOVDL,':'
MOVAH,2
INT21H
POPDX
POPAX
RET
DSP2ENDP
;==================================
LFCRPROCNEAR
PUSHAX
PUSHDX
MOVAH,2
MOVDL,13
INT21H
MOVDL,10
INT21H
POPDX
POPAX
RET
LFCRENDP
;====================================
CODEENDS
ENDSTART
C. 編寫匯編程序
例6.2設內存中有三個互不相等的無符號字數據,分別存放在ARG開始的字單元,編製程序將其中最大值存入MAX單元.
A,B,C
大
大
6.3分支結構程序設計-例6.2
1:;*****EXAM6.2*****
2:SSEG SEGMENT STACK
3:STK DB 20 DUP(0)
4:SSEG ENDS
5:DSEG SEGMENT
6:ARG DW 7138H,84A6H,29EH
7:MAXDW
8:DSEG ENDS
9:CSEG SEGMENT
10: ASSUME CS:CSEG,DS:DSEG
11: ASSUME SS:SSEG
12:FMAX:MOV AX,DSEG
13: MOV DS,AX
14: MOV AX,SSEG
15: MOV SS,AX
16: MOV SP,SIZESTK
17: LEA SI,ARG ;取數據首址
18: MOV AX,[SI] ;取第1個數
19: MOV BX,[SI+2] ;取第2個數
20: CMP AX,BX ;兩數比較
21: JAE FMAX1 ;AX中的數大
22: MOV AX,BX ;大數送AX
23:FMAX1:CMP AX,[SI+4] ;大數與第3個數比較
24: JAE FMAX2 ;AX中的數大
25: MOV AX,[SI+4] ;第3個數大大值
26:FMAX2:MOV MAX,AX ;保存最大值
27: MOV AH,4CH
28: INT 21H
29:CSEG ENDS
30: ENDF MAX
二,實驗內容:
編程實現對一個首地址為A的N字數組排序.
三,實驗要求:
同實驗一
四,實驗提示
可採用多種排序演算法實現該操作.採用冒泡排序方法參考程序如下:
DATA SEGMENT
A DW N DUP( )
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
START:PUSH DS
XOR AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV CX,N
DEC CX
LOOP1:MOV DI,CX
MOV BX,0
LOOP2:MOV AX,A[BX]
CMP AX,A[BX+2]
JGE CONT
XCHG AX,A[BX+2]
MOV A[BX],AX
CONT:ADD BX,2
LOOP LOOP2
MOV CX,DI
LOOP LOOP1
RET
MAIN ENDP
CODE ENDS
END START
注意:該參考程序缺少初始數據輸入和排序結果輸出,同學們在做實驗時應將這兩個步驟考慮進去
D. 編寫匯編語言程序
;本程序通過編譯,運行正確。
datasegment
mes1db'92,85,74,81,70,68,65,78,54,43',0ah,0dh
db'94,100,83,88,79,83,79,69,62,60',0ah,0dh,'$';定義用於顯示的字元串
mes2dw92,85,74,81,70,68,65,78,54,43
dw94,100,83,88,79,83,79,69,62,60;存放20個十進制數
elementsequ($-mes2)/typemes2;元素個數
mes3db'averagesore=$'
dataends
codesegment
assumecs:code,ds:data
start:movax,data
movds,ax
leadx,mes1;第一行顯示20個同學的成績
movah,9
int21h
leadx,mes3;第二行顯示averagescore=求得的平均分數。
movah,9
int21h
cld
leasi,mes2
movcx,elements
xorax,ax
adding:addax,[si];累加20個同學的分數
incsi
incsi
loopadding
movbl,elements
divbl;計算20個分數的平均值
xorah,ah
movbl,10
divbl
orax,3030h;把商和余數轉換成十進制顯示的ascii碼
movdx,ax
movah,2;以十進制值表示將平均值十位數顯示在屏幕上
int21h
movdl,dh
movah,2;以十進制值表示將平均值個位數顯示在屏幕上
int21h
movah,4ch;結束程序
int21h
codeends
endstart;編譯到此結束
程序運行結果如下:
92,85,74,81,70,68,65,78,54,43
94,100,83,88,79,83,79,69,62,60
averagesore=75
E. 如何用匯編編寫以下程序
一個匯編程序是由多個段組成的,這些段被用來存放代碼、數據或當作棧空間來使用。
一個有意義的匯編程序中至少要有一個段,這個段用來存放代碼。
程序結束標記
End 是一個匯編程序的結束標記,編譯器在編譯匯編程序的過程中,如果碰到了偽指令 end,就結束對源程序的編譯。
如果程序寫完了,要在結尾處加上偽指令end 。否則,編譯器在編譯程序時,無法知道程序在何處結束。
F. 如何編寫最簡單的匯編語言
首先明白編譯環境:以上4個exe程序必須在32機中運行,若是64位機,請參照dosbox0.74(如何在64位機中使用debug)使用方法。
了解計算機CPU原理:詳情請參照「80X86計算機組織」和「80X86的指令系統和定址方式」
首先有一道題:
求表達式Y=A*X+B-C的值,已知A、B、C分別存放在DA-1、DA-2、DA-3位元組單元,它們的值分別是:5 、 6、 7,X存放在INPUT位元組單元,結果Y放入JSJ_10位元組單元。
分析順序結構程序代碼:由記事本敲出來的
data segment da_1 db 5 da_2 db 6 da_3 db 7 input db 1 jsj_10 db 0data ends ;這一段在內存中定義了一個段,叫做data,並且其中存入了5個變數並且付入初值,db代表每個變數佔用1個位元組,若是dd則為字,為2個位元組code segment ;名字叫做code的段的定義,顯然這兒作為代碼段,當然code這個名字可以更改 assume cs:code,ds:data ;指定data為DS數據段,code為CS代碼段start: mov ax,data ;加法指令 mov ds,ax ;加法指令 mov al,da_1 ;加法指令
mov bl,input ;加法指令
mul bl ;乘法 add al,da_2 sub al,da_3 ;減法 mov jsj_10,al
exit: mov ah,4ch int 21h ;這兩行相當於ret(返回值),就像C語言中的return 0;
code ends end start
注釋: XXXX segment
.............
XXXX ends ;定義一個段
assume ds:XXXX 把XXXX段指定為ds(ds是段地址寄存器)
請先提前把masm edit debug link文件放入預定的文件夾,並把編寫的xxxx.asm代碼文件放入該文件夾,asm文件可用記事本寫成,並改格式txt為asm(有的看不到文件後綴.txt的請參照網路)
G. 如何編寫完整的匯編程序
data segment (segment和ends是一對,一定是成對出現的)
…… (這中間就是申明你需要的數據段,例如:mess db 1,2,3;其中mess只是一個名字,可以根據自己需要來,db表示每個字元占的存儲空間,也可以用dw,dd,db是一個位元組;後面的數據根據實際情況來)
data ends (這是數據段)
extra segment
…… (申明和數據段一樣)
extra ends (這是附加段)
code_seg segment (這是代碼段)
assume cs:code_seg,ds:data,es:extra (這個一定不能少,而且順序不能換,也就是說cs一定對應代碼段,後面也是相同的)
start: (start可以沒有,但冒號不能少)
mov ax,data (這四句是固定的,只能根據名稱不同改變data、extra的名稱,其它不能變)
mov ds,ax
mov ax,extra
mov es,ax
…… (這中間就是你說的那些代碼)
code_seg ends (這兩句也不能少)
end start