1. 程式人生 > >Linux 下 AT&T彙編

Linux 下 AT&T彙編

注:以下內容為學習筆記,多數是從書本、資料中得來,只為加深印象,及日後參考。然而本人表達能力較差,寫的不好。因非翻譯、非轉載,只好選原創,但多數乃摘抄,實為慚愧。但若能幫助一二訪客,幸甚!

大約一年前第三次嘗試自己寫一個玩具作業系統核心玩,寒假時寫到記憶體分頁,沒有搞定,開學後實驗室各種事,之後是找實習、實習、找工作、忙實驗,一直沒有空把它搞定,深以為憾。現在雖然實驗還沒搞好,但終究按捺不住準備再次嘗試BabyOS。

當然為了畢業,現在還得把主要時間用在做實驗上,假期才能有較多集中時間真正來做BabyOS。然而假期將近,邊角的一些時間,可以學習一下基礎知識。主要包括AT&T彙編、保護模式、8259A、8253\8254、CMOS、通過讀寫埠號操作硬碟、記憶體分段、分頁、中斷異常、系統呼叫等。

前幾次都是以Skelix為基礎,並參考Linux0.12(趙炯博士),Tinix/Orange‘s(於淵兄)來寫的,雖然也自己實現了一些東西,但終究是別人的程式碼居多,這次準備儘可能的用自己的程式碼,當然寫這個BabyOS 純屬娛樂。

這次依然準備用AT&T彙編 + C + 內聯彙編作為程式語言,所以首先準備花一點時間重新學一下AT&T彙編,當然也是Just For Fun,若在學習過程中感覺愉快,不妨多學點,若感到無味,則只求瞭解基本語法,因為實際上用不到多少彙編的知識,瞭解基本語法,遇到什麼再學什麼足矣。

先來個Hello World 吧~

.data
msg:
	.ascii "Hello world, hello AT&T asm!\n"
	len = . - msg

.text
.global _start

_start:
	movl	$len,	%edx	# 顯示的字元數
	movl	$msg,	%ecx	# 緩衝區指標
	movl	$1,	%ebx	# 檔案描述符
	movl	$4,	%eax	# 系統呼叫號,_write
	int	$0x80		# 系統呼叫

	movl	$0,	%ebx	# 傳給_exit的引數
	movl	$1,	%eax	# 系統呼叫號,_exit
	int	$0x80		# 系統呼叫

編譯、連結、執行:

[email protected]:~/program/asm/helloworld$ ls
helloworld.s  helloworld.s~  linux系統呼叫號
[email protected]:~/program/asm/helloworld$ as -o helloworld.o helloworld.s
[email protected]:~/program/asm/helloworld$ ld -o helloworld helloworld.o
[email protected]:~/program/asm/helloworld$ ls
helloworld  helloworld.o  helloworld.s  helloworld.s~  linux系統呼叫號

[email protected]:~/program/asm/helloworld$ ./helloworld 
Hello world, hello AT&T asm!

寫個簡單的makefile 吧:

all: helloworld
	
helloworld.o : helloworld.s
	as -o [email protected] $<

helloworld : helloworld.o
	ld -o [email protected] $<
測試一下:
[email protected]:~/program/asm/helloworld$ rm helloworld
[email protected]:~/program/asm/helloworld$ ls
helloworld.o  helloworld.s  helloworld.s~  linux系統呼叫號  makefile
[email protected]:~/program/asm/helloworld$ rm helloworld.o 
[email protected]:~/program/asm/helloworld$ ls
helloworld.s  helloworld.s~  linux系統呼叫號  makefile
[email protected]:~/program/asm/helloworld$ make
as -o helloworld.o helloworld.s
ld -o helloworld helloworld.o
[email protected]:~/program/asm/helloworld$ ls
helloworld  helloworld.o  helloworld.s  helloworld.s~  linux系統呼叫號  makefile
[email protected]:~/program/asm/helloworld$ ./helloworld 
Hello world, hello AT&T asm!

