AT&T汇编学习笔记(一)

file命令使用介绍

file最常用的场景就是用来查看可执行文件的运行环境,是arm呢,还是x86呢,还是mips呢?一看便知

$ file a.out

a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xa240b1958136fc294a6ee5833de2a0fc8c9e0bd4, not stripped

高亮部分依次是:操作系统位数,  大小端(LSB小端), 文件类型(executable可执行文件, Relocatable可重定位文件, Shared object动态库文件), 指令集类型(x86-64, Intel 80386, mips, ARM), 是否去除符号表(发布版一般都会去除以增加反汇编难度,加强安全性)



objdump使用及测试分析(x86-64位ubuntu)

linux下的ELF文件(可执行文件,动态库文件,可重定位文件,静态库文件)结构:

  1. ELF文件头

$ readelf -h a.out

ELF Header:

Magic:   7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00

Class:                             ELF32

Data:                              2‘s complement, little endian

Version:                           1 (current)

OS/ABI:                            UNIX - System V

ABI Version:                       0

Type:                              EXEC (Executable file)

Machine:                           Intel 80386

Version:                           0x1

Entry point address:               0x8048320

Start of program headers:          52 (bytes into file)

Start of section headers:          4960 (bytes into file)

Flags:                             0x0

Size of this header:               52 (bytes)

Size of program headers:           32 (bytes)

Number of program headers:         9

Size of section headers:           40 (bytes)

Number of section headers:         36

Section header string table index: 33

  1. SHT(section head table),ELF包含的section的一张映射表

$ readelf -S a.out

There are 36 section headers, starting at offset 0x1360:

Section Headers:

[Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al

[ 0]                   NULL            00000000 000000 000000 00      0   0  0

[ 1] .interp           PROGBITS        08048154 000154 000013 00   A  0   0  1

[ 2] .note.ABI-tag     NOTE            08048168 000168 000020 00   A  0   0  4

[ 3] .note.gnu.build-i NOTE            08048188 000188 000024 00   A  0   0  4

[ 4] .gnu.hash         GNU_HASH        080481ac 0001ac 000020 04   A  5   0  4

[ 5] .dynsym           DYNSYM          080481cc 0001cc 000050 10   A  6   1  4

[ 6] .dynstr           STRTAB          0804821c 00021c 00004a 00   A  0   0  1

[ 7] .gnu.version      VERSYM          08048266 000266 00000a 02   A  5   0  2

[ 8] .gnu.version_r    VERNEED         08048270 000270 000020 00   A  6   1  4

[ 9] .rel.dyn          REL             08048290 000290 000008 08   A  5   0  4

[10] .rel.plt          REL             08048298 000298 000018 08   A  5  12  4

[11] .init             PROGBITS        080482b0 0002b0 00002e 00  AX  0   0  4

[12] .plt              PROGBITS        080482e0 0002e0 000040 04  AX  0   0 16

[13] .text             PROGBITS        08048320 000320 00017c 00  AX  0   0 16

[14] .fini             PROGBITS        0804849c 00049c 00001a 00  AX  0   0  4

[15] .rodata           PROGBITS        080484b8 0004b8 000014 00   A  0   0  4

[16] .eh_frame_hdr     PROGBITS        080484cc 0004cc 000034 00   A  0   0  4

[17] .eh_frame         PROGBITS        08048500 000500 0000c4 00   A  0   0  4

[18] .ctors            PROGBITS        08049f14 000f14 000008 00  WA  0   0  4

[19] .dtors            PROGBITS        08049f1c 000f1c 000008 00  WA  0   0  4

[20] .jcr              PROGBITS        08049f24 000f24 000004 00  WA  0   0  4

[21] .dynamic          DYNAMIC         08049f28 000f28 0000c8 08  WA  6   0  4

[22] .got              PROGBITS        08049ff0 000ff0 000004 04  WA  0   0  4

[23] .got.plt          PROGBITS        08049ff4 000ff4 000018 04  WA  0   0  4

[24] .data             PROGBITS        0804a00c 00100c 000008 00  WA  0   0  4

[25] .bss              NOBITS          0804a014 001014 000008 00  WA  0   0  4

[26] .comment          PROGBITS        00000000 001014 00002a 01  MS  0   0  1

[27] .debug_aranges    PROGBITS        00000000 00103e 000020 00      0   0  1

[28] .debug_info       PROGBITS        00000000 00105e 00008b 00      0   0  1

[29] .debug_abbrev     PROGBITS        00000000 0010e9 00003f 00      0   0  1

[30] .debug_line       PROGBITS        00000000 001128 000038 00      0   0  1

[31] .debug_str        PROGBITS        00000000 001160 00007e 01  MS  0   0  1

[32] .debug_loc        PROGBITS        00000000 0011de 000038 00      0   0  1

[33] .shstrtab         STRTAB          00000000 001216 000147 00      0   0  1

[34] .symtab           SYMTAB          00000000 001900 000470 10     35  51  4

[35] .strtab           STRTAB          00000000 001d70 0001fb 00      0   0  1

Key to Flags:

W (write), A (alloc), X (execute), M (merge), S (strings)

I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)

