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

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

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

 

assume cs:code,ds:data
data segment
x db 99,72,85,63,89,97,55
len equ $-x ; 符号常量, $指下一个数据项的偏移地址,这里是7
data ends
code segment
start:
mov ax,data
mov ds,ax
mov si,offset x ; 取符号x对应的偏移地址0 -> si
mov cx,len ;从符号x开始的连续字节数据项个数 -> cx
mov byte ptr ds:[10],10
s:
mov ah,0
mov al,ds:[si]
div byte ptr ds:[10]
call printNumber
call printSpace
inc si

loop s
mov ax,4c00h
int 21h
printNumber:mov bx,ax
or bl,30h
or bh,30h
mov ah,2
mov dl,bl
int 21h
mov dl,bh
int 21h

ret
printSpace:mov dl,' '
int 21h
ret
code ends
end start

 

 

 

 

 

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

更新:修复了使用插入代码时修改代码时导致代码消失的bug()

 

posted @ 2021-11-28 22:19  Hina005  阅读(76)  评论(2编辑  收藏  举报