編匯編程序
『壹』 用匯編語言編寫一完整程序!
摘要 DATAS SEGMENT
『貳』 如何用匯編編寫以下程序
一個匯編程序是由多個段組成的,這些段被用來存放代碼、數據或當作棧空間來使用。
一個有意義的匯編程序中至少要有一個段,這個段用來存放代碼。
程序結束標記
End 是一個匯編程序的結束標記,編譯器在編譯匯編程序的過程中,如果碰到了偽指令 end,就結束對源程序的編譯。
如果程序寫完了,要在結尾處加上偽指令end 。否則,編譯器在編譯程序時,無法知道程序在何處結束。
『叄』 匯編語言用什麼編寫
任何語言的源程序都是可以用「任何」文本編輯器生成的,唯一的要求:非格式化。也就是不要有字體、顏色、段落等等格式控制,換句話說,要純ASCII文本文件。
通常我就用「記事本」,在命令行方式下就用EDIT。
至於IDE,網上也有很多,但是沒見過幾個特別好用的,沒有集成調試(DEBUG)功能的話,還不如就用批處理。
『肆』 如何編寫完整的匯編程序
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
『伍』 編寫匯編程序
例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
注意:該參考程序缺少初始數據輸入和排序結果輸出,同學們在做實驗時應將這兩個步驟考慮進去
『陸』 如何編寫最簡單的匯編語言
首先明白編譯環境:以上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的請參照網路)
『柒』 怎樣進入編寫匯編程序
新建工程——新建文件——保存為.asm——源代碼組右鍵「添加文件到源代碼組」,然後就可以寫程序了。具體指令什麼的,找一本匯編語言的書看吧。
『捌』 用匯編語言編寫程序
codesegment
assumecs:code
org100h
start:
jmpbbb
msg1db13,10,'pleaseinput3numbers:','$'
msg2db13,10,'thesumof3numbers=','$'
msg3db13,10,'Invalidvote!','$'
msg4db13,10,'doyouwanttoquitthisprogram?(q/others):','$'
bbb:pushcs
popds
pushcs
popes
@1:
movah,9
leadx,msg1
int21h
callinputnum
leasi,@array
movax,0
movcx,3
@2:
cmpwordptr[si],0
je@3
addax,[si]
incsi
incsi
loop@2
pushax
movah,9
leadx,msg2
int21h
popax
calldispaxs
jmp@4
@3:
movah,9
leadx,msg3
int21h
@4:
callprintlfcr
callprintlfcr
movah,9
leadx,msg4
int21h
movah,1
int21h
cmpal,'q'
je@exit
jmp@1
@exit:
movah,4ch
int21h
;==================================
PRINTLFCRPROCNEAR
PUSHAX
PUSHDX
MOVAH,9
LEADX,@LFCR
INT21H
POPDX
POPAX
RET
@LFCRDB13,10,'$'
PRINTLFCRENDP
;===============================================
;鍵盤輸入數值數組子程序(數組名為@array,元素個數存放在@num中)
;可以是負數
INPUTNUMPROCNEAR
PUSHAX
PUSHCX
PUSHSI
PUSHDI
PUSHF
;輸入的數據以一個空格分隔,以回車符結束輸入
LEADI,@ARRAY;將數組第一個元素的有效地址置入DI
MOVWORDPTR@NUM,0
@STIN:
MOVAX,0
PUSHAX
MOVBYTEPTR@SIGNN,0
@AGAIN1:
MOVAH,1
INT21H
MOVBYTEPTR@CHAR,AL
CMPAL,13
JE@LINE0
CMPAL,''
JE@LINE0
CMPAL,'-'
JNE@INPUT1
MOVBYTEPTR@SIGNN,1
JMP@AGAIN1
@INPUT1:
SUBAL,30H
MOVAH,0
MOVSI,AX
POPAX
MOVCL,10
MOVCH,0
MULCX
ADDAX,SI
PUSHAX
JMP@AGAIN1
@LINE0:
POPAX
CMPBYTEPTR@SIGNN,1
JNE@INPUT2
NEGAX
@INPUT2:
MOVWORDPTR[DI],AX
INCWORDPTR@NUM
CMPBYTEPTR@CHAR,13
JE@STINEND
INCDI
INCDI
JMP@STIN
@STINEND:
POPF
POPDI
POPSI
POPCX
POPAX
RET
@ARRAYDW100DUP(0)
@NUMDW0
@CHARDB?
@SIGNNDB0
INPUTNUMENDP
;=========================================
;將要顯示的有符號數置於ax中
DISPAXSPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHSI
PUSHDI
PUSHBP
PUSHDS
PUSHES
PUSHF
PUSHCS
POPDS
PUSHCS
POPES
MOVCX,6
LEADI,DISPAXSS
@DISPAXS:
MOVBYTEPTR[DI],32
INCDI
LOOP@DISPAXS
PUSHAX
MOVDL,32
MOVAH,2
INT21H
POPAX
MOVBYTEPTRNZS,0
MOVBYTEPTRSIGNS,0
CMPAX,0
JGE@DISPAXS0
MOVBYTEPTRSIGNS,1
NEGAX
@DISPAXS0:
PUSHAX
LEASI,DIVARRS
LEADI,DISPAXSS
INCDI
MOVCX,5
@DISPAXS1:
POPAX
MOVDX,0
MOVBX,[SI]
DIVBX
PUSHDX
CMPAL,0
JNE@DISPAXS2
CMPBYTEPTRNZS,1
JE@DISPAXS2
CMPCX,1
JE@DISPAXS2
MOVDL,20H
JMP@DISPAXS3
@DISPAXS2:
ADDAL,30H
MOVDL,AL
MOVBYTEPTRNZS,1
@DISPAXS3:
MOVBYTEPTR[DI],DL
INCSI
INCSI
INCDI
LOOP@DISPAXS1
POPDX
CMPBYTEPTRSIGNS,1
JNE@DISPAXS6
LEASI,DISPAXSS
ADDSI,5
@DISPAXS4:
CMPBYTEPTR[SI],32
JE@DISPAXS5
DECSI
JMP@DISPAXS4
@DISPAXS5:
MOVBYTEPTR[SI],'-'
@DISPAXS6:
LEADX,DISPAXSS
MOVAH,9
INT21H
POPF
POPES
POPDS
POPBP
POPDI
POPSI
POPDX
POPCX
POPBX
POPAX
RET
DIVARRSDW10000,1000,100,10,1
NZSDB0
SIGNSDB0
DISPAXSSDB32,32,32,32,32,32,'$'
DISPAXSENDP
;==================================
codeends
endstart
『玖』 什麼是匯編語言程序
使用匯編語言編寫的程序,機器不能直接識別,要由一種程序將匯編語言翻譯成機器語言,這種起翻譯作用的程序叫匯編程序,匯編程序是系統軟體中語言處理系統軟體。匯編語言編譯器把匯編程序翻譯成機器語言的過程稱為匯編。
『拾』 編寫匯編語言程序
;本程序通過編譯,運行正確。
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