亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? linux 匯編語言開發指南 - 21ic中國電子網.htm

?? GCC中文使用詳細說明
?? HTM
?? 第 1 頁 / 共 4 頁
字號:
        <P align=center>
        <TABLE cellSpacing=0 borderColorDark=#d9d9d9 cellPadding=2 
        borderColorLight=#000000 border=1>
          <TBODY>
          <TR>
            <TD align=middle width=200 bgColor=#d9d9d9><B>AT&amp;T 格式</B></TD>
            <TD align=middle width=200 bgColor=#d9d9d9><B>Intel 格式</B></TD></TR>
          <TR>
            <TD>ljump $section, $offset</TD>
            <TD width=200>jmp far section:offset</TD></TR>
          <TR>
            <TD>lcall $section, $offset</TD>
            <TD width=200>call far section:offset</TD></TR></TBODY></TABLE></P>
        <P>與之相應的遠程返回指令則為:</P>
        <P align=center>
        <TABLE cellSpacing=0 borderColorDark=#d9d9d9 cellPadding=2 
        borderColorLight=#000000 border=1>
          <TBODY>
          <TR>
            <TD align=middle width=200 bgColor=#d9d9d9><B>AT&amp;T 格式</B></TD>
            <TD align=middle width=200 bgColor=#d9d9d9><B>Intel 格式</B></TD></TR>
          <TR>
            <TD>lret $stack_adjust</TD>
            <TD width=200>ret far stack_adjust</TD></TR></TBODY></TABLE></P>
        <LI>
        <P>在 AT&amp;T 匯編格式中,內存操作數的尋址方式是</P>
        <TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc 
border=1>
          <TBODY>
          <TR>
            <TD><PRE><CODE>
section:disp(base, index, scale)
</CODE></PRE></TD></TR></TBODY></TABLE>
        <P>而在 Intel 匯編格式中,內存操作數的尋址方式為:</P>
        <TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc 
border=1>
          <TBODY>
          <TR>
            <TD><PRE><CODE>
section:[base + index*scale + disp]
</CODE></PRE></TD></TR></TBODY></TABLE>
        <P>由于 Linux 工作在保護模式下,用的是 32 位線性地址,所以在計算地址時不用考慮段基址和偏移量,而是采用如下的地址計算方法:</P>
        <TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc 
border=1>
          <TBODY>
          <TR>
            <TD><PRE><CODE>
disp + base + index * scale
</CODE></PRE></TD></TR></TBODY></TABLE>
        <P>下面是一些內存操作數的例子:</P>
        <P align=center>
        <TABLE cellSpacing=0 borderColorDark=#d9d9d9 cellPadding=2 
        borderColorLight=#000000 border=1>
          <TBODY>
          <TR>
            <TD align=middle width=200 bgColor=#d9d9d9><B>AT&amp;T 格式</B></TD>
            <TD align=middle width=200 bgColor=#d9d9d9><B>Intel 格式</B></TD></TR>
          <TR>
            <TD>movl -4(%ebp), %eax</TD>
            <TD width=200>mov eax, [ebp - 4]</TD></TR>
          <TR>
            <TD>movl array(, %eax, 4), %eax</TD>
            <TD width=200>mov eax, [eax*4 + array]</TD></TR>
          <TR>
            <TD>movw array(%ebx, %eax, 4), %cx</TD>
            <TD width=200>mov cx, [ebx + 4*eax + array]</TD></TR>
          <TR>
            <TD>movb $4, %fs:(%eax)</TD>
            <TD width=200>mov fs:eax, 4</TD></TR></TBODY></TABLE></P></LI></OL>
      <P></P>
      <P><A name=2><SPAN class=atitle2>三、Hello World!</SPAN></A></P>
      <P>真不知道打破這個傳統會帶來什么樣的后果,但既然所有程序設計語言的第一個例子都是在屏幕上打印一個字符串 "Hello 
      World!",那我們也以這種方式來開始介紹 Linux 下的匯編語言程序設計。</P>
      <P>在 Linux 操作系統中,你有很多辦法可以實現在屏幕上顯示一個字符串,但最簡潔的方式是使用 Linux 
      內核提供的系統調用。使用這種方法最大的好處是可以直接和操作系統的內核進行通訊,不需要鏈接諸如 libc 這樣的函數庫,也不需要使用 ELF 
      解釋器,因而代碼尺寸小且執行速度快。</P>
      <P>Linux 是一個運行在保護模式下的 32 位操作系統,采用 flat memory 模式,目前最常用到的是 ELF 格式的二進制代碼。一個 
      ELF 格式的可執行程序通常劃分為如下幾個部分:.text、.data 和 .bss,其中 .text 是只讀的代碼區,.data 
      是可讀可寫的數據區,而 .bss 則是可讀可寫且沒有初始化的數據區。代碼區和數據區在 ELF 中統稱為 
      section,根據實際需要你可以使用其它標準的 section,也可以添加自定義 section,但一個 ELF 可執行程序至少應該有一個 
      .text 部分。下面給出我們的第一個匯編程序,用的是 AT&amp;T 匯編語言格式:</P>
      <P>例1. AT&amp;T 格式</P>
      <TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc 
        border=1><TBODY>
        <TR>
          <TD><PRE><CODE>
