ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-11-29 17:02:31  阅读:107  来源: 互联网

标签:code 编程 mov si 指令 跳转 ax data ds


1.实验任务1

汇编程序源码:

assume cs:code, ds:data
data segment
 x db 1, 9, 3
 len1 equ $ - x ; 符号常量, $指下一个数据项的偏移地址,这个示例中,是3 

 y dw 1, 9, 3
 len2 equ $ - y ; 符号常量, $指下一个数据项的偏移地址,这个示例中,是9 data ends 

code segment 
start:mov ax, data 
        mov ds, ax 
        mov si, offset x ; 取符号x对应的偏移地址0 -> si 
        mov cx, len1 ; 从符号x开始的连续字节数据项个数 -> cx 
        mov ah, 2 
   s1:mov dl, [si] 
       or dl, 30h 
       int 21h 

       mov dl, ' ' 
       int 21h ; 输出空格 
       inc si 
       loop s1 

       mov ah, 2 
       mov dl, 0ah 
       int 21h ; 换行 

       mov si, offset y ; 取符号y对应的偏移地址3 -> si 
       mov cx, len2/2 ; 从符号y开始的连续字数据项个数 -> cx 
       mov ah, 2 
  s2:mov dx, [si] 
      or dl, 30h 
      int 21h 
      mov dl, ' ' 
      int 21h ; 输出空格 
      add si, 2 
      loop s2 
      mov ah, 4ch 
      int 21h 
code ends 
end start

①由机器码得,跳转位移量的补码为F2,换算成十进制为-14,所以跳转位移量是-14。机器码E2是loop跳转命令,其下一条命令的偏移地址是1Bh,减14后就是后标号s1其后指令的偏移地址。

②由机器码得,跳转位移量的补码为F0,换算成十进制为-16,所以跳转位移量是-16。机器码E2是loop跳转命令,其下一条命令的偏移地址是39h,减14后就是后标号s2其后指令的偏移地址。

③反汇编截图:

 

 

2.实验任务2

源码:

assume cs:code, ds:data

data segment
     dw 200h, 0h, 230h, 0h 
data ends 

stack segment 
     db 16 dup(0) 
stack ends 

code segment 
start:
    mov ax, data 
    mov ds, ax 
    mov word ptr ds:[0], offset s1 
    mov word ptr ds:[2], offset s2 
    mov ds:[4], cs 
    mov ax, stack 
    mov ss, ax 
    mov sp, 16 
    call word ptr ds:[0] 
s1: pop ax 
    call dword ptr ds:[2] 
s2: pop bx 
    pop cx

    mov ah, 4ch 
    int 21h 
code ends 
end start

①(ax)=0021 h,(bx)=0026 h,(cx)=076C h

②调试后结果:

与分析结果一致。

 

3.实验任务3

实验源码:

assume cs:code, ds:data

data segment
    x db 99, 72, 85, 63, 89, 97, 55
    len equ $ - x
data ends

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

    mov si, offset x
    mov cx, len

s1:call printNumber
    call printSpace
    inc si
    loop s1 
    mov ah, 4ch
    int 21h


printNumber:
    mov ah, 0
    mov al, [si]
    mov bl, 10
    div bl
    mov bx, ax
    mov ah, 2
    mov dl, bl
    or dl, 30h
    int 21h

    mov ah, 2
    mov dl, bh
    or dl, 30h
    int 21h
    ret
    
printSpace:
    mov ah, 2
    mov  dl, ' '
    int 21h
    ret

code ends
end start

 

测试结果如下:

与预期测试结果相同。

 

4.实验任务4

实验源码:

assume cs:code, ds:data

data segment 
    str db 'try' 
    len equ $ - str 
data ends

code segment
start:
    mov ax, data
    mov ds, ax
    
    mov bl, 2
    mov bh, 0
    call printStr

    mov bl, 4    
    mov bh, 24
    call printStr

    mov ah, 4ch
    int 21h    

printStr:
    mov ax, 0b800h
    mov es, ax

    mov si, offset str
    mov cx, len  

    mov ax, 00a0h
    mul bh
    mov di, ax

s:  mov al, [si]
    mov es:[di], al
    mov es:[di+1], bl
    inc si
    add di, 2
    loop s    
    ret

code ends
end start

测试结果如下:

与预期测试结果相同。

 

5.实验任务5

实验源码:

assume cs:code, ds:data

data segment 
    stu_no db '201983290275'
    len = $ - stu_no
data ends

code segment
start:
    mov ax, data
    mov ds, ax
     
    mov ax, 0b800h    
    mov es, ax
    mov al, 24
    mov dl, 80
    mul dl
    mov cx, ax
    mov di, 0

s1:mov al, 17h           ;除最后一行页面设置蓝色
    mov es:[di], byte ptr 20h
    mov es:[di+1], al
    add di, 2
    loop s1
    
    mov ax, 00a0h
    mov bh, 24
    mul bh
    mov di, ax
    call printStr
    
    mov si, offset stu_no
    mov cx, len
    call printNum
    
    call printStr

    mov ah, 4ch
    int 21h

printStr:
    mov ax, 80
    sub ax, len
    mov bl, 2
    div bl
    mov ch, 0
    mov cl, al

s2:mov ah, 17h
    mov al, '-'
    mov es:[di], ax
    add di, 2
    loop s2
    ret
   
printNum:
s3:mov ah, 17h
    mov al, [si]
    mov es:[di], ax
    inc si
    add di, 2
    loop s3
    ret

code ends
end start

测试结果如下:

与预期测试结果相同。

 

6.实验结论

  通过本次实验,我初步学会了使用call跳转语句来调用一个子程序,在子程序中必须有一个ret来跳转回原来的程序。call执行时将现在的ip或cs与ip存入栈中。ret跳转到的就是从栈中取出的地址和偏移地址,出栈时先出的是偏移地址。

  关于len equ $ - x 中len为到x的长度,$指下一个数据项的偏移地址。

 

 

标签:code,编程,mov,si,指令,跳转,ax,data,ds
来源: https://www.cnblogs.com/meihundjinyichi/p/15620213.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有