O (extra OS processing required) o (OS specific), p (processor specific)

常用到的几个section解释:

1) .text section 里装载了可执行代码;

2) .data section 里面装载了被初始化的数据;

3) .bss section 里面装载了未被初始化的数据;

4) 以 .rec 打头的 sections 里面装载了重定位条目;

5) .symtab 或者 .dynsym section 里面装载了符号信息;

6) .strtab 或者 .dynstr section 里面装载了字符串信息;

Flg为A表示进程需要的,会被分配到内存的section, 另外一些没有A的,可以通过strip去掉

  1. section(在ELF文件里头,用以装载内容数据的最小容器)

用objdump对可执行文件的代码段(sections .text)进行反汇编:

$ objdump -d -j .text a.out

a.out:     file format elf32-i386

Disassembly of section .text:

08048320 <_start>:

8048320:       31 ed                   xor    %ebp,%ebp

8048322:       5e                      pop    %esi

8048323:       89 e1                   mov    %esp,%ecx

8048325:       83 e4 f0                and    $0xfffffff0,%esp

8048328:       50                      push   %eax

8048329:       54                      push   %esp

804832a:       52                      push   %edx

804832b:       68 60 84 04 08          push   $0x8048460

8048330:       68 f0 83 04 08          push   $0x80483f0

8048335:       51                      push   %ecx

8048336:       56                      push   %esi

8048337:       68 d4 83 04 08          push   $0x80483d4

804833c:       e8 cf ff ff ff          call   8048310 <[email protected]>

8048341:       f4                      hlt

8048342:       90                      nop

8048343:       90                      nop

8048344:       90                      nop

8048345:       90                      nop

8048346:       90                      nop

8048347:       90                      nop

8048348:       90                      nop

8048349:       90                      nop

804834a:       90                      nop

804834b:       90                      nop

804834c:       90                      nop

804834d:       90                      nop

804834e:       90                      nop

804834f:       90                      nop

08048350 <__do_global_dtors_aux>:

8048350:       55                      push   %ebp

8048351:       89 e5                   mov    %esp,%ebp

8048353:       53                      push   %ebx

8048354:       83 ec 04                sub    $0x4,%esp

8048357:       80 3d 14 a0 04 08 00    cmpb   $0x0,0x804a014

804835e:       75 3f                   jne    804839f <__do_global_dtors_aux+0x4f>

8048360:       a1 18 a0 04 08          mov    0x804a018,%eax

8048365:       bb 20 9f 04 08          mov    $0x8049f20,%ebx

804836a:       81 eb 1c 9f 04 08       sub    $0x8049f1c,%ebx

8048370:       c1 fb 02                sar    $0x2,%ebx

8048373:       83 eb 01                sub    $0x1,%ebx

8048376:       39 d8                   cmp    %ebx,%eax

8048378:       73 1e                   jae    8048398 <__do_global_dtors_aux+0x48>

804837a:       8d b6 00 00 00 00       lea    0x0(%esi),%esi

8048380:       83 c0 01                add    $0x1,%eax

8048383:       a3 18 a0 04 08          mov    %eax,0x804a018

8048388:       ff 14 85 1c 9f 04 08    call   *0x8049f1c(,%eax,4)