#hello.s 
.data                    # 數據段聲明
        msg : .string "Hello, world!\\n" # 要輸出的字符串
        len = . - msg                   # 字串長度

.text                    # 代碼段聲明
.global _start           # 指定入口函數
        
_start:                  # 在屏幕上顯示一個字符串
        movl $len, %edx  # 參數三:字符串長度
        movl $msg, %ecx  # 參數二:要顯示的字符串
        movl $1, %ebx    # 參數一:文件描述符(stdout) 
        movl $4, %eax    # 系統調用號(sys_write) 
        int  $0x80       # 調用內核功能
        
                         # 退出程序
        movl $0,%ebx     # 參數一:退出代碼
        movl $1,%eax     # 系統調用號(sys_exit) 
        int  $0x80       # 調用內核功能
</CODE></PRE></TD></TR></TBODY></TABLE>
      <P>初次接觸到 AT&amp;T 格式的匯編代碼時,很多程序員都認為太晦澀難懂了,沒有關系,在 Linux 平臺上你同樣可以使用 Intel 
      格式來編寫匯編程序:</P>
      <P>例2. Intel 格式</P>
      <TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc 
        border=1><TBODY>
        <TR>
          <TD><PRE><CODE>

; hello.asm 
section .data            ; 數據段聲明
        msg db "Hello, world!", 0xA     ; 要輸出的字符串
        len equ $ - msg                 ; 字串長度

section .text            ; 代碼段聲明
global _start            ; 指定入口函數

_start:                  ; 在屏幕上顯示一個字符串
        mov edx, len     ; 參數三:字符串長度
        mov ecx, msg     ; 參數二:要顯示的字符串
        mov ebx, 1       ; 參數一:文件描述符(stdout) 
        mov eax, 4       ; 系統調用號(sys_write) 
        int 0x80         ; 調用內核功能

                         ; 退出程序
        mov ebx, 0       ; 參數一:退出代碼
        mov eax, 1       ; 系統調用號(sys_exit) 
        int 0x80         ; 調用內核功能
</CODE></PRE></TD></TR></TBODY></TABLE>
      <P>上面兩個匯編程序采用的語法雖然完全不同,但功能卻都是調用 Linux 內核提供的 sys_write 來顯示一個字符串,然后再調用 
      sys_exit 退出程序。在 Linux 內核源文件 include/asm-i386/unistd.h 中,可以找到所有系統調用的定義。</P>
      <P><A name=3><SPAN class=atitle2>四、Linux 匯編工具</SPAN></A></P>
      <P>Linux 平臺下的匯編工具雖然種類很多,但同 DOS/Windows 一樣,最基本的仍然是匯編器、連接器和調試器。</P>
      <P><B>1.匯編器</B></P>
      <P>匯編器(assembler)的作用是將用匯編語言編寫的源程序轉換成二進制形式的目標代碼。Linux 平臺的標準匯編器是 GAS,它是 GCC 
      所依賴的后臺匯編工具,通常包含在 binutils 軟件包中。GAS 使用標準的 AT&amp;T 匯編語法,可以用來匯編用 AT&amp;T 
      格式編寫的程序:</P>
      <TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc 
        border=1><TBODY>
        <TR>
          <TD><PRE><CODE>
