汇编语言第三次实验

1. 实验任务1

  • task1源码
 1 assume cs:code, ds:data 
 2 
 3 data segment 
 4     x db 1, 9, 3 
 5     len1 equ $ - x ; 符号常量, $指下一个数据项的偏移地址,这个示例中,是3 
 6 
 7     y dw 1, 9, 3 
 8     len2 equ $ - y ; 符号常量, $指下一个数据项的偏移地址,这个示例中,是9 
 9 data ends 
10 
11 code segment 
12 start:
13     mov ax, data 
14     mov ds, ax 
15 
16     mov si, offset x ; 取符号x对应的偏移地址0 -> si 
17     mov cx, len1 ; 从符号x开始的连续字节数据项个数 -> cx 
18     mov ah, 2 
19 s1:mov dl, [si] 
20     or dl, 30h 
21     int 21h 
22 
23     mov dl, ' ' 
24     int 21h ; 输出空格 
25 
26     inc si 
27     loop s1 
28 
29     mov ah, 2 
30     mov dl, 0ah 
31     int 21h ; 换行 
32 
33     mov si, offset y ; 取符号y对应的偏移地址3 -> si 
34     mov cx, len2/2 ; 从符号y开始的连续字数据项个数 -> cx 
35     mov ah, 2 
36 s2:mov dx, [si] 
37     or dl, 30h 
38     int 21h
39  
40     mov dl, ' ' 
41     int 21h ; 输出空格 
42 
43     add si, 2 
44     loop s2 
45 
46     mov ah, 4ch 
47     int 21h 
48 code ends 
49 end start
  • 运行截图

  • 问题1

跳转的位移量是-14,编译器通过标号处的地址-loop指令后的第一个字节的地址计算跳转的8位位移,此例中标号s1的偏移地址为000D,loop指令后第一个字节的偏移地址为001B,两者相减结果为-14。

  • 问题2

跳转的位移量是-10,标号s2的偏移地址为0029,loop指令后第一个字节的偏移地址为0039,两者相减结果为-10。包括loop指令在内的所有循环指令都是短转移,在对应机器码中包含转移位移而非地址。

  •  反汇编截图

 

 2. 实验任务2

  • task2源码
 1 assume cs:code, ds:data
 2 
 3 data segment
 4     dw 200h, 0h, 230h, 0h
 5 data ends
 6 
 7 stack segment
 8     db 16 dup(0)
 9 stack ends
10 
11 code segment
12 start:  
13     mov ax, data
14     mov ds, ax
15 
16     mov word ptr ds:[0], offset s1
17     mov word ptr ds:[2], offset s2
18     mov ds:[4], cs
19 
20     mov ax, stack
21     mov ss, ax
22     mov sp, 16
23 
24     call word ptr ds:[0]
25 s1: pop ax
26 
27     call dword ptr ds:[2]
28 s2: pop bx
29     pop cx
30 
31     mov ah, 4ch
32     int 21h
33 code ends
34 end start
  • 分析结果

源程序line24将下一行指令在内存中的偏移地址(IP)入栈,并将IP的内容修改为内存ds:[0]处字的内容。此前已将标号s1的偏移地址(offset s1)存至ds:[0]处,因此这条call指令执行后跳转至标号s1处执行。s1处的指令将栈顶数据,即line25 pop指令在内存中的偏移地址(IP)出栈并存入寄存器ax中。

line27 call指令将下一行指令在内存中的段地址(CS)和偏移地址(IP)相继入栈,并将CS和IP的内容修改为内存ds:[2]处双字的内容。此前将标号s2的偏移地址(offset s2)存至ds:[2]处,将段地址(CS)存放在ds:[4]处,因此这条call指令执行后跳转至标号s2处执行。标号s1之后的指令将栈顶数据(IP)出栈并存入寄存器bx中,在将栈顶数据(CS)出栈并存入寄存器cx中。

结论:ax中存放了标号s1处指令在内存中的偏移地址,bx中存放了标号s2处指令在内存中的偏移地址,cx中存放了标号s2处指令在内存中的段地址。

  • 调试验证

 反汇编后观察标号s1、s2处指令的地址

调试所得结果与分析相同。

 

3. 实验任务3

  • task3源码
 1 assume cs:code, ds:data
 2 data segment
 3     x db 99, 72, 85, 63, 89, 97, 55
 4     len equ $- x
 5 data ends
 6 
 7 code segment
 8 start:
 9     mov ax, data
10     mov ds, ax
11     mov si, offset x
12     mov cx, len
13   s:mov ah, 0
14     mov al, [si]
15     mov dl, 10
16     div dl
17     mov bx, ax
18     mov ah, 2
19     call printNumber
20     call printSpace
21     inc si
22     loop s
23     mov ah, 4ch
24     int 21h
25     
26 printNumber:
27     mov dl, bl
28     or dl, 30h
29     int 21h
30     mov dl, bh
31     or dl, 30h
32     int 21h
33     ret
34 printSpace:
35     mov dl, ' '
36     int 21h
37     ret
38 code ends
39 end start
  • 运行测试

 

 4. 实验任务4

  • task4源码
 1 assume cs:code, ds:data
 2 data segment
 3     str db 'try'
 4     len equ $ - str
 5 data ends
 6 
 7 code segment
 8 start:
 9     mov ax, data
10     mov ds, ax
11 
12     mov si, offset str
13     mov bh, 0
14     mov bl, 2
15     call printStr
16 
17     mov si, offset str
18     mov bh, 24
19     mov bl, 4
20     call printStr
21 
22     mov ah, 4ch
23     int 21h
24 
25 printStr:mov cx, len
26   s:mov ax, 0b800h
27     mov dx, cx
28     mov ch, 0
29     mov cl, bh
30   t:add ax, 10
31     loop t
32     mov cx, dx
33     mov es, ax
34     mov di, si
35     add di, si
36     mov al, [si]
37     mov es:[di], al
38     mov es:[di].1, bl
39     inc si
40     loop s
41     ret
42 code ends
43 end start
  • 运行测试

 

 5. 实验任务5

  • task5源码
 1 assume cs:code, ds:data
 2 data segment
 3     stu_no db '201983300512'
 4     len = $ - stu_no
 5 data ends
 6 
 7 code segment
 8 start:
 9     mov ax, data
10     mov ds, ax
11     call blueCurtain
12     call printStu_no
13 
14     mov ah, 4ch
15     int 21h
16 printStu_no:mov ax, 0b800h
17     mov cx, 24
18   s:add ax, 10
19     loop s
20     mov es, ax
21     mov di, 0
22     mov cx, 34
23   l:mov byte ptr es:[di], '-'
24     add di, 2
25     loop l
26     mov cx, len
27     mov si, offset stu_no
28   t:mov dl, [si]
29     mov es:[di], dl
30     inc si
31     add di, 2
32     loop t
33     mov cx, 34
34   r:mov byte ptr es:[di], '-'
35     add di, 2
36     loop r
37     ret
38 
39 blueCurtain:mov ax, 0b800h
40     mov es, ax
41     mov cx, 2000
42     mov si, 0
43   b:mov byte ptr es:[si].1, 23
44     add si, 2
45     loop b
46     ret
47 
48 code ends
49 end start
  • 运行测试

 

posted @ 2021-11-27 09:29  T1lAM1lSU  阅读(72)  评论(0)    收藏  举报