804838f:       a1 18 a0 04 08          mov    0x804a018,%eax

8048394:       39 d8                   cmp    %ebx,%eax

8048396:       72 e8                   jb     8048380 <__do_global_dtors_aux+0x30>

8048398:       c6 05 14 a0 04 08 01    movb   $0x1,0x804a014

804839f:       83 c4 04                add    $0x4,%esp

80483a2:       5b                      pop    %ebx

80483a3:       5d                      pop    %ebp

80483a4:       c3                      ret

80483a5:       8d 74 26 00             lea    0x0(%esi,%eiz,1),%esi

80483a9:       8d bc 27 00 00 00 00    lea    0x0(%edi,%eiz,1),%edi

080483b0 <frame_dummy>:

80483b0:       55                      push   %ebp

80483b1:       89 e5                   mov    %esp,%ebp

80483b3:       83 ec 18                sub    $0x18,%esp

80483b6:       a1 24 9f 04 08          mov    0x8049f24,%eax

80483bb:       85 c0                   test   %eax,%eax

80483bd:       74 12                   je     80483d1 <frame_dummy+0x21>

80483bf:       b8 00 00 00 00          mov    $0x0,%eax

80483c4:       85 c0                   test   %eax,%eax

80483c6:       74 09                   je     80483d1 <frame_dummy+0x21>

80483c8:       c7 04 24 24 9f 04 08    movl   $0x8049f24,(%esp)

80483cf:       ff d0                   call   *%eax

80483d1:       c9                      leave

80483d2:       c3                      ret

80483d3:       90                      nop

080483d4 <main>:

80483d4:       55                      push   %ebp

80483d5:       89 e5                   mov    %esp,%ebp

80483d7:       83 e4 f0                and    $0xfffffff0,%esp

80483da:       83 ec 10                sub    $0x10,%esp

80483dd:       c7 04 24 c0 84 04 08    movl   $0x80484c0,(%esp)

80483e4:       e8 07 ff ff ff          call   80482f0 <[email protected]>

80483e9:       b8 00 00 00 00          mov    $0x0,%eax

80483ee:       c9                      leave

80483ef:       c3                      ret

080483f0 <__libc_csu_init>:

80483f0:       55                      push   %ebp

80483f1:       57                      push   %edi

80483f2:       56                      push   %esi

80483f3:       53                      push   %ebx

80483f4:       e8 69 00 00 00          call   8048462 <__i686.get_pc_thunk.bx>

80483f9:       81 c3 fb 1b 00 00       add    $0x1bfb,%ebx

80483ff:       83 ec 1c                sub    $0x1c,%esp

8048402:       8b 6c 24 30             mov    0x30(%esp),%ebp

8048406:       8d bb 20 ff ff ff       lea    -0xe0(%ebx),%edi

804840c:       e8 9f fe ff ff          call   80482b0 <_init>

8048411:       8d 83 20 ff ff ff       lea    -0xe0(%ebx),%eax

8048417:       29 c7                   sub    %eax,%edi

8048419:       c1 ff 02                sar    $0x2,%edi

804841c:       85 ff                   test   %edi,%edi

804841e:       74 29                   je     8048449 <__libc_csu_init+0x59>

8048420:       31 f6                   xor    %esi,%esi

8048422:       8d b6 00 00 00 00       lea    0x0(%esi),%esi

8048428:       8b 44 24 38             mov    0x38(%esp),%eax

804842c:       89 2c 24                mov    %ebp,(%esp)

804842f:       89 44 24 08             mov    %eax,0x8(%esp)

8048433:       8b 44 24 34             mov    0x34(%esp),%eax

8048437:       89 44 24 04             mov    %eax,0x4(%esp)

804843b:       ff 94 b3 20 ff ff ff    call   *-0xe0(%ebx,%esi,4)

8048442:       83 c6 01                add    $0x1,%esi

8048445:       39 fe                   cmp    %edi,%esi

8048447:       75 df                   jne    8048428 <__libc_csu_init+0x38>

8048449:       83 c4 1c                add    $0x1c,%esp

804844c:       5b                      pop    %ebx

804844d:       5e                      pop    %esi

