ICode9

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

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

2021-11-28 22:32:54  阅读:85  来源: 互联网

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


------------恢复内容开始------------

任务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

 1)

 跳转的位移量为14-28=-14

(IP)=(IP)+位移量

28h+(-14)=14 cs:14指向s1

2)

 

 跳转的位移量为41-57=-16

(IP)=(IP)+位移量

57h+(-16)=41 cs:41指向s2

 

任务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 BX=0026 CX=076E

  

 任务3

 

 

 

 

 

 

任务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 cx,len
   mov si,offset str
   mov bh,0
   mov bl,2
   call printStr
     
   mov si,offset str
   mov bh,24
   mov bl,4
   call printStr   
   mov ah,4ch
   int 21h
printStr:
mov cx,len   
   mov al,0ah
   mul bh
   add ax,0b800h
   mov es,ax
   mov di,si         
s: mov al,ds:[si]
   mov ah,bl
   mov es:[di],ax
   inc si
   add di,2
   loop s
   ret
code ends
end start

 

 任务5

assume cs:code, ds:data

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

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

    call printID
    
    mov ah, 4ch
    int 21h

printID:
    mov ax, 0b800h
    mov es, ax
    mov si, 1

    mov al, 24
    mov dl, 80
    mul dl
    
    mov cx, ax
    printBlue:
        mov al, 17h    ;00010111
        mov es:[si], al    ;填充颜色
        add si, 2
    loop printBlue

    sub si, 1
    mov ax, 80
    sub ax, len
    mov dl, 2
    div dl
    mov dx, ax    ;保存-的长度

    mov cx, dx
    call print1    ;输出前半部分-

    mov cx, len
 s:            ;输出学号
        mov al, ds:[di]
        mov ah, 17h
        mov word ptr es:[si], ax
        inc di
        add si, 2
    loop s

    mov cx, dx
    call print1    ;输出后半部分-

    ret
    
print1:
    mov al, '-'
    mov ah, 17h
    mov word ptr es:[si], ax
    add si, 2
    loop print1
    ret
     
code ends
end start

 

总结:

这次实验编程题偏多,暴露了自己编程水平稀烂的问题()

任务1是课上讲的,直接看s:的上一行就行

任务2中call指令执行时,先将当前ip入栈或者把cs和ip入栈,然后基于xx设置后转移后的ip或者cs和ip,开始跳转。

任务3中,两位数的个位和十位正好可以通过div后的商和余数来实现,填充空格可以用实验2里面现成的

任务4和5可以看看书P189附近还有https://www.bilibili.com/video/BV1mt411R7Xv?p=143

 

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

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

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

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

ICode9版权所有