实验报告

实验内容

 运行并验证Blum’s Book: Sample programs in Chapter 08, 10

实验环境

 Ubuntu 20.04.2.0(64位)

实验过程

一. Sample programs in Chapter 08

(一)addtest1.s

命令行

$ as -gstabs --32 -o addtest1.o addtest1.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o addtest1 -lc addtest1.o
$ gdb -q addtest1

输出结果

Reading symbols from addtest1...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file addtest1.s, line 9.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter08/addtest1 Breakpoint 1, _start () at addtest1.s:9
9      movl $0, %eax
(gdb) n
10     movl $0, %ebx
(gdb) n
11     movl $0, %ecx
(gdb) n
12     movb $20, %al
(gdb) n
13     addb $10, %al
(gdb) n
14     movsx %al, %eax
(gdb) n
15     movw $100, %cx
(gdb) n
16     addw %cx, %bx
(gdb) n
17     movsx %bx, %ebx
(gdb) n
18     movl $100, %edx
(gdb) n
19     addl %edx, %edx
(gdb) n
20     addl data, %eax
(gdb) n
21     addl %eax, data
(gdb) n
22     movl $1, %eax
(gdb) print $eax
$1 = 70
(gdb) print $ebx
$2 = 100
(gdb) print $ecx
$3 = 100
(gdb) print $edx
$4 = 200
(gdb) x/d &data
0x804b000:  110

(二)addtest2.s

命令行:

$ as --32 -gstabs -o addtest2.o addtest2.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o addtest2 -lc addtest2.o
$ gdb -q addtest2

输出结果

Reading symbols from addtest2...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file addtest2.s, line 9.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter08/addtest2 Breakpoint 1, _start () at addtest2.s:9
9      movl $-10, %eax
(gdb) n
10     movl $-200, %ebx
(gdb) n
11     movl $80, %ecx
(gdb) n
12     addl data, %eax
(gdb) n
13     addl %ecx, %eax
(gdb) n
14     addl %ebx, %eax
(gdb) n
15     addl %eax, data
(gdb) n
16     addl $210, data
(gdb) n
17     movl $1, %eax
(gdb) print $eax
$1 = -170
(gdb) print $ebx
$2 = -200
(gdb) print $ecx
$3 = 80
(gdb) print $edx
$4 = -134339888
(gdb) x/d &data
0x804b000:  0

(三)addtest3.s

 1.原:

命令行

$ as --32 -o addtest3.o addtest3.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o addtest3 -lc addtest3.o
$ ./addtest3
$ echo $?

输出结果

0

 2.改:

 将 movb $100, %al 改为 movb $10, %al 后再进行实验:

命令行

$ as --32 -o addtest3.o addtest3.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o addtest3 -lc addtest3.o
$ ./addtest3
$ echo $?

输出结果

200

(四)addtest4.s

 1.原:

命令行

$ as --32 -o addtest4.o addtest4.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o addtest4 -lc addtest4.o
$ ./addtest4

输出结果

The result is 0

 2.改:

 将

movl $-1590876934, %ebx
movl $-1259230143, %eax

 改为

movl $-190876934, %ebx
movl $-159230143, %eax

 后再进行实验:

命令行

$ as --32 -o addtest4.o addtest4.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o addtest4 -lc addtest4.o
$ ./addtest4

输出结果

The result is -350107077

(五)adctest.s

 1. 运行

命令行

$ as --32 -gstabs -o adctest.o adctest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o adctest -lc adctest.o
$ ./adctest

输出结果

The result is 12984400543

 2. 调试

命令行

$ gdb -q adctest

输出结果

Reading symbols from adctest...
(gdb) break *_start+1
Breakpoint 1 at 0x8049031: file adctest.s, line 12.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter08/adctest
The result is 14188053504
[Inferior 1 (process 4500) exited normally]

问题: 无法调试

解决方法:_start: 后加一行 nop 后成功进行调试。

命令行

$ as --32 -gstabs -o adctest.o adctest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o adctest -lc adctest.o
$ gdb -q adctest

输出结果

