<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] ## 概述 **常見的指令集以及匯編語言規范:** * x86(IA-32)、x86-64指令集(常見于PC端),對應有2家公司發布的不同匯編語言規范: * intel公司發布的匯編語言規范,稱`intel 匯編`:Windows派系(Microsoft),比較著名的匯編器有微軟的masm和開源的nasm。 * AT&T公司發布的匯編語言規范,稱`AT&T 匯編`:Unix派系(或者說GNU),比如g++編譯器等。 * ARM指令集(常見于嵌入式、移動端設備,粗略統計覆蓋95%左右的手段):ARM公司發布的匯編語言規范,稱`ARM 匯編(目前常見的是ARM 64匯編)`,見[官網文檔](https://links.jianshu.com/go?to=https%3A%2F%2Fdeveloper.arm.com%2Farchitectures) ## AT&T格式 和 Intel格式的區別 表格如下: | AT&T格式 | Intel格式 | 說明| | --- | --- | --- | | pushl %eax | push eax | 在AT&T匯編格式中,寄存器名要加上' %'作為前綴;而在Intel匯編格式中,寄存器名不需要加前綴| |pushl $1 |push 1 | 在AT&T匯編格式中,用'$'前綴表示一個立即操作數;而在Intel匯編格式中,立即數的表示不用帶任何前綴 | |addl $1, %eax |add eax, 1 | AT&T和Intel格式中的源操作數和目標操作數的位置正好相反。在Intel匯編格式中,目標操作數在源操作數的左邊;而在AT&T匯編格式中,目標操作數在源操作數的右邊。 | | movb val, %al| mov al, byte ptr val| 在AT&T匯編格式中,操作數的字長由操作符的最后一個字母決定,后綴'b'、'w'、'l'分別表示操作數為字節(byte,8比特)、字(word,16比特)和長字(long,32比特);而在Intel匯編格式中,操作數的字長是用"byte ptr"和"word ptr"等前綴來表示的。| |ljump $section, $offset | jmp far section:offset |在AT&T匯編格式中,絕對轉移和調用指令(jump/call)的操作數前要加上'\*'作為前綴,而在Intel格式中則不需要。遠程轉移指令和遠程子調用指令的操作碼,在AT&T匯編格式中為"ljump"和"lcall",而在Intel匯編格式中則為"jmp far"和"call far"| | lcall $section, $offset | call far section:offset | 同上| | lret $stack\_adjust |ret far stack_adjust| 與之相應的遠程返回指令| | section:disp(base, index, scale) | section:[base + index*scale + disp] | 尋址方式的區別,無論形式如何,都是實現如下的地址計算:(其中base和index必須是寄存器,disp和scale可以是常數)disp + base + index * scale | |--- |--- |--- | |movl -4(%ebp), %eax |mov eax, [ebp - 4]| 內存操作數的例子| | movl array(, %eax, 4), %eax| mov eax, [eax*4 + array]| 內存操作數的例子 | | movw array(%ebx, %eax, 4), %cx| mov cx, [ebx + 4*eax + array]| 內存操作數的例子| | movb $4, %fs:(%eax)| mov fs:eax, 4 | 內存操作數的例子| ## 搭建Intel的環境 * ubuntu16.04 或 ubuntu18.04 * vscode * dosbox * 文件后綴:.asm 安裝dosbox ```shell sudo apt-get install dosbox ``` 下載`vscode`插件`MASM/TASM` ## Intel的hello.asm ``` ;description DATA SEGMENT USE16 MYWORD DB "hello world!!!" DATA ENDS ;description CODE SEGMENT USE16 ASSUME CS:CODE, DS:DATA ;代表誰是代碼段,誰是數據段 main: mov AX, DATA ;數據首地址賦值給AX, ax是寄存器 mov DS, AX ;使得DS等價于AX,同樣指向數據段 LEA DX, MYWORD ;使DX寄存器指向數據變量word的首地址 mov AH, 09h ;AH輸出數據 INT 21h ;執行AH的09h功能, 輸出數據 mov AX, 4c00h ;設置寄存器的功能 INT 21h ;調用寄存器功能 程序結束 CODE ENDS END main ``` 在文件中點擊鼠標右鍵`運行程序 ` ## 搭建AT&T的環境 * ubuntu16.04 或 ubuntu18.04 * vscode * 文件后綴: .s * gcc 下載`vscode`插件`GNU Assembler Language Support` ## AT&T的hello.s ```s #hello.s .data#數據段聲明 msg : .string "Hello, world\n" #要輸出的字符串 len = . - msg #字串長度 .text #代碼段聲明 .global main #指定入口函數 main: #在屏幕上顯示一個字符串 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 #調用內核功能 ``` 編譯運行 ``` $ gcc hello.s -o hello_att $ ./hello_att ``` ## 通過objdump查看到的幾種cpu架構 ``` $ objdump --help objdump:支持的體系結構: i386 i386:x86-64 i386:x64-32 i8086 i386:intel i386:x86-64:intel i386:x64-32:intel i386:nacl i386:x86-64:nacl i386:x64-32:nacl iamcu iamcu:intel l1om l1om:intel k1om k1om:intel plugin 下列 i386/x86-64 特定的反匯編器選項在使用 -M 開關時可用(使用逗號分隔多個選項): x86-64 Disassemble in 64bit mode i386 Disassemble in 32bit mode i8086 在 16 位模式下反匯編 att 用 AT&T 語法顯示指令 intel 用 Intel 語法顯示指令 att-mnemonic Display instruction in AT&T mnemonic intel-mnemonic Display instruction in Intel mnemonic addr64 假定 64 位地址大小 addr32 假定 32 位地址大小 addr16 假定 16 位地址大小 data32 假定 32 位數據大小 data16 假定 16 位數據大小 suffix 在 AT&T 語法中始終顯示指令后綴 amd64 Display instruction in AMD64 ISA intel64 Display instruction in Intel64 ISA ``` 匯編學習地址:http://c.biancheng.net/view/3463.html
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看