簡單註釋:

int $0x80是一條AT&T語法的中斷指令,用於Linux的系統呼叫。
Linux write系統呼叫原型:
ssize_t write(int fd, const void* buf, size_t count);
writes up to count bytes from the buffer pointed buf to the file referred to by the file descriptor fd.
程式碼中的movl $1, %ebx 就是檔案描述符fd,1表示STDOUT(標準輸出),即輸出到控制檯上
movl $msg, %ecx 就是buf,即緩衝區指標
movl $len, %edx 就是count,即寫到檔案fd的位元組數。
另一個簡單例子CPUID:
# cpuid.s Sample program to extract the processor Vendor ID
.section .data
output:
	.ascii "The processor Vendor ID is 'XXXXXXXXXXXX'\n"

.section .text
.global _start

_start:
	movl	$0,	%eax		# The CPUID output option(the Vendor ID string)	
	cpuid
	movl	$output,%edi
	movl	%ebx, 	28(%edi)
	movl	%edx,	32(%edi)
	movl	%ecx,	36(%edi)

	movl	$42,	%edx	# 顯示的字元數
	movl	$output,%ecx	# 緩衝區指標
	movl	$1,	%ebx	# 檔案描述符
	movl	$4,	%eax	# 系統呼叫號,_write
	int	$0x80		# 系統呼叫

	movl	$0,	%ebx	# 傳給_exit的引數
	movl	$1,	%eax	# 系統呼叫號,_exit
	int	$0x80		# 系統呼叫
編譯、連結、執行
[email protected]:~/program/asm/cpuid$ make
as -o cpuid.o cpuid.s
ld -o cpuid cpuid.o
[email protected]:~/program/asm/cpuid$ ./cpuid 
The processor Vendor ID is 'GenuineIntel'

相關推薦

Linux AT&T彙編

注:以下內容為學習筆記,多數是從書本、資料中得來,只為加深印象,及日後參考。然而本人表達能力較差,寫的不好。因非翻譯、非轉載,只好選原創,但多數乃摘抄,實為慚愧。但若能幫助一二訪客,幸甚! 大約一年前第三次嘗試自己寫一個玩具作業系統核心玩,寒假時寫到記憶體分頁,沒有搞定,

Linuxgdb顯示intel和at&t彙編

在windows下使用習慣了intel彙編,在Linux下看的難受,在gdb下使用 set disassembly-flavor intel  轉換為intel格式的彙編 set disassembly-flavor att 轉換為att格式的彙編

linux-AT&T彙編,把32位暫存器的值以16進位制字串打印出來

將暫存器的值以16進位制顯示,程式如下:.section .bbs .lcomm buf,10 #定義一個10位元組長度的記憶體區,用來儲存計算出來的字元 .section .text .globl _start _start: //初始化暫存器 movl $0x01abc

Linuxat 和 crontab的基本運用以及臨時檔案基本管理

一、at的基本運用 在終端輸入watch -n 1 ls -R /mnt/           //監控檔案每秒檢視一次並以第歸的方式列出來 使用at命令制定延時任務 

AT&T 彙編移位運算

 1.移位乘法       sal destination       sal %c1, destination       sal shifter, destination       第一種格式destination的值向左移1位,這等同於使值乘以2.  線第二種

關於AT&T彙編和c語言的相互呼叫的分析

這方面很多人寫了blog,這次我也是學習,從objdump等工具分析。 ------------------------c中調用匯編------------------------------- 首先給出c檔案 #include<stdio.h> int m

使用GDB 除錯AT&T 彙編

注:以下內容為學習筆記,多數是從書本、資料中得來,只為加深印象,及日後參考。然而本人表達能力較差,寫的不好。因非翻譯、非轉載,只好選原創,但多數乃摘抄,實為慚愧。但若能幫助一二訪客,幸甚! 除錯在程式設計中是不可缺少的,嘗試使用GDB 除錯一下昨晚的AT&T彙編程