804844e:       5f                      pop    %edi

804844f:       5d                      pop    %ebp

8048450:       c3                      ret

8048451:       eb 0d                   jmp    8048460 <__libc_csu_fini>

8048453:       90                      nop

8048454:       90                      nop

8048455:       90                      nop

8048456:       90                      nop

8048457:       90                      nop

8048458:       90                      nop

8048459:       90                      nop

804845a:       90                      nop

804845b:       90                      nop

804845c:       90                      nop

804845d:       90                      nop

804845e:       90                      nop

804845f:       90                      nop

08048460 <__libc_csu_fini>:

8048460:       f3 c3                   repz ret

08048462 <__i686.get_pc_thunk.bx>:

8048462:       8b 1c 24                mov    (%esp),%ebx

8048465:       c3                      ret

8048466:       90                      nop

8048467:       90                      nop

8048468:       90                      nop

8048469:       90                      nop

804846a:       90                      nop

804846b:       90                      nop

804846c:       90                      nop

804846d:       90                      nop

804846e:       90                      nop

804846f:       90                      nop

08048470 <__do_global_ctors_aux>:

8048470:       55                      push   %ebp

8048471:       89 e5                   mov    %esp,%ebp

8048473:       53                      push   %ebx

8048474:       83 ec 04                sub    $0x4,%esp

8048477:       a1 14 9f 04 08          mov    0x8049f14,%eax

804847c:       83 f8 ff                cmp    $0xffffffff,%eax

804847f:       74 13                   je     8048494 <__do_global_ctors_aux+0x24>

8048481:       bb 14 9f 04 08          mov    $0x8049f14,%ebx

8048486:       66 90                   xchg   %ax,%ax

8048488:       83 eb 04                sub    $0x4,%ebx

804848b:       ff d0                   call   *%eax

804848d:       8b 03                   mov    (%ebx),%eax

804848f:       83 f8 ff                cmp    $0xffffffff,%eax

8048492:       75 f4                   jne    8048488 <__do_global_ctors_aux+0x18>

8048494:       83 c4 04                add    $0x4,%esp

8048497:       5b                      pop    %ebx

8048498:       5d                      pop    %ebp

8048499:       c3                      ret

804849a:       90                      nop

804849b:       90                      nop



GCC生成的HELLO WORLD汇编语言分析

  1. 用c语言写一个hello world程序main1.c

#include <stdio.h>

#include <stdlib.h>

int main()

{

printf("hello world\n");

return 0;

}

  1. 生成汇编代码

gcc -o1 -S main1.c

  1. 打开汇编文件

.file   "main1.c"

.section    .rodata                 #.rodata用来保存只读数据的地方, 字串符"hello world"就是放在这里

.LC0:                                   #标签, 标签名可以修改

.string "hello world"

.text

.globl  main

.type   main, @function             #定义函数

main:

.LFB0:

.cfi_startproc                      #函数开始标示

pushq   %rbp

.cfi_def_cfa_offset 16

.cfi_offset 6, -16

movq    %rsp, %rbp

.cfi_def_cfa_register 6

movl    $.LC0, %edi                 #将字符串‘hello world‘放入edi寄存器,作为系统调用的参数

call    puts                        #调用系统函数

movl    $0, %eax

popq    %rbp

.cfi_def_cfa 7, 8

ret

.cfi_endproc                        #函数结束标示

.LFE0:

.size   main, .-main

.ident  "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"

.section    .note.GNU-stack,"",@progbits

  1. objdump 反汇编的代码

00000000004004f4 <main>:

4004f4:    55                       push   %rbp

4004f5:    48 89 e5                 mov    %rsp,%rbp

4004f8:    bf fc 05 40 00           mov    $0x4005fc,%edi              #0x4005fc字串地址是什么内容?

4004fd:    e8 ee fe ff ff           callq  4003f0 <[email protected]>           #4003f0这是系统函数的地址,后面括号里就是对应的函数名

400502:    b8 00 00 00 00           mov    $0x0,%eax

400507:    5d                       pop    %rbp

400508:    c3                       retq

400509:    90                       nop

40050a:    90                       nop

40050b:    90                       nop

