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

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

试验任务1:

assume cs:code, ds:data

data segment
    x db 1, 9, 3
    len1 equ $ - x

    y dw 1, 9, 3
    len2 equ $ - y
data ends

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

    mov si, offset x
    mov cx, len1
    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
    mov cx, len2/2
    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

程序运行结果:

 

机器码:E2F2。跳转的位移量为-14,F2为补码,其原码为:10001110 ,对应的十进制为-14.

(cx)=(cx)-1,当cx不为0时,IP地址现在为Loop指令的后一条指令的地址076B:001B。IP地址加上位移量-14时,跳转到000D。

 机器码:E2F0。跳转的位移量为-16,F0为补码,其原码为:10010000 ,对应的十进制为-16.

(cx)=(cx)-1,当cx不为0时,IP地址现在为Loop指令的后一条指令的地址076B:0039。IP地址加上位移量-16时,跳转到0029。

实验任务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中存放着s1代码段的地址中的段内偏移地址部分,即执行call word ptr ds:[0]时的ip寄存器中的数值

bx中存放着s2代码段的地址中的段内偏移地址部分,即执行call dword ptr ds:[2]时的ip寄存器中的数值

cx中存放着s2代码段的地址中的段地址部分,即执行call dword ptr ds:[2]时的cs寄存其中的数值

 

 

 ax=0021 bx=0026 cx =076c 

实验任务3:

assume ds:data, cs:code
data segment
    x db 99, 72, 85, 63, 89, 97, 55
    len equ $- x
data ends

code segment
start:
mov ax, datamov si, offset x
mov cx, len

s:
mov ah, 0
mov al, [si]
mov bl, 10
div bl
or ah, 30h
or al, 30h
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 ah, 2
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 si,offset str
    mov cx, len
    mov bl, 00000010B
    mov bp, 00 
    mov ax, 0B800H     
    mov es, ax

s1: call printStr
    loop s1

    mov bl,00000100B    
    mov bp,0F00H         
    mov cx,len          
    mov si,offset str

s2: call printStr
    loop S2

    mov ah, 4ch
    int 21h


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

    ret


code ends
end start

 

 实验任务5:

assume cs:code, ds:data
data segment
    stu db '----------------------------------201983290422----------------------------------'
    len = $ - stu
data ends
 
code segment
start:
    mov ax, data
    mov ds, ax
    mov ax, 0b800h
    mov es, ax
    mov si, offset stu
 
    mov ah, 00010111B
    mov cx, 0f00h
    mov al, ' '
    mov di, 0
    
s2:call s1
    loop s2
 
    mov di, 0f00h
    mov cx, len
 
  s:mov al, [si]
    call s1
    inc si
    loop s
 
    mov ah, 4ch
    int 21h
 
s1:mov es:[di], al
    inc di
    mov es:[di], ah
    inc di
    ret
 
code ends
end start

 

 

posted @ 2021-12-02 23:08  Mint-like  阅读(106)  评论(2编辑  收藏  举报