实验报告
实验内容
运行并验证Blum’s Book: Sample programs in Chapter 06, 07
实验环境
Ubuntu 20.04.2.0(64位)
实验过程
一. Sample programs in Chapter 06
(一)jumptest.s
1.运行
命令行:
$ as --32 -o jumptest.o jumptest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o jumptest -lc jumptest.o
$ ./jumptest
$ echo $?
输出结果:
20
2.反汇编查看内存地址
命令行:
$ objdump -D jumptest
输出结果:
jumptest: file format elf32-i386
Disassembly of section .text:
08049000 <_start>:
8049000: 90 nop
8049001: b8 01 00 00 00 mov $0x1,%eax
8049006: eb 07 jmp 804900f <overhere>
8049008: bb 0a 00 00 00 mov $0xa,%ebx
804900d: cd 80 int $0x80
0804900f <overhere>:
804900f: bb 14 00 00 00 mov $0x14,%ebx
8049014: cd 80 int $0x80
3.调试
命令行:
$ as --32 -gstabs -o jumptest.o jumptest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o jumptest -lc jumptest.o
$ gdb -q jumptest
输出结果:
Reading symbols from jumptest...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file jumptest.s, line 6.
(gdb) run
Starting program: /home/zhaowx9/Desktop/jumptest
Breakpoint 1, _start () at jumptest.s:6
6 movl $1, %eax
(gdb) print/x $eip
$1 = 0x8049001
(gdb) n
7 jmp overhere
(gdb) n
11 movl $20, %ebx
(gdb) print/x $eip
$2 = 0x804900f
(gdb)
(二)calltest.s
命令行:
$ as --32 -o calltest.o calltest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o calltest -lc calltest.o
$ ./calltest
输出结果:
This is section 1
This is section 2
This is section 3
(三)cmptest.s
命令行:
$ as --32 -o cmptest.o cmptest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o cmptest -lc cmptest.o
$ ./cmptest
$ echo $?
输出结果:
10
(四)paritytest.s
1.原:
命令行:
$ as --32 -o paritytest.o paritytest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o paritytest -lc paritytest.o
$ ./paritytest
$ echo $?
输出结果:
1
2.改:
改变sub指令这一行,改为
subl $1, %ebx
命令行:
$ as --32 -o paritytest.o paritytest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o paritytest -lc paritytest.o
$ ./paritytest
$ echo $?
输出结果:
100
(五)signtest.s
命令行:
$ as --32 -o signtest.o signtest.s
编译出现错误,提示:
signtest.s: Assembler messages:
signtest.s:15: Error: operand type mismatch for `add'
解决方法: 将 add $8, $esp
改为 add $8, %esp
后不再报错。
命令行:
$ as --32 -o signtest.o signtest.s
signtest.s: Assembler messages:
signtest.s:15: Error: operand type mismatch for `add'
$ as --32 -o signtest.o signtest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o signtest -lc signtest.o
$ ./signtest
输出结果:
The value is: 2
The value is: 10
The value is: 80
The value is: 32
The value is: 50
The value is: 6
The value is: 11
The value is: 34
The value is: 15
The value is: 21
(六)loop.s
命令行:
$ as --32 -o loop.o loop.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o loop -lc loop.o
$ ./loop
输出结果:
The value is: 5050
(七)betterloop.s
出现问题:
$ as --32 -o betterloop.o betterloop.s
betterloop.s: Assembler messages:
betterloop.s:9: Error: bad register name `%eaxmovl $0'
betterloop.s:10: Error: junk at end of line, first unrecognized character is `@'
解决方法: 将 xor %eaxmovl $0, %eax
改为 xor %eax
和 movl $0, %eax
两行。
仍出现问题:
$ as --32 -o betterloop.o betterloop.s
betterloop.s: Assembler messages:
betterloop.s:9: Error: number of operands mismatch for `xor'
betterloop.s:11: Error: junk at end of line, first unrecognized character is `@'
解决方法: 将以下代码注释掉:
xor %eax
@@@TE: Point taken, instruction changed. Thanks. ?RKB@@@
即改为:
# xor %eax
# @@@TE: Point taken, instruction changed. Thanks. ?RKB@@@
命令行:
$ as --32 -o betterloop.o betterloop.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o betterloop -lc betterloop.o
$ ./betterloop
输出结果:
The value is: 0
(八)ifthen.s
命令行:
$ gcc -m32 -S ifthen.c
$ cat ifthen.s
输出结果:
.file "ifthen.c"
.text
.section .rodata
.LC0:
.string "The higher value is %d\n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
endbr32
leal 4(%esp), %ecx
.cfi_def_cfa 1, 0
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
.cfi_escape 0x10,0x5,0x2,0x75,0
movl %esp, %ebp
pushl %ebx
pushl %ecx
.cfi_escape 0xf,0x3,0x75,0x78,0x6
.cfi_escape 0x10,0x3,0x2,0x75,0x7c
subl $16, %esp
call __x86.get_pc_thunk.ax
addl $_GLOBAL_OFFSET_TABLE_, %eax
movl $100, -16(%ebp)
movl $25, -12(%ebp)
movl -16(%ebp), %edx
cmpl -12(%ebp), %edx
jle .L2
subl $8, %esp
pushl -16(%ebp)
leal .LC0@GOTOFF(%eax), %edx
pushl %edx
movl %eax, %ebx
call printf@PLT
addl $16, %esp
jmp .L3
.L2:
subl $8, %esp
pushl -12(%ebp)
leal .LC0@GOTOFF(%eax), %edx
pushl %edx
movl %eax, %ebx
call printf@PLT
addl $16, %esp
.L3:
movl $0, %eax
leal -8(%ebp), %esp
popl %ecx
.cfi_restore 1
.cfi_def_cfa 1, 0
popl %ebx
.cfi_restore 3
popl %ebp
.cfi_restore 5
leal -4(%ecx), %esp
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size main, .-main
.section .text.__x86.get_pc_thunk.ax,"axG",@progbits,__x86.get_pc_thunk.ax,comdat
.globl __x86.get_pc_thunk.ax
.hidden __x86.get_pc_thunk.ax
.type __x86.get_pc_thunk.ax, @function
__x86.get_pc_thunk.ax:
.LFB1:
.cfi_startproc
movl (%esp), %eax
ret
.cfi_endproc
.LFE1:
.ident "GCC: (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0"
.section .note.GNU-stack,"",@progbits
.section .note.gnu.property,"a"
.align 4
.long 1f - 0f
.long 4f - 1f
.long 5
0:
.string "GNU"
1:
.align 4
.long 0xc0000002
.long 3f - 2f
2:
.long 0x3
3:
.align 4
4:
(九)for.s
命令行:
$ gcc -m32 -S for.c
$ cat for.s
输出结果:
.file "for.c"
.text
.section .rodata
.LC0:
.string "The answer is %d\n"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
endbr32
leal 4(%esp), %ecx
.cfi_def_cfa 1, 0
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
.cfi_escape 0x10,0x5,0x2,0x75,0
movl %esp, %ebp
pushl %ebx
pushl %ecx
.cfi_escape 0xf,0x3,0x75,0x78,0x6
.cfi_escape 0x10,0x3,0x2,0x75,0x7c
subl $16, %esp
call __x86.get_pc_thunk.bx
addl $_GLOBAL_OFFSET_TABLE_, %ebx
movl $0, -16(%ebp)
movl $0, -16(%ebp)
jmp .L2
.L3:
movl -16(%ebp), %edx
movl %edx, %eax
sall $2, %eax
addl %edx, %eax
movl %eax, -12(%ebp)
subl $8, %esp
pushl -12(%ebp)
leal .LC0@GOTOFF(%ebx), %eax
pushl %eax
call printf@PLT
addl $16, %esp
addl $1, -16(%ebp)
.L2:
cmpl $999, -16(%ebp)
jle .L3
movl $0, %eax
leal -8(%ebp), %esp
popl %ecx
.cfi_restore 1
.cfi_def_cfa 1, 0
popl %ebx
.cfi_restore 3
popl %ebp
.cfi_restore 5
leal -4(%ecx), %esp
.cfi_def_cfa 4, 4
ret
.cfi_endproc
.LFE0:
.size main, .-main
.section .text.__x86.get_pc_thunk.bx,"axG",@progbits,__x86.get_pc_thunk.bx,comdat
.globl __x86.get_pc_thunk.bx
.hidden __x86.get_pc_thunk.bx
.type __x86.get_pc_thunk.bx, @function
__x86.get_pc_thunk.bx:
.LFB1:
.cfi_startproc
movl (%esp), %ebx
ret
.cfi_endproc
.LFE1:
.ident "GCC: (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0"
.section .note.GNU-stack,"",@progbits
.section .note.gnu.property,"a"
.align 4
.long 1f - 0f
.long 4f - 1f
.long 5
0:
.string "GNU"
1:
.align 4
.long 0xc0000002
.long 3f - 2f
2:
.long 0x3
3:
.align 4
4:
二. Sample programs in Chapter 07
(一)inttest.s
命令行:
$ as --32 -gstabs -o inttest.o inttest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o inttest -lc inttest.o
$ gdb -q inttest
输出结果:
Reading symbols from inttest...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file inttest.s, line 9.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter07/inttest
Breakpoint 1, _start () at inttest.s:9
9 movl $-345, %ecx
(gdb) n
10 movw $0xffb1, %dx
(gdb) n
11 movl data, %ebx
(gdb) n
12 movl $1, %eax
(gdb) info reg
eax 0x1c 28
ecx 0xfffffea7 -345
edx 0xf7feffb1 -134283343
ebx 0xffffffd3 -45
(二)movzxtest.s
命令行:
$ as --32 -gstabs -o movzxtest.o movzxtest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o movzxtest -lc movzxtest.o
$ gdb -q movzxtest
输出结果:
Reading symbols from movzxtest...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file movzxtest.s, line 6.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter07/movzxtest
Breakpoint 1, _start () at movzxtest.s:6
6 movl $279, %ecx
(gdb) n
7 movzx %cl, %ebx
(gdb) n
8 movl $1, %eax
(gdb) prinwt $ecx
Undefined command: "prinwt". Try "help".
(gdb) print $ecx
$1 = 279
(gdb) print $ebx
$2 = 23
(gdb) print/x $ecx
$3 = 0x117
(gdb) print/x $ebx
$4 = 0x17
(gdb)
(三)movsxtest.s
命令行:
$ as --32 -gstabs -o movsxtest.o movsxtest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o movsxtest -lc movsxtest.o
$ gdb -q movsxtest
输出结果:
Reading symbols from movsxtest...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file movsxtest.s, line 6.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter07/movsxtest
Breakpoint 1, _start () at movsxtest.s:6
6 movw $-79, %cx
(gdb) n
7 movl $0, %ebx
(gdb) n
8 movw %cx, %bx
(gdb) n
9 movsx %cx, %eax
(gdb) n
10 movl $1, %eax
(gdb) info reg
eax 0xffffffb1 -79
ecx 0xffb1 65457
edx 0xf7fe22d0 -134339888
ebx 0xffb1 65457
(四)movsxtest2.s
命令行:
$ as --32 -gstabs -o movsxtest2.o movsxtest2.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o movsxtest2 -lc movsxtest2.o
$ gdb -q movsxtest2
输出结果:
Reading symbols from movsxtest2...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file movsxtest2.s, line 6.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter07/movsxtest2
Breakpoint 1, _start () at movsxtest2.s:6
6 movw $79, %cx
(gdb) n
7 xor %ebx, %ebx
(gdb) n
8 movw %cx, %bx
(gdb) n
9 movsx %cx, %eax
(gdb) n
10 movl $1, %eax
(gdb) info reg
eax 0x4f 79
ecx 0x4f 79
edx 0xf7fe22d0 -134339888
ebx 0x4f 79
(五)quadtest.s
命令行:
$ as --32 -gstabs -o quadtest.o quadtest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o quadtest -lc quadtest.o
$ gdb -q quadtest
输出结果:
Reading symbols from quadtest...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file quadtest.s, line 11.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter07/quadtest
Breakpoint 1, _start () at quadtest.s:11
11 movl $1, %eax
(gdb) x/5d &data1
0x804b000: 1 -1 463345 -333252322
0x804b010: 0
(gdb) x/5d &data2
0x804b014: 1 0 -1 -1
0x804b024: 463345
(gdb) x/20b &data1
0x804b000: 1 0 0 0 -1 -1 -1 -1
0x804b008: -15 17 7 0 30 -7 34 -20
0x804b010: 0 0 0 0
(gdb) print/x &data1
$1 = 0x804b000
(gdb) x/40b &data2
0x804b014: 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x804b01c: 0xff 0xff 0xff 0xff 0xff 0xff 0xff 0xff
0x804b024: 0xf1 0x11 0x07 0x00 0x00 0x00 0x00 0x00
0x804b02c: 0x1e 0xf9 0x22 0xec 0xff 0xff 0xff 0xff
0x804b034: 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
(gdb) x/20b &data1
0x804b000: 0x01 0x00 0x00 0x00 0xff 0xff 0xff 0xff
0x804b008: 0xf1 0x11 0x07 0x00 0x1e 0xf9 0x22 0xec
0x804b010: 0x00 0x00 0x00 0x00
(gdb) x/5gd &data2
0x804b014: 1 -1
0x804b024: 463345 -333252322
0x804b034: 0
(六)mmxtest.s
命令行:
$ as --32 -gstabs -o mmxtest.o mmxtest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o mmxtest -lc mmxtest.o
$ gdb -q mmxtest
输出结果:
Reading symbols from mmxtest...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file mmxtest.s, line 11.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter07/mmxtest
Breakpoint 1, _start () at mmxtest.s:11
11 movq values1, %mm0
(gdb) n
12 movq values2, %mm1
(gdb) n
13 movl $1, %eax
(gdb) print/x $mm0
$1 = {uint64 = 0xffffffff00000001, v2_int32 = {0x1, 0xffffffff}, v4_int16 = {
0x1, 0x0, 0xffff, 0xffff}, v8_int8 = {0x1, 0x0, 0x0, 0x0, 0xff, 0xff,
0xff, 0xff}}
(gdb) print/x $mm1
$2 = {uint64 = 0x100e44732ff0510, v2_int32 = {0x32ff0510, 0x100e447},
v4_int16 = {0x510, 0x32ff, 0xe447, 0x100}, v8_int8 = {0x10, 0x5, 0xff, 0x32,
0x47, 0xe4, 0x0, 0x1}}
(gdb) print $mm0
$3 = {uint64 = -4294967295, v2_int32 = {1, -1}, v4_int16 = {1, 0, -1, -1},
v8_int8 = {1, 0, 0, 0, -1, -1, -1, -1}}
(gdb) print $mm1
$4 = {uint64 = 72308588487312656, v2_int32 = {855573776, 16835655},
v4_int16 = {1296, 13055, -7097, 256}, v8_int8 = {16, 5, -1, 50, 71, -28, 0,
1}}
(gdb)
(七)ssetest.s
命令行:
$ as --32 -gstabs -o ssetest.o ssetest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o ssetest -lc ssetest.o
$ gdb -q ssetest
输出结果:
Reading symbols from ssetest...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file ssetest.s, line 11.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter07/ssetest
Breakpoint 1, _start () at ssetest.s:11
11 movdqu values1, %xmm0
(gdb) n
12 movdqu values2, %xmm1
(gdb) n
14 movl $1, %eax
(gdb) print $xmm0
$1 = {v4_float = {1.40129846e-45, -nan(0x7fffff), 0, 1.89520012e-40},
v2_double = {-nan(0xfffff00000001), 2.8699144274488922e-309}, v16_int8 = {1,
0, 0, 0, -1, -1, -1, -1, 0, 0, 0, 0, 78, 16, 2, 0}, v8_int16 = {1, 0, -1,
-1, 0, 0, 4174, 2}, v4_int32 = {1, -1, 0, 135246}, v2_int64 = {
-4294967295, 580877146914816},
uint128 = 10715292067404213048920514521726977}
(gdb) print/x $xmm0
$2 = {v4_float = {0x0, 0xffffffff, 0x0, 0x0}, v2_double = {0x7fffffffffffffff,
0x0}, v16_int8 = {0x1, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0,
0x0, 0x0, 0x4e, 0x10, 0x2, 0x0}, v8_int16 = {0x1, 0x0, 0xffff, 0xffff,
0x0, 0x0, 0x104e, 0x2}, v4_int32 = {0x1, 0xffffffff, 0x0, 0x2104e},
v2_int64 = {0xffffffff00000001, 0x2104e00000000},
uint128 = 0x2104e00000000ffffffff00000001}
(gdb) print/x $xmm1
$3 = {v4_float = {0x0, 0x0, 0xffffffff, 0xffffffff}, v2_double = {0x0,
0x7fffffffffffffff}, v16_int8 = {0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}, v8_int16 = {0x1, 0x0,
0x0, 0x0, 0xffff, 0xffff, 0xffff, 0xffff}, v4_int32 = {0x1, 0x0,
0xffffffff, 0xffffffff}, v2_int64 = {0x1, 0xffffffffffffffff},
uint128 = 0xffffffffffffffff0000000000000001}
(gdb)
(八)bcdtest.s
命令行:
$ as --32 -gstabs -o bcdtest.o bcdtest.s
zhaowx9@ubuntu:~/Desktop/chapter07$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o bcdtest -lc bcdtest.o
zhaowx9@ubuntu:~/Desktop/chapter07$ gdb -q bcdtest
输出结果:
Reading symbols from bcdtest...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file bcdtest.s, line 11.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter07/bcdtest
Breakpoint 1, _start () at bcdtest.s:11
11 fbld data1
(gdb) x/10b &data1
0x804b000: 0x34 0x12 0x00 0x00 0x00 0x00 0x00 0x00
0x804b008: 0x00 0x00
(gdb) n
12 fimul data2
(gdb) info all
·
·
·
st0 1234 (raw 0x40099a40000000000000)
·
·
·
(gdb) n
13 fbstp data1
(gdb) info all
eax 0x1c 28
ecx 0x0 0
edx 0xf7fe22d0 -134339888
ebx 0xf7ffd000 -134230016
esp 0xffffd230 0xffffd230
ebp 0x0 0x0
esi 0xffffd23c -11716
edi 0x8049000 134516736
eip 0x804900d 0x804900d <_start+13>
eflags 0x286 [ PF SF IF ]
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x63 99
st0 2468 (raw 0x400a9a40000000000000)
st1 0 (raw 0x00000000000000000000)
st2 0 (raw 0x00000000000000000000)
st3 0 (raw 0x00000000000000000000)
st4 0 (raw 0x00000000000000000000)
st5 0 (raw 0x00000000000000000000)
st6 0 (raw 0x00000000000000000000)
--Type <RET> for more, q to quit, c to continue without paging--q
Quit
(gdb) x/10b &data1
0x804b000: 0x34 0x12 0x00 0x00 0x00 0x00 0x00 0x00
0x804b008: 0x00 0x00
(gdb) n
15 movl $1, %eax
(gdb) x/10b &data1
0x804b000: 0x68 0x24 0x00 0x00 0x00 0x00 0x00 0x00
0x804b008: 0x00 0x00
(gdb)
(九)floattest.s
命令行:
$ as --32 -gstabs -o floattest.o floattest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o floattest -lc floattest.o
$ gdb -q floattest
输出结果:
Reading symbols from floattest...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file floattest.s, line 14.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter07/floattest
Breakpoint 1, _start () at floattest.s:14
14 flds value1
(gdb) x/4b &value1
0x804b000: -92 112 69 65
(gdb) x/4b &value2
0x804b004: -115 -105 110 18
(gdb) print/x
The history is empty.
(gdb) x/4b &value1
0x804b000: 0xa4 0x70 0x45 0x41
(gdb) x/4b &value2
0x804b004: 0x8d 0x97 0x6e 0x12
(gdb) x/f &value1
0x804b000: 6.7705045851918156e-220
(gdb) x/gf &value2
0x804b004: 2353.6309999999999
(gdb) n
15 fldl value2
(gdb) print $st0
$1 = 12.340000152587890625
(gdb) n
16 fstl data
(gdb) print $st0
$2 = 2353.63099999999985812
(gdb) print $st1
$3 = 12.340000152587890625
(gdb) x/gf &data
0x804b010 <data>: 0
(gdb) n
18 movl $1, %eax
(gdb) x/gf &data
0x804b010 <data>: 2353.6309999999999
(gdb)
(十)fpuvals.s
命令行:
$ as --32 -gstabs -o fpuvals.o fpuvals.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o fpuvals -lc fpuvals.o
$ gdb -q fpuvals
输出结果:
Reading symbols from fpuvals...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file fpuvals.s, line 6.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter07/fpuvals
Breakpoint 1, _start () at fpuvals.s:6
6 fld1
(gdb) info all
eax 0x1c 28
ecx 0x0 0
edx 0xf7fe22d0 -134339888
ebx 0xf7ffd000 -134230016
esp 0xffffd230 0xffffd230
ebp 0x0 0x0
esi 0xffffd23c -11716
edi 0x8049000 134516736
eip 0x8049001 0x8049001 <_start+1>
eflags 0x286 [ PF SF IF ]
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x63 99
st0 0 (raw 0x00000000000000000000)
st1 0 (raw 0x00000000000000000000)
st2 0 (raw 0x00000000000000000000)
st3 0 (raw 0x00000000000000000000)
st4 0 (raw 0x00000000000000000000)
st5 0 (raw 0x00000000000000000000)
st6 0 (raw 0x00000000000000000000)
--Type <RET> for more, q to quit, c to continue without paging--q
Quit
(gdb) n
7 fldl2t
(gdb) n
8 fldl2e
(gdb) n
9 fldpi
(gdb) n
10 fldlg2
(gdb) n
11 fldln2
(gdb) n
12 fldz
(gdb) n
14 movl $1, %eax
(gdb) n
15 movl $0, %ebx
(gdb) n
16 int $0x80
(gdb) info all
eax 0x1 1
ecx 0x0 0
edx 0xf7fe22d0 -134339888
ebx 0x0 0
esp 0xffffd230 0xffffd230
ebp 0x0 0x0
esi 0xffffd23c -11716
edi 0x8049000 134516736
eip 0x8049019 0x8049019 <_start+25>
eflags 0x286 [ PF SF IF ]
cs 0x23 35
ss 0x2b 43
ds 0x2b 43
es 0x2b 43
fs 0x0 0
gs 0x63 99
st0 0 (raw 0x00000000000000000000)
st1 0.693147180559945309429 (raw 0x3ffeb17217f7d1cf79ac)
st2 0.301029995663981195226 (raw 0x3ffd9a209a84fbcff799)
st3 3.14159265358979323851 (raw 0x4000c90fdaa22168c235)
st4 1.44269504088896340739 (raw 0x3fffb8aa3b295c17f0bc)
st5 3.32192809488736234781 (raw 0x4000d49a784bcd1b8afe)
st6 1 (raw 0x3fff8000000000000000)
--Type <RET> for more, q to quit, c to continue without paging--q
Quit
(gdb)
(十一)seefloat.s
命令行:
$ as --32 -gstabs -o ssefloat.o ssefloat.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o ssefloat -lc ssefloat.o
$ gdb -q ssefloat
输出结果:
Reading symbols from ssefloat...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file ssefloat.s, line 13.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter07/ssefloat
Breakpoint 1, _start () at ssefloat.s:13
13 movups value1, %xmm0
(gdb) n
14 movups value2, %xmm1
(gdb) n
15 movups %xmm0, %xmm2
(gdb) n
16 movups %xmm0, data
(gdb) print $xmm0
$1 = {v4_float = {12.3400002, 2345.54297, -3493.19995, 0.449010015},
v2_double = {5.6204289471764299e+24, 1.0439462282443856e-05}, v16_int8 = {
-92, 112, 69, 65, -80, -104, 18, 69, 51, 83, 90, -59, -92, -28, -27, 62},
v8_int16 = {28836, 16709, -26448, 17682, 21299, -15014, -7004, 16101},
v4_int32 = {1095069860, 1158846640, -983936205, 1055253668}, v2_int64 = {
4977208420974555300, 4532279996355072819},
uint128 = 83605809163155287727927076236493680804}
(gdb) print $xmm1
$2 = {v4_float = {-5439.23389, 32121.4004, 1.00940001, 3.00000011e-06},
v2_double = {8.7452727745837517e+33, 3.4658329842889617e-47}, v16_int8 = {
-33, -7, -87, -59, -51, -14, -6, 70, 5, 52, -127, 63, -100, 83, 73, 54},
v8_int16 = {-1569, -14935, -3379, 18170, 13317, 16257, 21404, 13897},
v4_int32 = {-978716193, 1190851277, 1065432069, 910775196}, v2_int64 = {
5114667292431088095, 3911749681893422085},
uint128 = 72159045262302707577450683077612927455}
(gdb) print $xmm2
$3 = {v4_float = {12.3400002, 2345.54297, -3493.19995, 0.449010015},
v2_double = {5.6204289471764299e+24, 1.0439462282443856e-05}, v16_int8 = {
-92, 112, 69, 65, -80, -104, 18, 69, 51, 83, 90, -59, -92, -28, -27, 62},
v8_int16 = {28836, 16709, -26448, 17682, 21299, -15014, -7004, 16101},
v4_int32 = {1095069860, 1158846640, -983936205, 1055253668}, v2_int64 = {
4977208420974555300, 4532279996355072819},
uint128 = 83605809163155287727927076236493680804}
(gdb) n
18 movl $1, %eax
(gdb) x/4f &data
0x804b020 <data>: 12.3400002 2345.54297 -3493.19995 0.449010015
(gdb) x/16b &data
0x804b020 <data>: 0xa4 0x70 0x45 0x41 0xb0 0x98 0x12 0x45
0x804b028 <data+8>: 0x33 0x53 0x5a 0xc5 0xa4 0xe4 0xe5 0x3e
(gdb) x/16b &value1
0x804b000: 0xa4 0x70 0x45 0x41 0xb0 0x98 0x12 0x45
0x804b008: 0x33 0x53 0x5a 0xc5 0xa4 0xe4 0xe5 0x3e
(gdb)
(十二)sse2float.s
命令行:
$ as --32 -gstabs -o sse2float.o sse2float.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o sse2float -lc sse2float.o
$ gdb -q sse2float
输出结果:
Reading symbols from sse2float...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file sse2float.s, line 13.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter07/sse2float
Breakpoint 1, _start () at sse2float.s:13
13 movupd value1, %xmm0
(gdb) n
14 movupd value2, %xmm1
(gdb) n
15 movupd %xmm0, %xmm2
(gdb) n
16 movupd %xmm0, data
(gdb) print &xmm0
No symbol "xmm0" in current context.
(gdb) print $xmm0
$1 = {v4_float = {5.84860315e+35, 2.63562489, 1.79352231e-36, 5.07264233},
v2_double = {12.34, 2345.5430000000001}, v16_int8 = {-82, 71, -31, 122, 20,
-82, 40, 64, 117, -109, 24, 4, 22, 83, -94, 64}, v8_int16 = {18350, 31457,
-20972, 16424, -27787, 1048, 21270, 16546}, v4_int32 = {2061584302,
1076407828, 68719477, 1084379926}, v2_int64 = {4623136420479977390,
4657376318677619573}, uint128 = 85913429005601586953847513200535357358}
(gdb) print $xmm1
$2 = {v4_float = {-1.11704749e+24, -5.66396856, -1.58818684e-23, 6.98026705},
v2_double = {-5439.2340000000004, 32121.400000000001}, v16_int8 = {68, -117,
108, -25, 59, 63, -75, -64, -102, -103, -103, -103, 89, 94, -33, 64},
v8_int16 = {-29884, -6292, 16187, -16203, -26214, -26215, 24153, 16607},
v4_int32 = {-412316860, -1061863621, -1717986918, 1088380505}, v2_int64 = {
-4560669521124488380, 4674558677155944858},
uint128 = 86230387575033986983375224144585853764}
(gdb) print $xmm2
$3 = {v4_float = {5.84860315e+35, 2.63562489, 1.79352231e-36, 5.07264233},
v2_double = {12.34, 2345.5430000000001}, v16_int8 = {-82, 71, -31, 122, 20,
-82, 40, 64, 117, -109, 24, 4, 22, 83, -94, 64}, v8_int16 = {18350, 31457,
-20972, 16424, -27787, 1048, 21270, 16546}, v4_int32 = {2061584302,
1076407828, 68719477, 1084379926}, v2_int64 = {4623136420479977390,
4657376318677619573}, uint128 = 85913429005601586953847513200535357358}
(gdb) n
18 movl $1, %eax
(gdb) x/2gf &data
0x804b020 <data>: 12.34 2345.5430000000001
(gdb) x/16b &data
0x804b020 <data>: -82 71 -31 122 20 -82 40 64
0x804b028 <data+8>: 117 -109 24 4 22 83 -94 64
(gdb) x/16b &value1
0x804b000: -82 71 -31 122 20 -82 40 64
0x804b008: 117 -109 24 4 22 83 -94 64
(gdb)
(十三)convtest.s
命令行:
$ as --32 -gstabs -o convtest.o convtest.s
出现问题:
convtest.s: Assembler messages:
convtest.s:9: Error: symbol `data' is already defined
解决方法: 将第8行的 data:
删除。
命令行:
$ as --32 -gstabs -o convtest.o convtest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o convtest -lc convtest.o
$ gdb -q convtest
输出结果:
Reading symbols from convtest...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file convtest.s, line 14.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter07/convtest
Breakpoint 1, _start () at convtest.s:14
14 cvtps2dq value1, %xmm0
(gdb) n
15 cvttps2dq value1, %xmm1
(gdb) n
16 cvtdq2ps value2, %xmm2
(gdb) n
17 movdqu %xmm0, data
(gdb) n
19 movl $1, %eax
(gdb) print $xmm0
$1 = {v4_float = {1.40129846e-45, 1.75162308e-43, 2.80259693e-43,
-nan(0x7ffec8)}, v2_double = {2.6524947387115311e-312,
-nan(0xffec8000000c8)}, v16_int8 = {1, 0, 0, 0, 125, 0, 0, 0, -56, 0, 0,
0, -56, -2, -1, -1}, v8_int16 = {1, 0, 125, 0, 200, 0, -312, -1},
v4_int32 = {1, 125, 200, -312}, v2_int64 = {536870912001, -1340029796152},
uint128 = 340282342201751762702250093524836941825}
(gdb) print $xmm1
$2 = {v4_float = {1.40129846e-45, 1.7376101e-43, 2.80259693e-43,
-nan(0x7ffec8)}, v2_double = {2.6312747808018783e-312,
-nan(0xffec8000000c8)}, v16_int8 = {1, 0, 0, 0, 124, 0, 0, 0, -56, 0, 0,
0, -56, -2, -1, -1}, v8_int16 = {1, 0, 124, 0, 200, 0, -312, -1},
v4_int32 = {1, 124, 200, -312}, v2_int64 = {532575944705, -1340029796152},
uint128 = 340282342201751762702250093520541974529}
(gdb) print $xmm2
$3 = {v4_float = {1, -435, 0, -25}, v2_double = {-7.3498756827903427e+18,
-805306368}, v16_int8 = {0, 0, -128, 63, 0, -128, -39, -61, 0, 0, 0, 0, 0,
0, -56, -63}, v8_int16 = {0, 16256, -32768, -15399, 0, 0, 0, -15928},
v4_int32 = {1065353216, -1009156096, 0, -1043857408}, v2_int64 = {
-4334292427813683200, -4483333429047328768},
uint128 = 257579462558195729010253313545846390784}
(gdb) x/4d &data
0x804b020 <data>: 1 125 200 -312
(gdb)
实验心得
成功掌握了在64位Ubuntu系统上编译连接调试32位的汇编程序。同时通过对第六章和第七章的学习,初步掌握了许多汇编指令。