[xiaowp@gary code]$ as -o hello.o hello.s
</CODE></PRE></TD></TR></TBODY></TABLE>
      <P>Linux 平臺上另一個經常用到的匯編器是 NASM,它提供了很好的宏指令功能,并能夠支持相當多的目標代碼格式,包括 
      bin、a.out、coff、elf、rdf 等。NASM 采用的是人工編寫的語法分析器,因而執行速度要比 GAS 快很多,更重要的是它使用的是 
      Intel 匯編語法,可以用來編譯用 Intel 語法格式編寫的匯編程序:</P>
      <TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc 
        border=1><TBODY>
        <TR>
          <TD><PRE><CODE>
[xiaowp@gary code]$ nasm -f elf hello.asm
</CODE></PRE></TD></TR></TBODY></TABLE>
      <P><B>2.鏈接器</B></P>
      <P>由匯編器產生的目標代碼是不能直接在計算機上運行的,它必須經過鏈接器的處理才能生成可執行代碼。鏈接器通常用來將多個目標代碼連接成一個可執行代碼,這樣可以先將整個程序分成幾個模塊來單獨開發,然后才將它們組合(鏈接)成一個應用程序。 
      Linux 使用 ld 作為標準的鏈接程序,它同樣也包含在 binutils 軟件包中。匯編程序在成功通過 GAS 或 NASM 
      的編譯并生成目標代碼后,就可以使用 ld 將其鏈接成可執行程序了:</P>
      <TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc 
        border=1><TBODY>
        <TR>
          <TD><PRE><CODE>
[xiaowp@gary code]$ ld -s -o hello hello.o
</CODE></PRE></TD></TR></TBODY></TABLE>
      <P><B>3.調試器</B></P>
      <P>有人說程序不是編出來而是調出來的,足見調試在軟件開發中的重要作用,在用匯編語言編寫程序時尤其如此。Linux 下調試匯編代碼既可以用 
      GDB、DDD 這類通用的調試器,也可以使用專門用來調試匯編代碼的 ALD(Assembly Language Debugger)。</P>
      <P>從調試的角度來看,使用 GAS 的好處是可以在生成的目標代碼中包含符號表(symbol table),這樣就可以使用 GDB 和 DDD 
      來進行源碼級的調試了。要在生成的可執行程序中包含符號表,可以采用下面的方式進行編譯和鏈接:</P>
      <TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc 
        border=1><TBODY>
        <TR>
          <TD><PRE><CODE>
[xiaowp@gary code]$ as --gstabs -o hello.o hello.s
[xiaowp@gary code]$ ld -o hello hello.o
</CODE></PRE></TD></TR></TBODY></TABLE>
      <P>執行 as 命令時帶上參數 --gstabs 可以告訴匯編器在生成的目標代碼中加上符號表,同時需要注意的是,在用 ld 命令進行鏈接時不要加上 
      -s 參數,否則目標代碼中的符號表在鏈接時將被刪去。</P>
      <P>在 GDB 和 DDD 中調試匯編代碼和調試 C 
      語言代碼是一樣的,你可以通過設置斷點來中斷程序的運行,查看變量和寄存器的當前值,并可以對代碼進行單步跟蹤。圖1 是在 DDD 
      中調試匯編代碼時的情景:</P>
      <P align=center><IMG onmousewheel="return bbimg(this)" 
      onclick=ImgClick(this) 
      src="Linux 匯編語言開發指南 - 21IC中國電子網.files/050109014193841.jpg" 
      resized="0"><BR>圖1 用 DDD 中調試匯編程序</P>
      <P>匯編程序員通常面對的都是一些比較苛刻的軟硬件環境,短小精悍的ALD可能更能符合實際的需要,因此下面主要介紹一下如何用ALD來調試匯編程序。首先在命令行方式下執行ald命令來啟動調試器,該命令的參數是將要被調試的可執行程序:</P>
      <TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc 
        border=1><TBODY>
        <TR>
          <TD><PRE><CODE>
[xiaowp@gary doc]$ ald hello
Assembly Language Debugger 0.1.3
Copyright (C) 2000-2002 Patrick Alken

hello: ELF Intel 80386 (32 bit), LSB, Executable, Version 1 (current)
Loading debugging symbols...(15 symbols loaded)
ald&gt;
</CODE></PRE></TD></TR></TBODY></TABLE>
      <P>當 ALD 的提示符出現之后,用 disassemble 命令對代碼段進行反匯編:</P>
      <TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc 
        border=1><TBODY>
        <TR>
          <TD><PRE><CODE>
