閱讀755 返回首頁    go 阿裏雲 go 技術社區[雲棲]


匯編 HelloWorld

圖靈獎獲獎得主,Alan Perlis曾說過:“如果一門語言沒有改變你的編程思維,那麼它不值得你去學習”


別人學高級語言,但是高級語言會變,我學低級語言,學了永遠也不會變!


stack segment stack ; 定義堆棧段
db 100 dup(?) ;堆棧段長100字節, 這裏db就是字節的意思,如果是用dw就是字,100 dup(?) 中的dup是重複的意思,這句話是重複100遍,一遍定義一個字節,每個字節裏全填0
stack ends ; 堆棧段結束

data segment ;數據段
szHello db 'hello,world',0dh,0ah,'$' ;定義szHello , 0dh,0ah分別是回車鍵,換行鍵的ASCII碼, '$'是DOS功能調用INT 21H中9號功能要求的要顯示字符串的結束標誌,寫成szHello db 'hello,world',0dh,0ah,24h;也可以,因為24h就是'$'
data ends ;數據段結束

code segment ;代碼段
assume cs:code,ds:data,ss:stack ;確定cs,ds,ss,指向的邏輯段

匯編中,Assume的作用是告訴匯編程序各個段寄存器應該與哪個邏輯段對應,該偽操作把程序中定義的各個段分配給段寄存器,使程序中使用的段名與段寄存器建立起對應關係。使得匯編程序清楚在計算地址時使用哪一個段地址但並不賦予該邏輯段的段地址。沒有Assume這行代碼也可以,但其後的變量操作需要用段跨越前綴指明所在邏輯段。 
所以說ASSUME語句是設定語句,是告訴匯編器在將源代碼翻譯成機器語言時,CPU的各個段寄存器如何與你定義的各個邏輯段相聯係.比如ASSUME CS:CODE 這個例子CS段寄存器就選了CODE代碼段.

start: 
mov ax,data ;設置數據段的段地址ds
mov ds,ax ;

mov ah,9 ; ah中的9號功能表示要顯示一行字符串
mov dx,offset szHello ;取得szHello的偏移地址,也就是在ds段中的偏移地址
int 21h

;暫停,任意鍵關閉 
mov ah,1 ;這兩句是從鍵盤輸入一個字符功能
int 21h

mov ah,4ch ;退出 ah中的功能號4ch表示要返回DOS
int 21h ;調用DOS
code ends 
end start


另附上一段代碼,這段代碼是網上一個博客裏麵的,其實代碼有錯,我略一修改。

assume ds:data,cs:code不能放在start後麵,並且結束程序的功能號是4ch:

data segment
	output db 'hello,world',0dh,0ah,'$'
data ends

code segment
assume ds:data,cs:code
start: 
	mov ax,data
	mov ds,ax
	
	mov dx,offset output
	mov ah,09h
	int 21h
	
	mov ah,<span >4ch</span>
	int 21h

code ends
	end start





最後更新:2017-04-03 05:39:37

  上一篇:go 雷軍20年前編寫的匯編代碼
  下一篇:go 晶振電路原理