Reading symbols from adctest...
(gdb) break *_start+1
Breakpoint 1 at 0x8049031: file adctest.s, line 13.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter08/adctest Breakpoint 1, _start () at adctest.s:13
13     movl data1, %ebx
(gdb) n
14     movl data1+4, %eax
(gdb) n
15     movl data2, %edx
(gdb) n
16     movl data2+4, %ecx
(gdb) n
17     addl %ebx, %edx
(gdb) info reg
eax            0x1                 1
ecx            0x1                 1
edx            0x55acb400          1437381632
ebx            0xb041869f          -1337882977
esp            0xffffd1f0          0xffffd1f0
ebp            0x0                 0x0
esi            0xffffd1fc          -11780
edi            0x8049030           134516784
eip            0x8049048           0x8049048 <_start+24>
eflags         0x282               [ SF IF ]
cs             0x23                35
ss             0x2b                43
ds             0x2b                43
es             0x2b                43
fs             0x0                 0
gs             0x63                99
(gdb) n
18     adcl %eax, %ecx
(gdb) n
19     pushl %ecx
(gdb) info reg
eax            0x1                 1
ecx            0x3                 3
edx            0x5ee3a9f           99498655
ebx            0xb041869f          -1337882977
esp            0xffffd1f0          0xffffd1f0
ebp            0x0                 0x0
esi            0xffffd1fc          -11780
edi            0x8049030           134516784
eip            0x804904c           0x804904c <_start+28>
eflags         0x206               [ PF IF ]
cs             0x23                35
ss             0x2b                43
ds             0x2b                43
es             0x2b                43
fs             0x0                 0
gs             0x63                99

(六)subtest1.s

命令行

$ as -gstabs --32 -o subtest1.o subtest1.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o subtest1 -lc subtest1.o
$ gdb -q subtest1

输出结果

Reading symbols from subtest1...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file subtest1.s, line 9.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter08/subtest1 Breakpoint 1, _start () at subtest1.s:9
9      movl $0, %eax
(gdb) n
10     movl $0, %ebx
(gdb) n
11     movl $0, %ecx
(gdb) n
12     movb $20, %al
(gdb) n
13     subb $10, %al
(gdb) n
14     movsx %al, %eax
(gdb) n
15     movw $100, %cx
(gdb) n
16     subw %cx, %bx
(gdb) n
17     movsx %bx, %ebx
(gdb) n
18     movl $100, %edx
(gdb) n
19     subl %eax, %edx
(gdb) n
20     subl data, %eax
(gdb) n
21     subl %eax, data
(gdb) print $eax
$1 = -30
(gdb) x/d &data
0x804b000:  40
(gdb) n
22     movl $1, %eax
(gdb) print $eax
$2 = -30
(gdb) x/d &data
0x804b000:  70

(七)subtest2.s

 1. 运行

命令行

$ as --32 -gstabs -o subtest2.o subtest2.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o subtest2 -lc subtest2.o
$ ./subtest2
$ echo $?

输出结果

0

 2. 调试

命令行

$ gdb -q subtest2

输出结果

Reading symbols from subtest2...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file subtest2.s, line 6.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter08/subtest2 Breakpoint 1, _start () at subtest2.s:6
6      movl $5, %eax
(gdb) n
7      movl $2, %ebx
(gdb) n
8      subl %eax, %ebx
(gdb) n
9      jc under
(gdb) print $ebx
$1 = -3

(八)subtest3.s

 1.原:

命令行

$ as --32 -gstabs -o subtest3.o subtest3.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o subtest3 -lc subtest3.o
$ ./subtest3

输出结果

The result is 0

 2.改:

 将 movl $1259230143, %eax 改为 movl $-1259230143, %eax 后再进行实验:

命令行

$ as --32 -gstabs -o subtest3.o subtest3.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o subtest3 -lc subtest3.o
$ ./subtest3

输出结果

The result is -331646791

(九)sbbtest.s

命令行

$ as --32 -gstabs -o sbbtest.o sbbtest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o sbbtest -lc sbbtest.o
$ ./sbbtest

输出结果

The result is -1519702687

(十)multest.s

命令行

$ as --32 -gstabs -o multest.o multest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o multest -lc multest.o
$ gdb -q multest

输出结果

