assembly6_7

实验报告

实验内容

 运行并验证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 %eaxmovl $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位的汇编程序。同时通过对第六章和第七章的学习,初步掌握了许多汇编指令。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值