經常聽說AT&T彙編、Intel彙編,還能聽到ARM彙編,這個ARM彙編與前兩個有什麼關聯?

origin: https://zhidao.baidu.com/question/424592744355848412.htmlAT&T彙編和Intel彙編,是兩種不同組合語言格式,與具體CPU關係不大,只是

AT&T彙編學習總結二-組合語言程式範例

第四章組合語言範例 建立簡單程式 CPUID指令:CPUID指令是一條彙編指令,不容易從高階語言應用程式執行它。它是請求處理器的特定資訊並且把資訊返回到特定暫存器中的低階指令。 CPUID指令使用

AT&T彙編心得之間接定址和LEA指令

AT&T彙編心得(1)定址方式:0x4(%esp)的操作是把暫存器esp中的值取出,然後加上4,得到的值作為地址,間接定址得到需要的資料例如:pushl -0x4(%ecx)該指令的含義是取出暫存器ecx的值,減去4,將得到的值作為地址,在記憶體找到該地址對應的值,將

轉intel彙編AT&T彙編的區別

因為在linux的核心中,很多跟底層硬體接觸的都使用匯編語言,但是Linux不僅使用一種組合語言,除了Intel的組合語言之外,還是用AT&T的組合語言,因此可以說這兩個是一個基礎,Intel的彙編相信很多學計算機的人都學習過,但是AT&T的就不一定了,個人認

AT&T彙編格式

絕大多數 Linux 程式設計師以前只接觸過DOS/Windows 下的組合語言,這些彙編程式碼都是 Intel 風格的。但在 Unix 和 Linux 系統中,更多采用的還是 AT&

關於AT&T 彙編:64 位與32 位的區別

下面列出一些不同之處,可以參考這個文件,將會有更詳細的資訊(System V Application Binary Interface AMD64 Architecture Processor Supplement)。 1. 64位系統中函式呼叫不再採用單純壓棧的方式:下

LinuxAT T語法 即GNU as 彙編語法 入門

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

linux彙編工具之GAS(AT&T 語法)和NASM(Intel 語法)比較

前言:在學校時,學過的彙編是Intel語言的彙編,編譯器是MASM,使用的是DOS系統。慚愧的是那時沒有對組合語言有較深入的研究,有許多問題也不慎瞭解,迷迷糊糊至今。最近,在看《使用開源軟體-自己寫作業系統》http://code.google.com/p/writeos/

Linux使用vi新建文件保存文件時遇到錯誤:E212: Can't open file for writing

mage images roo .cn logs 分享 思路 操作 新建 出現E212: Can‘t open file for writing的問題是由於權限問題導致的,解決方法有以下思路: 1、使用root進行登錄,然後再操作。 2、在使用命令時,前面加sudo

Linuxtomcat啟動Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of

環境 技術分享 variable ava eight 錯誤 mbr bin p s 在linux下安裝好tomcat啟動時報如下錯誤: Neither the JAVA_HOME nor the JRE_HOME environment variable is defin

linux安裝mariadb,提示file:///rhel7.3/repodata/repomd.xml: [Errno 14] curl#37 - "Couldn't open file /rhe

在本地安裝mariadb時失敗,提示如下: 根據提示,初步定位為yum源配置問題。 檢視本地yum源: 發現,baseurl中配置的地址,掛載失敗。 用命令進行重新掛載。(本地已下載映象) mount  映象位置/映象名   

AT&T 彙編移位運算

 1.移位乘法       sal destination       sal %c1, destination       sal shifter, destination &nbs

AT&T 彙編四則運算

1 :加法    1.1  add   source ,destination     ADD指令可以將8,16,32位指令相加。其中b(用於位元組),w(用於字),或者l(用於漢字)     使用add指令