实验3 转移指令跳转原理及其简单应用编程

实验任务1

  • task1.asm源码
 1 assume cs:code, ds:data
 2 
 3 data segment
 4     x db 1, 9, 3
 5     len1 equ $ - x
 6 
 7     y dw 1, 9, 3
 8     len2 equ $ - y
 9 data ends
10 
11 code segment
12 start:
13     mov ax, data
14     mov ds, ax
15 
16     mov si, offset x
17     mov cx, len1
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
34     mov cx, len2/2
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
  • 运行截图

 

  • 回答问题① 
 line27, 汇编指令 loop s1 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得到跳转后标号s1其后指令的偏移地址的。 

 

 

  loop指令对应的汇编语言代码为E2F2,F2代表偏移量,其二进制形式为11110010将补码转换成原码为10001110 = -14,偏离地址为000D。

  • 回答问题② 
 line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得到跳转后标号s2其后指令的偏移地址的。 

 

 

 

  loop指令对应的汇编语言代码为E2F0,F2代表偏移量,其二进制形式为11110000  原码为10010000= -16 = (-10)16,偏移地址为Ox(39-10)=Ox(29)

 

实验任务2

  • task2.asm源码
 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
  • 给出分析、调试、验证后,寄存器(ax) = ? (bx) = ? (cx) = ? 附上调试结果界面截图。

(ax)= ip的值,(bx) = ip的值,(cx) = cs

 

 

实验任务3

 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 code segment
 7 start:
 8     mov ax,data
 9     mov ds,ax
10     mov byte ptr ds:[len],1011     mov cx,7
12     mov bx,0
13 s:  mov al,ds:[bx]
14     mov ah,0
15     inc bx
16     call printNumber
17     call printSpace
18     loop s
19     mov ah,4ch
20     int 21h
21 printNumber:
22     div byte ptr ds:[len];
23     mov dx,ax;dh
24     mov ah,2
25     or dl,30h;30h
26     int 21h
27     mov ah,2
28     mov dl,dh
29     or dl,30h
30     int 21h
31     ret
32 printSpace:
33     mov dl,' '
34     mov ah,2
35     int 21h
36     ret
37 code ends
38 end start

 

实验任务4

 1 assume cs:code,ds:data
 2 data segment
 3     str db 'try'
 4     len equ $ - str
 5 data ends
 6 code segment
 7 start:
 8     mov ax,data
 9     mov ds,ax
10     
11     mov bl,00000010B;
12     mov bh,013     mov cx,314     mov si,015     call printStr
16 
17     mov bl,00000100B
18     mov bh,24
19     mov cx,3
20     mov si,0
21     call printStr
22 
23     mov ah,4ch
24     int 21h
25 printStr:
26     mov ax,0b800h;
27     mov es,ax
28 
29     mov ax,0
30     mov al,bh
31     mov dx,16032     mul dx
33     mov di,ax
34 
35 s:  mov al,ds:[si]
36     mov es:[di],al;
37     inc si
38     inc di
39     mov es:[di],bl;
40     inc di
41     loop s
42     ret
43 code ends
44 end start
运行测试截图 

 

 

 

实验任务5 

assume ds:data, cs:code
data segment
stu_no db '201983290345'
len equ $ - stu_no
data ends

code segment
start:
mov ax,data
mov ds,ax

mov si,offset stu_no

mov cx,2000

mov bl,00010000B
mov ax,0B800H
mov es,ax
mov bp,00

s1: inc bp
mov es:[bp],bl
inc bp
loop s1

mov bp,0F00H
mov bl,00010111B
mov cx,80

s2: mov ax, 45
mov es:[bp], ax
inc bp
mov es:[bp],bl
inc bp
loop s2

mov ax,data
mov ds,ax
mov si,offset stu_no
mov bp,0F44H
mov cx, len

s3: mov ax, ds:[si]
mov es:[bp],ax
inc si
inc bp
mov es:[bp],bl
inc bp
loop s3

code ends
end start

 

 

posted @ 2021-12-02 20:33  bai_ke  阅读(53)  评论(2)    收藏  举报