40050c:    90                       nop

40050d:    90                       nop

40050e:    90                       nop

40050f:    90                       nop

$0x4005fc这个字符串地址是什么内容?

从前的汇编文件可以看到,字符串是保存在.rodata这个section里的,对执行文件用objdump可以看到.rodata的内容,如果看不到汇编文件,那就只能靠猜了

$ objdump -d -j .rodata a.out

a.out:     file format elf64-x86-64

Disassembly of section .rodata:

00000000004005f8 <_IO_stdin_used>:

4005f8:    01 00 02 00 68 65 6c 6c 6f 20 77 6f 72 6c 64 00     ....hello world.



手写的hello world 汇编程序

这是一本讲AT&A的书里的例子,用来入门学习一下( Linux汇编AT&A 汇 编.pdf),生成的可执行文件真的比gcc生成的小很多(gcc: 7K, asm: 352byte)

  1. 编写hello.s汇编文件

#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                           # 调用内核功能

  1. 通过编译器as编译成可重定向文件hello.o

$ as hello.s -o hello.o

  1. 通过链接器ld链成可执行文件hello

$ ld hello.o -o hello

  1. 生成可执行文件后,再用objdump反编译看一下是什么样子

$ objdump -d hello

hello:     file format elf32-i386

Disassembly of section .text:

08048074 <_start>:

8048074:    ba 0f 00 00 00           mov    $0xf,%edx

8048079:    b9 98 90 04 08           mov    $0x8049098,%ecx

804807e:    bb 01 00 00 00           mov    $0x1,%ebx

8048083:    b8 04 00 00 00           mov    $0x4,%eax

8048088:    cd 80                    int    $0x80

804808a:    bb 00 00 00 00           mov    $0x0,%ebx

804808f:    b8 01 00 00 00           mov    $0x1,%eax

8048094:    cd 80                    int    $0x80

#在执行 int 80 指令时,寄存器 eax 中存放的是 系统调用的功能号,而传给系统调用的参数则必须按顺序放到寄存器 ebx,ecx,edx,esi,edi 中,当系统调用完成之

后,返回值可以在寄存器 eax 中获得

AT&T汇编学习笔记(一)

时间: 2024-10-15 22:21:32

AT&T汇编学习笔记(一)的相关文章

AT&amp;T汇编学习笔记

AT&T汇编和intel汇编的区别 (1)在Intel格式中大多使用大写字母,而在AT&T格式中都是用小写字母. (2)在AT&T格式中,寄存器名要加上"%"作为前缀,而在intel格式中则不带前缀. (3)在AT&T的386汇编语言中,指令的源操作数与目标操作数的顺序与在intel的386汇编语言中正好相反.在intel格式中是目标在前,源在后:而在AT&T格式中则是源在前,目标在后.例如,将寄存器eax的内容送入ebx,在intel格式中为&

汇编学习笔记-序章

最近突然对汇编语言开始感兴趣,于是说干就干了. 之前也自学过一点汇编,是跟着王爽老师的<汇编语言(第3版) >这本书学习的,已经是有5 6前年的样子了.当时觉得这本书写的非常通俗易懂是一本非常好的启蒙书籍,但是最近在翻阅的时候却觉得这本书知识点介绍的非常杂乱没有个章程,感觉像是没组织过一样想到哪里写到哪里.哈哈,个人愚见,王爽老师的粉丝不要喷我. 于是乎我去各种百度汇编学习的书籍推荐,在知乎.csdn找到了好几本推荐的书,然后就一股脑买了4本.所以我简单的根据书名排了个阅读顺序: 80x86汇

汇编学习笔记03(寄存器内存访问)

1. 字在内存中存储时, 要有两个地址连续的内存单元来存放. 字的低位字节存放在低地址单元中, 高位字节存放在高地址单元中. 2. DS: 存放段地址的寄存器, 这个段是存放数据的. [address]: 偏移地址 mov指令在访问内存单元时, 只给出偏移地址, 段地址默认在DS段寄存器中 3. mov ax, 1000 mov ds, ax 8086CPU不支持将数据直接送入段寄存器, 所以只能通过通用寄存器来进行中转. 4. 字的传送 80806CPU是16位结构, 有16根数据线, 所以一

