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

1.实验任务1

实验结果:

问题:

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

答:当前IP指向下一条指令开始地址,为001B,十进制表示:27。根据公式:27 + (-14) = 13,13的十六进制表示为:D,跳转地址即000D。

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

答:当前IP为0039,十进制表示:57。根据公式:57 + (-16) = 41,41的十六进制表示为:29,跳转地址即0029。

反汇编:

 

 2、实验任务2

问题:

1、根据call指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,寄存器(ax) = ? 寄存器 (bx) = ? 寄存器(cx) = ?

答:ax=0021h,bx=0026h,cx=076Ch 。

2、对源程序进行汇编、链接,得到可执行程序task2.exe。使用debug调试,观察、验证调试结果与理论 分析结果是否一致。

答:对源程序进行汇编、链接并使用debug调试后得到的结果截图如下,与分析结果一致。

 3、实验任务3

实验代码:

assume ds:data, cs:code, ss:stack

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

stack segment
    dw 16 dup(?)
stack ends

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

    mov ax, stack
    mov ss, ax
    mov sp, 32

    mov cx, len
    print:
        mov ah, 0
        mov al, byte ptr ds:[di]
        inc di

        push cx

        call printNumber
        call printSpace

        pop cx
    loop print

    mov ah, 4ch
    int 21h

printNumber:
    mov bx, 0
    getEach:
        mov dl, 10
        div dl

        push ax
        inc bx

        mov ah, 0
        mov cx, ax
        inc cx

    loop getEach

    mov cx, bx 
    printEach:
        pop ax
        add ah, 30h
        mov dl, ah
        mov ah, 2
        int 21h
    loop printEach

    ret

printSpace:
    mov ah, 2
    mov dl, 20h
    int 21h
    ret

code ends
end start

 

实验结果:

 4、实验任务4

实验代码:

assume cs:code, ds:data
data segment
    str db 'try', 0
data ends

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

    mov si, offset str
    mov al, 2
    call printStr

    mov ah, 4ch
    int 21h

printStr:
    push bx
    push cx
    push si
    push di

    mov bx, 0b800H
    mov es, bx
    mov di, 0
s:      mov cl, [si]
    mov ch, 0
    jcxz over
    mov ch, al
    mov es:[di], cx
    inc si
    add di, 2
    jmp s

over:   pop di
    pop si
    pop cx
    pop bx
    ret

code ends
end start

 实验结果:

 5、实验任务5

实验代码:

assume cs:code, ds:data

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

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

    call printStuNum

    mov ah, 4ch
    int 21h

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

    mov al, 24
    mov dl, 80
    mul dl

    mov cx, ax
    printBlue:
        mov al, 17h
        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 printSeparator

    ; 打印学号字符串
    mov cx, len
    printNumber:
        mov al, ds:[di]
        mov ah, 17h
        mov word ptr es:[si], ax
        inc di
        add si, 2
    loop printNumber

    mov cx, dx
    call printSeparator

    ret

printSeparator:
    mov al, '-'
    mov ah, 17h
    mov word ptr es:[si], ax
    add si, 2
    loop printSeparator
    ret

code ends
end start

实验结果:

 

posted @ 2021-11-29 20:12  LBJHG  阅读(21)  评论(3编辑  收藏  举报