Reading symbols from multest...
(gdb) break *_start +1
Breakpoint 1 at 0x8049031: file multest.s, line 15.
(gdb) n
The program is not being run.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter08/multest Breakpoint 1, _start () at multest.s:15
15     movl data1, %eax
(gdb) n
16     mull data2
(gdb) n
17     movl %eax, result
(gdb) n
18     movl %edx, result+4
(gdb) n
19     pushl %edx
(gdb) print $eax
$1 = 706134096
(gdb) print $edx
$2 = 12
(gdb) x/gd &result
0x804b01c:  52245741648
(gdb) x/8b &result
0x804b01c:  80  -64 22  42  12  0   0   0
(gdb) print/x $eax
$6 = 0x2a16c050
(gdb) print/x $edx
$7 = 0xc
(gdb) x/8b &result
0x804b01c:  0x50    0xc0    0x16    0x2a    0x0c    0x00    0x00    0x00

(十一)imultest.s

命令行

$ as --32 -gstabs -o imultest.o imultest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o imultest -lc imultest.o
$ gdb -q imultest

输出结果

Reading symbols from imultest...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file imultest.s, line 13.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter08/imultest Breakpoint 1, _start () at imultest.s:13
13     movl value1, %ebx
(gdb) n
14     movl value2, %ecx
(gdb) n
15     imull %ebx, %ecx
(gdb) n
16     movl value3, %edx
(gdb) n
17     imull $2, %edx, %eax
(gdb) n
18     movl $1, %eax
(gdb) info reg
eax            0x320               800
ecx            0xfffffea2          -350
edx            0x190               400
ebx            0xa                 10

(十二)imultest2.s

命令行

$ as --32 -gstabs -o imultest2.o imultest2.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o imultest2 -lc imultest2.o
$ ./imultest2
$ echo $?

输出结果

1

(十三)divtest.s

命令行

$ as --32 -gstabs -o divtest.o divtest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o divtest -lc divtest.o
$ ./divtest

输出结果

The quotient is 333, and the remainder is 10

(十四)saltest.s

命令行

$ as --32 -gstabs -o saltest.o saltest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o saltest -lc saltest.o
$ gdb -q saltest

输出结果

Reading symbols from saltest...
(gdb) break *_start +1
Breakpoint 1 at 0x8049001: file saltest.s, line 9.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter08/saltest Breakpoint 1, _start () at saltest.s:9
9      movl $10, %ebx
(gdb) n
10     sall %ebx
(gdb) n
11     movb $2, %cl
(gdb) n
12     sall %cl, %ebx
(gdb) n
13     sall $2, %ebx
(gdb) n
14     sall value1
(gdb) n
15     sall $2, value1
(gdb) n
16     movl $1, %eax
(gdb) info reg
eax            0x1c                28
ecx            0x2                 2
edx            0xf7fe22d0          -134339888
ebx            0x140               320
(gdb) x/d &value1
0x804b000:  200

(十五)aaatest.s

命令行

$ as --32 -gstabs -o aaatest.o aaatest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o aaatest -lc aaatest.o
$ gdb -q aaatest

输出结果

Reading symbols from aaatest...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file aaatest.s, line 13.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter08/aaatest Breakpoint 1, _start () at aaatest.s:13
13     xor %edi, %edi
(gdb) n
14     movl $5, %ecx
(gdb) n
15     clc
(gdb) n···
(gdb) n
19     aaa  (第三轮循环)
(gdb) info reg
eax            0xa                 10
(gdb) n
20     movb %al, sum(, %edi, 1)
(gdb) info reg
eax            0x100               256
(gdb) n
21     inc %edi
(gdb) n···
(gdb) n
23     adcb $0, sum(, %edi, 4)
(gdb) n
24     movl $1, %eax
(gdb) x/6b &sum
0x804b00c <sum>:  0x08    0x05    0x00    0x01    0x08    0x00

(十六)dastest.s

命令行

$ as --32 -gstabs -o dastest.o dastest.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o dastest -lc dastest.o
$ gdb -q dastest

输出结果