Freescale MC9S08AW60汇编学习笔记(五)

前面学习了查表的功能,可以用查表的功能实现不少强大的功能,如查立方表.平方表.函数表.数码管显示的段码表等.这里还有一种由查表和转移指令配合使用而实现的一种强大的功能:散转.散转是指根据输入数据的不同来跳转到不同的程序入口进行处理,也就是说如果有多个子程序,我们不仅可以让它们按顺序一个个执行,还可以根据做判断用的数据的值来决定跳转到哪一个子程序.实现散转的具体做法是:在程序中定义一块连续存储单元作为跳转表,表中顺序存放各分支处理程序的跳转地址.各跳转地址在表中的偏移地址等于跳转表首地址加上它们各

汇编学习笔记---(2)基础知识

今天,接着上次,继续学习汇编语言,主要对内存地址空间.主板.接卡口.存储芯片等进行了解. 什么是内存地址空间? 要搞清楚这个问题,我们首先要知道主板和接口卡. 每个PC都会有一个主板,主板上附有核心器件,包括CPU.存储器.外围芯片组.扩展插槽等,它们通过地址总线+数据总线+控制总线相连. 接口卡啥作用,说白了就是通过总线接收CPU发送的命令,对显示器.音响等外部设备进行控制. 一台PC中主要有两种存储器:随机存储器RAM和只读存储器ROM. RAM中用于存放CPU使用的绝大部分程序和数据,PC

汇编学习笔记02(寄存器CPU工作原理)

1. 什么是寄存器呢? 就是可以用指令进行读写的部件. 程序员通过改变各种寄存器中的内容实现对CPU的控制. 如果是16位CPU的话, 就是相当于2个存储单元. 2. 字在寄存器中的存储? 8086CPU可以一次性处理两种尺寸的数据 Byte: 字节型数据, 一个字节由8个bit组成, 可以存在8位寄存器中. Word: 字型数据, 一个字型由16个bit组成, 也就是两个字节, 称为这个字的高位字节和低位字节. 3. 常用汇编指令的学习(需要注意的是汇编指令是不区分大小写的) mov ax,

汇编学习笔记01(基础知识)

自己在学习C语言的时候, 有的时候碰到自己理解不了的技术点的话, 就无从下手了, 但是这些技术点如果用汇编来理解的话, 可能非常好理解, 也更容易让大家理解, 所以感觉汇编是很强大的, 对我们学习一些其它的高级语言也很有用, 所以希望自己可以对伟大的汇编语言有一定的了解和认知, 对计算机的思维方式也有更进一步的认识, 对自己的编码习惯有一个好的影响或者改变, 同时对自己的能力有些提高吧. 1. 我们首先要知道什么是机器语言? 也就是机器指令的集合, 机器指令也就是一台机器可以正确执行的命令. 机

Freescale MC9S08AW60汇编学习笔记(整理)

MC9S08AW60是HCS08系列的MCU,它是8位的MCU,由HCS08核加上存储器和外围模块构成.HCS08系列的MCU除了MC9S08AW系列之外还有MC9S08GB系列.MC9S08GT系列.MC9S08AC系列等.不同型号的MCU应用领域的侧重点不同. HCS08系列的MCU就只有5个寄存器:A.H:X.SP.PC.CCR.分别是8位.16位.16位.16位.8位.具体功能要在使用中掌握.MC9S08AW60的主频为4MHz,一个总线周期为T=0.25us.MC9S08AW60存放数

汇编学习笔记--查看CPU和内存

1.进入Debug 2.基本命令详解 -r 查看.改变CPU寄存器的内容 -d 查看内存中的内容 -e 改写内存中的内容 命令格式:"e 起始地址 数据 数据 数据 ..." -u 查看指定地址段的汇编代码 -t 执行指定地址的汇编代码(首先修改 CS:IP 到所要执行的汇编代码的首地址) -a 以汇编指令的形式在内存中写入机器指令 上图有一处错误,我们在用 -u 命令显示指定地址段的汇编代码时一定要把当前所在的地址置为汇编代码的首地址,不然机器会强制分段 实验(1):输入下图所示汇编