匯編編程
『壹』 匯編語言編程
匯編語言中EAX 與 EBX 相乘movx,eax;EAX 的值送入 X寄存器register是 CPU 中被命名的存儲位置,用於保存操作的中間結果。這個例子的重點不是說明 C++ 與匯編語言哪個更好,而是展示它們的關系。匯編語言可移植嗎。一種語言,如果它的源程序能夠在各種各樣的計算機系統中進行編譯和運行,那麼這種語言被稱為是可移植的portable。例如,一個 C++ 程序,除非需要特別引用某種操作系統的庫函數,否則它就幾乎可以在任何一台計算機上編譯和運行。java 語言的一大特點就是,其編譯好的程序幾乎能在所有計算機系統中運行。匯編語言不是可移植的,因為它是為特定處理器系列設計的。目前廣泛使用的有多種不同的匯編語言,每一種都基於一個處理器系列。對於一些廣為人知的處理器系列,匯編語言指令會直接與該計算機體系結構相匹配,或者在執行時用一種被稱為微代碼解釋器的處理器內置程序來進行轉換。為什麼要學習匯編語言。
『貳』 匯編和編程有什麼區別啊
總而言之,編程是一種行為,匯編(語言)是一種工具
■什麼是匯編語言
匯編語言(Assembly Language)是面向機器的程序設計語言。
在匯編語合中,用助記符(Memoni)代替操作碼,用地址符號(Symbol)或標號(Label)代替地址媽。這樣用符號代替機器語盲的二進制碼,就把機器語音變成了匯編語言。於是匯編語言亦稱為符號語言。
使用匯編語言編寫的程序,機器個能直接識別,要由一種程序將匯編語言翻譯成機器語言,這種起翻譯作用的程序叫匯編程序,匯編程序是系統軟體中語言處理系統軟體。匯編語言把匯編程序翻譯成機器語言的過程稱為f匯編。
匯編語言比機器語言易於讀寫、易於調試和修改,同時也具有機器語言執行速度快,占內存空間少等優點,但在編寫復雜程序時具有明顯的局限性,匯編語言依賴於具體的機型,不能通用,也不能在不同機型之間移植。
■對於不同型號的計算機,有著不同的結構的匯編語言
匯編語言由於採用了助記符號來編寫程序,比用機器語言的二進制代碼編程要方便些,在一定程度上簡化了編程過程。匯編語言的特點是用符號代替了機器指令代碼,而且助記符與指令代碼一一對應,基本保留了機器語言的靈活性。使用匯編語言能面向機器並較好地發揮機器的特性,得到質量較高的程序。
匯編語言是面向具體機型的,它離不開具體計算機的指令系統,因此,對於不同型號的計算機,有著不同的結構的匯編語言,而且,對於同一問題所編制的匯編語言程序在不同種類的計算機間是互不相通的。
匯編語言中由於使用了助記符號,用匯編語言編制的程序輸入計算機,計算機不能象用機器語言編寫的程序一樣直接識別和執行,必須通過預先放入計算機的"匯編程序"的加工和翻譯,才能變成能夠被計算機識別和處理的二進制代碼程序。用匯編語言等非機器語言書寫好的符號程序稱為源程序,運行時匯編程序要將源程序翻譯成目標程序。目標程序是機器語言程序,它一經被安置在內存的預定位置上,就能被計算機的CPU處理和執行。
匯編語言像機器指令一樣,是硬體操作的控制信息,因而仍然是面向機器的語言,使用起來還是比較繁瑣費時,通用性也差。但是,匯編語言用來編制系統軟體和過程式控制制軟體,其目標程序佔用內存空間少,運行速度快,有著高級語言不可替代的用途。
目前通用的編程語言有兩種形式:匯編語言和高級語言。
匯編語言的實質和機器語言是相同的,都是直接對硬體操作,只不過指令採用了英文縮寫的標識符,更容易識別和記憶。它同樣需要編程者將每一步具體的操作用命令的形式寫出來。
匯編程序的每一句指令只能對應實際操作過程中的一個很細微的動作,例如移動、自增,因此匯編源程序一般比較冗長、復雜、容易出錯,而且使用匯編語言編程需要有更多的計算機專業知識,但匯編語言的優點也是顯而易見的,用匯編語言所能完成的操作不是一般高級語言所能實現的,而且源程序經匯編生成的可執行文件不僅比較小,而且執行速度很快。
簡單的說,編程就是為了藉助於計算機來達到某一目的或解決某個問題,而使用某種程序設計語言編寫程序代碼,並最終得到結果的過程。
『叄』 匯編語言編程
CODESEGMENT
ASSUMECS:CODE
ORG100H
START:JMPBEGIN
XDW2345
YDW789
ZDW?
BEGIN:
PUSHCS
POPDS
PUSHCS
POPES
MOVAX,X
CMPAX,Y
JL@1
SUBAX,Y
MOVZ,AX
JMP@2
@1:
MOVAX,Y
MOVDX,0
MOVBX,X
DIVBX
MOVZ,AX
@2:
MOVAX,Z
CALLDISPAX
MOVAH,4CH
INT21H
;=================================================
DISPAXPROCNEAR
;以10進制數形式顯示,要顯示的值事先存AX中
PUSHBX
PUSHCX
PUSHDX
PUSHSI
PUSHDS
PUSHCS
POPDS
JMPNUMDEF
DIVARRDW10000,1000,100,10,1
NZDB0
NUMDEF:
MOVBYTEPTRNZ,0
PUSHAX
LEASI,DIVARR
MOVCX,5
DISP1:
POPAX
MOVDX,0
MOVBX,[SI]
DIVBX
PUSHDX
CMPAL,0
JNEDISP2
CMPBYTEPTRNZ,1
JEDISP2
CMPCX,1
JEDISP2
MOVDL,20H
JMPDISP3
DISP2:
ADDAL,30H
MOVDL,AL
MOVBYTEPTRNZ,1
DISP3:
MOVAH,2
INT21H
INCSI
INCSI
LOOPDISP1
POPDX
POPDS
POPSI
POPDX
POPCX
POPBX
RET
DISPAXENDP
;==========================================
CODEENDS
ENDSTART
『肆』 匯編編程
data segment
string db 'Today is Sunday & July 16,2000$'
data ends
stack segment stack
db 200 p(0)
stack ends
code segment
assume cs:code,ds:data,ss:stack
main proc far
start
push bx
push dx
push si
push cx
lea dx,string
mov ah,9
int 21h
lea si,buf
dec si
loop: inc si
cmp '&',[si]
jnz loop
mov [si],'/'
lea dx,string
mov ah,9
int 21h
main endp
code ends
end start
『伍』 用匯編語言編程
CODESEGMENT
ASSUMECS:CODE
BUFDB50DUP(?)
BUF1DB50DUP(?)
START:PUSHCS
POPDS
PUSHCS
POPES
;==============隨機生成50個數
LEADI,BUF
MOVCX,50
CLD
@1:
CALLRAND
STOSB
MOVAX,2
CALLDELAY_PROC
LOOP@1
;===============輸出這50個數
CALLLFCR
LEASI,BUF
MOVCX,50
CLD
@11:
LODSB
CALLDSPAL
LOOP@11
;================轉為bcd碼保存
LEASI,BUF
LEADI,BUF1
MOVCX,50
CLD
@2:
LODSB
MOVAH,0
MOVBL,10
DIVBL
SHLAL,4
ADDAL,AH
STOSB
LOOP@2
;===============輸出bcd數
CALLLFCR
LEASI,BUF1
MOVCX,50
CLD
@3:
MOVAX,CX
MOVBL,10
DIVBL
ORAH,AH
JNE@4
CALLLFCR
@4:
LODSB
RORAL,4
PUSHAX
MOVDL,AL
ANDDL,0FH
ORDL,30H
MOVAH,2
INT21H
POPAX
RORAL,4
MOVDL,AL
ANDDL,0FH
ORDL,30H
MOVAH,2
INT21H
MOVDL,'H'
INT21H
MOVDL,32
INT21H
LOOP@3
MOVAH,4CH
INT21H
;===============================================================
DELAY_PROCPROCNEAR;延遲子程式,延遲ax/18秒
PUSHES
PUSHDX
MOVDX,40H
MOVES,DX
MOVDX,ES:[006CH];取系統1/18秒計數
ADDDX,AX;延時x/18
DELAY10:
CMPES:[006CH],DX;時限到了?
JBEDELAY10;沒
POPDX
POPES
RET
DELAY_PROCENDP
;============================================================
RANDPROCNEAR
;利用時鍾的低位反轉除100的余數作為隨機數
;隨機數在ax中帶回
PUSHBX
PUSHCX
PUSHDX
PUSHF
MOVAH,0
INT1AH
;MOVAX,CX
MOVBX,DX
MOVCX,16
@RAND1:
RORBX,1
RCLAX,1
LOOP@RAND1
MOVDX,0
MOVBX,100
DIVBX
MOVAX,DX
POPF
POPDX
POPCX
POPBX
RET
RANDENDP
;==================================
LFCR:PUSHAX
PUSHDX
MOVAH,2
MOVDL,13
INT21H
MOVDL,10
INT21H
POPDX
POPAX
RET
;=================================
DSPALPROCNEAR
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHF
XORAH,AH
XORCX,CX
MOVBL,10
@DSPAL1:
DIVBL
INCCX
MOVDL,AH
XORAH,AH
ORDX,30H
PUSHDX
CMPAL,0
JNE@DSPAL1
MOVAH,2
@DISPAL2:
POPDX
INT21H
LOOP@DISPAL2
MOVDL,32
INT21H
POPF
POPDX
POPCX
POPBX
POPAX
RET
DSPALENDP
;================================
CODEENDS
ENDSTART
『陸』 匯編語言和普通的編程語言有啥不同
1. 匯編語言
為了減輕使用機器語言編程的痛苦,人們進行了一種有益的改進:用一些簡潔的英文字母、符號串來替代一個特定的指令的二進制串,比如,用「A D D」代表加法,「M O V」代表數據傳遞等等,這樣一來,人們很容易讀懂並理解程序在干什麼,糾錯及維護都變得方便了,這種程序設計語言就稱為匯編語言,即第二代計算機語言。然而計算機是不認識這些符號的,這就需要一個專門的程序,專門負責將這些符號翻譯成二進制數的機器語言,這種翻譯程序被稱為匯編程序。
匯編語言同樣十分依賴於機器硬體,移植性不好,但效率仍十分高,針對計算機特定硬體而編制的匯編語言程序,能准確發揮計算機硬體的功能和特長,程序精煉而質量高,所以至今仍是一種常用而強有力的軟體開發工具。
2. 機器語言
電子計算機所使用的是由「0」和「1」組成的二進制數,二進制是計算機的語言的基礎。計算機發明之初,人們只能降貴紆尊,用計算機的語言去命令計算機干這干那,一句話,就是寫出一串串由「0」和「1」組成的指令序列交由計算機執行,這種語言,就是機器語言。使用機器語言是十分痛苦的,特別是在程序有錯需要修改時,更是如此。而且,由於每台計算機的指令系統往往各不相同,所以,在一台計算機上執行的程序,要想在另一台計算機上執行,必須另編程序,造成了重復工作。但由於使用的是針對特定型號計算機的語言,故而運算效率是所有語言中最高的。機器語言,是第一代計算機語言。
3. 高級語言
從最初與計算機交流的痛苦經歷中,人們意識到,應該設計一種這樣的語言,這種語言接近於數學語言或人的自然語言,同時又不依賴於計算機硬體,編出的程序能在所有機器上通用。經過努力,1 9 5 4年,第一個完全脫離機器硬體的高級語言—F O RT R A N問世了,4 0多年來,共有幾百種高級語言出現,有重要意義的有幾十種,影響較大、使用較普遍的有F O RT R A N、A L G O L、C O B O L、B A S I C、L I S P、S N O B O L、P L / 1、P a s c a l、C、P R O L O G、A d a、C + +、V C、V B、D e l p h i、J AVA 等。
高級語言的發展也經歷了從早期語言到結構化程序設計語言,從面向過程到非過程化程序語言的過程。相應地,軟體的開發也由最初的個體手工作坊式的封閉式生產,發展為產業化、流水線式的工業化生產。
6 0年代中後期,軟體越來越多,規模越來越大,而軟體的生產基本上是人自為戰,缺乏科學規范的系統規劃與測試、評估標准,其惡果是大批耗費巨資建立起來的軟體系統,由於含有錯誤而無法使用,甚至帶來巨大損失,軟體給人的感覺是越來越不可靠,以致幾乎沒有不出錯的軟體。這一切,極大地震動了計算機界,史稱「軟體危機」。人們認識到:大型程序的編制不同於寫小程序,它應該是一項新的技術,應該像處理工程一樣處理軟體研製的全過程。程序的設計應易於保證正確性,也便於驗證正確性。1 9 6 9年,提出了結構化程序設計方法,1 9 7 0年,第一個結構化程序設計語言—P a s c a l語言出現,標志著結構化程序設計時期的開始。
8 0年代初開始,在軟體設計思想上,又產生了一次革命,其成果就是面向對象的程序設計。在此之前的高級語言,幾乎都是面向過程的,程序的執行是流水線似的,在一個模塊被執行完成前,人們不能幹別的事,也無法動態地改變程序的執行方向。這和人們日常處理事物的方式是不一致的,對人而言是希望發生一件事就處理一件事,也就是說,不能面向過程,而應是面向具體的應用功能,也就是對象(o b j e c t)。其方法就是軟體的集成化,如同硬體的集成電路一樣,生產一些通用的、封裝緊密的功能模塊,稱之為軟體集成塊,它與具體應用無關,但能相互組合,完成具體的應用功能,同時又能重復使用。對使用者來說,只關心它的介面(輸入量、輸出量)及能實現的功能,至於如何實現的,那是它內部的事,使用者完全不用關心,C + +、V B、D e l p h i就是典型代表。
高級語言的下一個發展目標是面向應用,也就是說:只需要告訴程序你要干什麼,程序就能自動生成演算法,自動進行處理,這就是非過程化的程序語言。
c++是面向對象的高級語言
『柒』 匯編語言編程序
首先,你要明白:
1. 一個正數和一個負數相加,結果肯定不會溢出,即結果既不會大於最大正數,也不會小於最小負數;同樣道理,兩個正數或兩個負數相減,結果肯定也不會溢出。另外還有一種特殊情況,即當DATA1為0,DATA2為最小負數的時候,DATA1 - DATA2也會溢出。
2. 若結果大於最大正數,肯定是兩個正數相加;若結果小於最小負數,則肯定是兩個負數相加;
3. 溢出標志只能判斷是否溢出,而不能判斷是正溢出,還是負溢出。所以應該先判斷OF標志位,若有溢出,接著判斷DATA1或者是DATA2的符號,若為正數,則為正溢出;否則為負溢出。
程序如下,我是按在386上編的。
.model small
.386
.dosseg
.stack 1024
.data
;DATA1 dd 81234567h
DATA1 dd 7fffffffh; 最大正數
DATA2 dd 80000000h; 最小負數
;DATA2 dd 1234;
SUM dd ?
.code
.startup
mov eax, DATA1
add eax, DATA2
jo OverFlow
jmp Done
OverFlow:
cmp DATA1, 0
jg PlusOverFlow
mov eax, 80000000h ;最小負數
jmp Done
PlusOverFlow:
mov eax, 7fffffffh ;最大正數
Done:
mov SUM, eax
.exit
end
你可以修改下DATA1和DATA2的值看下結果。
『捌』 匯編語言編程
很顯然不是,最低級的語言應該是機器語言,都是0或1的機器碼。匯編語言也算是低級語言,高級語言包括C語言、C++、VB、VC++、java等,匯編語言效率抄很高,學習微機原理時匯編語言是必須要學習的,執行的時候需要進行匯編,所謂匯編,就是把匯編語言翻譯成計算機能夠看懂的語襲言,也就是機器語言。同理,像您用C語言編的程序就需要編譯也是這個道理。不過匯編語言比較繁瑣,知你編的程序另外一個人不大可能看懂,但高級語言別人是能夠很快看明白的,道所以安全性只是相對的,很多應用軟體的源代碼你是看不到的,也就無所謂安全不安全了
『玖』 匯編語言編程,寫代碼
;---------------------------
ASSUME CS:CC, DS:QW
;---------------------------
QW SEGMENT
M_1 DB 12, 13, 10, -5, -85, 37, 92, -25, 94, 10, -36
DB 1, 100, 12, -37, 85, -6, 28, 125, 34, 17, -92
LLL EQU $ - M_1
M_P DB 101 DUP(0)
M_N DB 101 DUP(0)
MSG DB 13, 10, 'Press any key to continue ... $'
O_P DB 13, 10, '+$'
O_N DB 13, 10, '-$'
QW ENDS
;---------------------------
CC SEGMENT
START:
MOV AX, QW
MOV DS, AX
;
CALL TONGJI
CALL DISPLAY
EXIT:
LEA DX, MSG
MOV AH, 9
INT 21H
MOV AH, 7
INT 21H
MOV AH, 4CH
INT 21H ;返回DOS
;---------------------------
TONGJI:
MOV BX, OFFSET M_1
MOV SI, OFFSET M_P
MOV DI, OFFSET M_N
MOV CX, LLL
LP: MOV AL, [BX]
CMP AL, 128
JB ZHENG
MOV [DI + 1], AL
INC DI
INC M_N
JMP NEXT
ZHENG:
MOV [SI + 1], AL
INC SI
INC M_P
NEXT:
INC BX
LOOP LP
RET
;---------------------------
DISPLAY:
LEA DX, O_P
MOV AH, 9
INT 21H
MOV AL, M_P
MOV AH, 0
CALL OUTPUT
LEA DX, O_N
MOV AH, 9
INT 21H
MOV AL, M_N
MOV AH, 0
CALL OUTPUT
RET
;---------------------------
OUTPUT:
MOV BX, 10
MOV CX, 0
OL1:MOV DX, 0
DIV BX
ADD DL, '0'
PUSH DX
INC CX
CMP AX, 0
JNZ OL1
MOV AH, 2
OL2:POP DX
INT 21H
LOOP OL2
RET
;---------------------------
CC ENDS
END START
;---------------------------
程序執行結果如下:
C:\MASM>ww
+15
-7
Press any key to continue ...
C:\MASM>
『拾』 匯編語言的編程用什麼集成開發工具
匯編工具有很多種類,根據自己習慣選擇即可。
MASM(分步的,初學者不易掌握)
VISUALASM(集成環境的)
win32匯編的masm32軟體包(Windows環境下的)
nasm(linux平台)
RadASM