Reading symbols from dastest...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file dastest.s, line 13.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter08/dastest Breakpoint 1, _start () at dastest.s:13
13     xor %edi, %edi
(gdb) n
14     movl $3, %ecx
(gdb) n
16     movb value2(, %edi, 1), %al
(gdb) n
17     sbbb value1(, %edi, 1), %al
(gdb) n
18     das
(gdb) info reg
eax            0xe                 14
(gdb) n
19     movb %al, result(, %edi, 1)
(gdb) info reg
eax            0x8                 8
(gdb) n···
(gdb) n
22     sbbb $0, result(, %edi, 4)
(gdb) n
23     movl $1, %eax
(gdb) x/4xb &result
0x804b008 <result>:   0x08    0x48    0x02    0x00

 52933 - 28125 = 24808, 与结果相符。

(十七)cpuidtest.s

命令行

$ as --32 -gstabs -o cpuidtest.o cpuidtest.s
zhaowx9@ubuntu:~/Desktop/chapter08$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o cpuidtest -lc cpuidtest.o
zhaowx9@ubuntu:~/Desktop/chapter08$ ./cpuidtest

输出结果

This processor supports the CPUID instruction

二. Sample programs in Chapter 10

(一)movstest1.s

命令行

$ as --32 -gstabs -o movstest1.o movstest1.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o movstest1 -lc movstest1.o
$ gdb -q movstest1

输出结果

Reading symbols from movstest1...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file movstest1.s, line 11.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter10/movstest1 Breakpoint 1, _start () at movstest1.s:11
11     leal value1, %esi
(gdb) n
12     leal output, %edi
(gdb) n
13     movsb
(gdb) n
14     movsw
(gdb) x/s &output
0x804b018 <output>:   "T"
(gdb) n
15     movsl
(gdb) x/s &output
0x804b018 <output>:   "Thi"
(gdb) n
17     movl $1, %eax
(gdb) x/s &output
0x804b018 <output>:   "This is"

(二)movstest2.s

命令行:

$ as --32 -gstabs -o movstest2.o movstest2.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o movstest2 -lc movstest2.o
$ gdb -q movstest2

输出结果

Reading symbols from movstest2...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file movstest2.s, line 11.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter10/movstest2 Breakpoint 1, _start () at movstest2.s:11
11     leal value1+22, %esi
(gdb) n
12     leal output+22, %edi
(gdb) n
14     std
(gdb) n
15     movsb
(gdb) n
16     movsw
(gdb) x/s &output
0x804b018 <output>:   ""
(gdb) n
17     movsl
(gdb) x/s &output
0x804b018 <output>:   ""
(gdb) n
19     movl $1, %eax
(gdb) x/s &output
0x804b018 <output>:   ""
(gdb) x/23xb &output
0x804b018 <output>:   0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0x804b020 <output+8>:    0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0x804b028 <output+16>:   0x00    0x00    0x00    0x6e    0x67    0x2e    0x0a

(三)movstest3.s

命令行

$ as --32 -gstabs -o movstest3.o movstest3.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o movstest3 -lc movstest3.o
$ gdb -q movstest3

输出结果

Reading symbols from movstest3...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file movstest3.s, line 11.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter10/movstest3 Breakpoint 1, _start () at movstest3.s:11
11     leal value1, %esi
(gdb) n···
(gdb) x/23xb &output
0x804b018 <output>:   0x54    0x68    0x69    0x73    0x20    0x69    0x73    0x20
0x804b020 <output+8>:    0x61    0x20    0x74    0x65    0x73    0x74    0x20    0x73
0x804b028 <output+16>:   0x74    0x72    0x69    0x6e    0x67    0x2e    0x0a

(四)reptest1.s

命令行

$ as --32 -gstabs -o reptest1.o reptest1.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o reptest1 -lc reptest1.o
$ gdb -q reptest1

输出结果

Reading symbols from reptest1...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file reptest1.s, line 11.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter10/reptest1 Breakpoint 1, _start () at reptest1.s:11
11     leal value1, %esi
(gdb) n
12     leal output, %edi
(gdb) n
13     movl $23, %ecx
(gdb) n
14     cld
(gdb) n
15     rep movsb
(gdb) n
17     movl $1, %eax
(gdb) x/23xb &output
0x804b018 <output>:   0x54    0x68    0x69    0x73    0x20    0x69    0x73    0x20
0x804b020 <output+8>:    0x61    0x20    0x74    0x65    0x73    0x74    0x20    0x73
0x804b028 <output+16>:   0x74    0x72    0x69    0x6e    0x67    0x2e    0x0a
(gdb) x/s &output
0x804b018 <output>:   "This is a test string.\n"