ald&gt; disassemble -s .text
Disassembling section .text (0x08048074 - 0x08048096)
08048074  BA0F000000                 mov edx, 0xf
08048079  B998900408                 mov ecx, 0x8049098
0804807E  BB01000000                 mov ebx, 0x1
08048083  B804000000                 mov eax, 0x4
08048088  CD80                       int 0x80
0804808A  BB00000000                 mov ebx, 0x0
0804808F  B801000000                 mov eax, 0x1
08048094  CD80                       int 0x80
</CODE></PRE></TD></TR></TBODY></TABLE>
      <P>上述輸出信息的第一列是指令對應的地址碼,利用它可以設置在程序執行時的斷點:</P>
      <TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc 
        border=1><TBODY>
        <TR>
          <TD><PRE><CODE>
ald&gt; break 0x08048088
Breakpoint 1 set for 0x08048088
</CODE></PRE></TD></TR></TBODY></TABLE>
      <P>斷點設置好后,使用 run 命令開始執行程序。ALD 在遇到斷點時將自動暫停程序的運行,同時會顯示所有寄存器的當前值:</P>
      <TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc 
        border=1><TBODY>
        <TR>
          <TD><PRE><CODE>
ald&gt; run
Starting program: hello
Breakpoint 1 encountered at 0x08048088
eax = 0x00000004 ebx = 0x00000001 ecx = 0x08049098 edx = 0x0000000F
esp = 0xBFFFF6C0 ebp = 0x00000000 esi = 0x00000000 edi = 0x00000000
ds  = 0x0000002B es  = 0x0000002B fs  = 0x00000000 gs  = 0x00000000
ss  = 0x0000002B cs  = 0x00000023 eip = 0x08048088 eflags = 0x00000246

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩高清一区| 精品一区二区在线视频| 欧美在线播放高清精品| 亚洲主播在线播放| 91精品国产福利| 国产一区二区三区免费播放| 中文字幕 久热精品 视频在线 | 欧美一区二区日韩| 日韩不卡免费视频| 国产亚洲一区二区三区| 99这里只有精品| 亚洲成a人片在线观看中文| 制服视频三区第一页精品| 精品制服美女久久| 国产精品激情偷乱一区二区∴| www.欧美.com| 天天综合网 天天综合色| 2023国产精品视频| 99久久婷婷国产综合精品电影| 亚洲午夜一区二区三区| 精品久久国产字幕高潮| 国产馆精品极品| 亚洲福利一区二区三区| 久久伊99综合婷婷久久伊| 91在线视频播放地址| 青娱乐精品视频| 国产精品久久久久9999吃药| 欧美久久高跟鞋激| 国产成人av影院| 亚洲超碰精品一区二区| 国产夜色精品一区二区av| 欧美在线高清视频| 成人福利视频在线| 免费高清视频精品| 亚洲猫色日本管| 久久久亚洲精品石原莉奈| 欧美午夜理伦三级在线观看| 国产乱码字幕精品高清av| 亚洲国产一区二区视频| 亚洲国产成人午夜在线一区| 欧美夫妻性生活| 日本韩国精品一区二区在线观看| 激情六月婷婷综合| 亚洲一线二线三线久久久| 久久久蜜桃精品| 777午夜精品视频在线播放| 不卡影院免费观看| 国产一区二区女| 欧美aaaaa成人免费观看视频| 亚洲日本中文字幕区| 久久久五月婷婷| 91精品国产综合久久婷婷香蕉| 精品视频在线看| 国产成人8x视频一区二区| 日韩综合一区二区| 亚洲午夜久久久久久久久久久| 中文一区在线播放| 26uuu久久综合| 日韩精品一区在线观看| 欧美日韩国产三级| 在线观看www91| 91在线国内视频| 成人h精品动漫一区二区三区| 激情综合色播激情啊| 麻豆传媒一区二区三区| 日韩av一二三| 午夜精品久久久久久久蜜桃app| 亚洲精品成人在线| 亚洲视频一区在线| 亚洲图片激情小说| 中文字幕中文字幕一区| 国产精品亲子伦对白| 国产欧美1区2区3区| 国产午夜亚洲精品理论片色戒 | 日韩欧美第一区| 337p亚洲精品色噜噜狠狠| 欧美日韩精品系列| 欧美日韩aaaaa| 8x8x8国产精品| 日韩美女在线视频| 精品国产免费一区二区三区四区 | 欧美一区二区成人| 91麻豆精品国产91久久久资源速度| 欧美精品免费视频| 欧美一区二区三区日韩视频| 欧美高清www午色夜在线视频| 欧美一区二区在线不卡| 欧美一区二区视频在线观看2020 | 欧美日本韩国一区二区三区视频 | 精品电影一区二区| 国产亚洲午夜高清国产拍精品| 国产精品嫩草影院av蜜臀| 亚洲免费观看高清完整版在线 | 国产一区二三区好的| 极品尤物av久久免费看| 国产精品一区在线观看乱码| a4yy欧美一区二区三区| 在线观看一区二区视频| 制服.丝袜.亚洲.另类.中文| 精品国产一二三| 最近日韩中文字幕| 首页国产丝袜综合| 国产米奇在线777精品观看| 成人高清视频在线观看| 欧美婷婷六月丁香综合色| 欧美一区二区观看视频| 国产视频一区二区在线观看| 亚洲女女做受ⅹxx高潮| 免费在线成人网| 99免费精品视频| 日韩一区二区电影在线| 国产精品美女视频| 天堂蜜桃91精品| 粉嫩av一区二区三区粉嫩| 91黄色免费看| 久久午夜老司机| 亚洲伦在线观看| 精品一区二区三区免费| 91在线免费播放| 亚洲精品一区二区在线观看| 国产精品高潮久久久久无| 日韩黄色片在线观看| 粉嫩aⅴ一区二区三区四区| 欧美日韩的一区二区| 国产精品亲子伦对白| 老司机一区二区| 91福利国产成人精品照片| 久久人人超碰精品| 午夜精品福利久久久| 99久久99久久综合| 精品国产乱码91久久久久久网站| 亚洲最新视频在线播放| 粉嫩一区二区三区在线看| 欧美一区二区视频免费观看| 夜夜亚洲天天久久| 成人av在线资源| 久久精品一区二区三区不卡牛牛| 婷婷久久综合九色国产成人| 97se亚洲国产综合自在线观| 久久老女人爱爱| 首页国产欧美久久| 91激情在线视频| 最近日韩中文字幕| 成人深夜在线观看| 久久九九国产精品| 精品在线观看免费| 日韩一区二区三区电影| 亚洲国产cao| 欧美制服丝袜第一页| 亚洲欧美另类综合偷拍| 国产91清纯白嫩初高中在线观看 | 国产三级欧美三级日产三级99 | 日本韩国欧美三级| 国产精品久久久久天堂| 国产传媒一区在线| 精品国产免费人成在线观看| 美女在线观看视频一区二区| 欧美另类变人与禽xxxxx| 亚洲国产精品天堂| 欧美日韩免费电影| 亚洲一区在线观看网站| 在线观看视频一区| 亚洲免费观看高清完整版在线 | 亚洲第一精品在线| 91官网在线观看| 曰韩精品一区二区| 日本高清成人免费播放| 一区二区三区在线免费| 99这里都是精品| 亚洲欧美激情一区二区| 91麻豆国产在线观看| 亚洲免费观看视频| 欧美亚洲另类激情小说| 午夜伊人狠狠久久| 69久久99精品久久久久婷婷 | 懂色av一区二区夜夜嗨| 中文在线一区二区| 色综合久久中文字幕| 亚洲乱码一区二区三区在线观看| 色噜噜狠狠成人中文综合| 亚洲在线成人精品| 7777女厕盗摄久久久| 老司机午夜精品99久久| 久久精品一级爱片| 99久久精品国产毛片| 亚洲一区av在线| 欧美一区二区三区的| 精品一区二区三区在线播放| 国产亚洲视频系列| 色婷婷综合久久久中文字幕| 亚洲bdsm女犯bdsm网站| 日韩欧美国产小视频| 国产精品一区二区免费不卡| 亚洲欧洲日本在线| 欧美三级韩国三级日本三斤| 美女视频一区在线观看| 国产亚洲女人久久久久毛片| 91黄视频在线观看| 国产一区二区美女| 一区二区三区日韩精品视频|