(五)reptest2.s

命令行

$ as --32 -gstabs -o reptest2.o reptest2.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o reptest2 -lc reptest2.o
$ gdb -q reptest2

输出结果

Reading symbols from reptest2...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file reptest2.s, line 13.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter10/reptest2 Breakpoint 1, _start () at reptest2.s:13
13     leal value1, %esi
(gdb) n
14     leal output, %edi
(gdb) n
15     movl $6, %ecx
(gdb) n
16     cld
(gdb) n
17     rep movsl
(gdb) n
19     movl $1, %eax
(gdb) x/s &output
0x804b020 <output>:   "This is a test string.\nO"

(六)reptest3.s

命令行

$ as --32 -gstabs -o reptest3.o reptest3.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o reptest3 -lc reptest3.o
$ gdb -q reptest3

输出结果

Reading symbols from reptest3...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file reptest3.s, line 15.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter10/reptest3 Breakpoint 1, _start () at reptest3.s:15
15     leal string1, %esi
(gdb) n
16     leal buffer, %edi
(gdb) n
17     movl length, %ecx
(gdb) n
18     shrl $2, %ecx
(gdb) n
19     cld
(gdb) n
20     rep movsl
(gdb) n
21     movl length, %ecx
(gdb) x/s &buffer
0x804b038 <buffer>:   "This is a test of the conversion program"
(gdb) n
22     andl $3, %ecx
(gdb) n
23     rep movsb
(gdb) print $ecx
$1 = 3
(gdb) n
25     movl $1, %eax
(gdb) x/s &buffer
0x804b038 <buffer>:   "This is a test of the conversion program!\n"

(七)reptest4.s

命令行

$ as --32 -gstabs -o reptest4.o reptest4.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o reptest4 -lc reptest4.o
$ gdb -q reptest4

输出结果

Reading symbols from reptest4...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file reptest4.s, line 11.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter10/reptest4 Breakpoint 1, _start () at reptest4.s:11
11     leal value1+22, %esi
(gdb) n
12     leal output+22, %edi
(gdb) n
13     movl $23, %ecx
(gdb) n
14     std
(gdb) n
15     rep movsb
(gdb) n
17     movl $1, %eax
(gdb) x/s &output
0x804b018 <output>:   "This is a test string.\n"

(八)stostest1.s

命令行

$ as --32 -gstabs -o stostest1.o stostest1.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o stostest1 -lc stostest1.o
$ gdb -q stostest1

输出结果

Reading symbols from stostest1...
(gdb) break *_start+1
Breakpoint 1 at 0x8049001: file stostest1.s, line 11.
(gdb) run
Starting program: /home/zhaowx9/Desktop/chapter10/stostest1 Breakpoint 1, _start () at stostest1.s:11
11     leal space, %esi
(gdb) n
12     leal buffer, %edi
(gdb) n
13     movl $256, %ecx
(gdb) n
14     cld
(gdb) n
15     lodsb
(gdb) n
16     rep stosb
(gdb) print/x $eax
$1 = 0x20
(gdb) x/12xb &buffer
0x804b008 <buffer>:   0x00    0x00    0x00    0x00    0x00    0x00    0x00    0x00
0x804b010 <buffer+8>:    0x00    0x00    0x00    0x00
(gdb) n
18     movl $1, %eax
(gdb) x/12xb &buffer
0x804b008 <buffer>:   0x20    0x20    0x20    0x20    0x20    0x20    0x20    0x20
0x804b010 <buffer+8>:    0x20    0x20    0x20    0x20

(九)convert.s

命令行

$ as --32 -gstabs -o convert.o convert.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o convert -lc convert.o
$ ./convert

输出结果

THIS IS A TEST, OF THE CONVERSION PROGRAM!

(十)cmpstest1.s

 1. 原:

命令行

$ as --32 -gstabs -o cmpstest1.o cmpstest1.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o cmpstest1 -lc cmpstest1.o
$ ./cmpstest1
$ echo $?

输出结果

0

 2. 改:

 将 value1 的值改为 test 后再进行实验:

命令行

$ as --32 -gstabs -o cmpstest1.o cmpstest1.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o cmpstest1 -lc cmpstest1.o
$ ./cmpstest1
$ echo $?

输出结果

1

(十一)cmpstest2.s

 1. 原:

命令行

$ as --32 -gstabs -o cmpstest2.o cmpstest2.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o cmpstest2 -lc cmpstest2.o
$ ./cmpstest2
$ echo $?

输出结果

11

 2. 改:

 将 value2 的值改为 This is a test of the CMPS instructions 后再进行实验:

命令行

$ as --32 -gstabs -o cmpstest2.o cmpstest2.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o cmpstest2 -lc cmpstest2.o
$ ./cmpstest2
$ echo $?

输出结果

0

(十二)strcomp.s

命令行

$ as --32 -gstabs -o strcomp.o strcomp.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o strcomp -lc strcomp.o
$ ./strcomp
$ echo $?

输出结果

255

问题:cmp 的理解出现错误,导致一直无法看懂该程序。

解决方法: 通过反复阅读该程序以及上网搜索,终于理解正确了 cmp 的用法,即如下

cmp a, b
ja xxx
/*
若 a > b, 则跳转
否则, 不跳转
*/

 对不同实例的测试也证明了该理解是正确的。

(十三)scastest1.s

命令行

$ as --32 -gstabs -o scastest1.o scastest1.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o scastest1 -lc scastest1.o
$ ./scastest1
$ echo $?

输出结果

16

(十四)scastest2.s

命令行

$ as --32 -gstabs -o scastest2.o scastest2.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o scastest2 -lc scastest2.o
$ ./scastest2
$ echo $?

输出结果

0

(十五)strsize.s

命令行

$ as --32 -gstabs -o strsize.o strsize.s
$ ld -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o strsize -lc strsize.o
$ ./strsize
$ echo $?

输出结果

35

实验心得

掌握了许多新的汇编指令及其用法,包括加法、减法、乘法、除法、移位、调整格式、字符串各种操作等,同时也对在Ubuntu上进行汇编程序的编译连接以及调试的使用更加熟练,对各种调试指令查漏补缺,有了更进一步的理解。在对汇编程序的阅读理解和验证的过程中,更进一步地理解了汇编程序的结构和书写过程。

assembly8_10相关推荐

最新文章

  1. jmeter内存溢出处理方式记录
  2. MySQL 5.6 中的 TIMESTAMP 和 explicit_defaults_for_timestamp 参数
  3. 解决plt.savefig存的图是空白的
  4. cad记忆口诀_CAD制图口诀你值得拥有!
  5. eclipse取消空格补全
  6. 了解恶意软件和插件!
  7. 永不示弱_永不过时的网页设计:今天和2000年的在线投资组合
  8. CSS/DIV网页设计视频教程目录【转】
  9. NeHe OpenGL教程 第三十七课:卡通映射
  10. “我今年 31 岁,工作 7 年,明年退休...”
  11. c语言字符串定界符,关于c ++:按字符分割字符串
  12. 解决IE9,hack 设置背景图无效
  13. C++基础--static的用法
  14. 网络七层模型及各层协议
  15. 魔数湖南大学程序设计作业
  16. 一键将kafka,zookeeper安装为windows服务
  17. js 七大继承--史上最全最易懂
  18. 一个按钮控制灯的开关
  19. 华为代理服务器相关配置
  20. DTLN网络模型学习

热门文章

  1. 数字图像处理之matlab实验(三):空间滤波器
  2. 网上发现的一个 《Flashflex大全》
  3. Android如何判断系统是否已经被Root
  4. BMC通过PECI接口获取CPU温度实现方法
  5. RH358服务管理和自动化--配置网络接口
  6. 佳能2420报错代码E000007-0000
  7. C++面试知识总结-C++基础知识
  8. 1038 01背包动态规划
  9. 网络互联设备:中继器、交换机、网桥、路由器和网关
  10. C#实践——计算GPA