Java教程

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

本文主要是介绍实验3 转移指令跳转原理及其简单应用编程,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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

task1

使用任何一款文本编辑器,录入8086汇编程序源码task1.asm。
task1.asm

点击查看代码
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 
对源程序进行汇编、链接,得到可执行程序task1.exe,运行后,结合运行结果和注释,及必要的debug 调试: 1. 理解运算符offset、伪指令equ、预定义符号$的灵活使用。 通过line5、line8,以及数据项的数据属性(字节、字、双字,等),可以方便计算出连续数据项 的个数,而无需人工计数。 注*: 符号常量len1, len2不占用数据段内存空间 运行结果:

  1. 回答问题
    ① line27, 汇编指令 loop s1 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得到跳转后标号s1其后指令的偏移地址的
    答:跳转的位移量为14byte,
    如图:1B+[(F2)补]原=27-14=0DH

② line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明是如何计算得到跳转后标号s2其后指令的偏移地址的。
答:跳转了16byte
如图:39+[(F0)补]原=57-16=29H

③ 附上上述分析时,在debug中进行调试观察的反汇编截图
如上截图

task3

使用任何一款文本编辑器,录入8086汇编程序源码task2.asm。
task3.asm

点击查看代码
DATAS SEGMENT
    ;此处输入数据段代码  
DATAS ENDS
data segment
    x db 99, 72, 85, 63, 89, 97, 55
    len equ $ - x
data ends
STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
        mov ax,data
        mov ds,ax
        mov cx,len    
        mov si,0
         

s:
        mov ah,0
        mov al,ds:[si]       
        call printNumber
        call printSpace
        inc si
        loop s

        mov ah,4ch
        int 21h

printNumber:
        mov bl,10  ;二进制除十,余数为个位数,商为十位数
        div bl     ;ah为余数,al为商 (ah,al分别为ax高8bit低8bit
        mov bx,ax  ;将数传给bx以便修改ax使用int 21h

        mov ah,2

        mov dl,bl      
        or dl,30h
        int 21h

        mov dl,bh      
        or  dl,30h ;数字转ASCALL码
        int 21h
        ret

printSpace:
          mov ah,2
          mov dl,' '
          int 21h
          ret
CODES ENDS
    END START

运行截图:

task4

实验代码:

点击查看代码
DATAS SEGMENT
    ;此处输入数据段代码  
DATAS ENDS
data segment
    x db 'try' 
    len equ $ - str
    
data ends

STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    mov ax, data
    mov ds, ax
    mov ax,0b800h
    mov es,ax

    mov si,offset x
    mov bl,     2    ;指定字符串颜色为黑底绿字
    mov bh,    0    ;指定行为第一行

    call printStr

    mov si,offset x
    mov bl,   4       ; 指定字符串颜色为黑底红字
    mov bh, 24      ;指定行为最后一行

    call printStr

    mov ah, 4ch
    int 21h
    
printStr:
    mov al, 160
    mul bh

    mov cx,len
    mov di, ax
s:
    mov ah, ds:[si]
    mov es:[di], ah
    inc di
    mov es:[di], bl
    inc si
    inc di
    loop s
    ret

CODES ENDS
    END START

运行结果:

task5

实验代码:

点击查看代码
DATAS SEGMENT
    ;此处输入数据段代码  
DATAS ENDS
data segment
    stu_no db '2019832900'
    len = $ - stu_no
data ends
STACKS SEGMENT
    ;此处输入堆栈段代码
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
      mov ax,data
    mov ds,ax
    mov ax,0b800h
    mov es,ax
    call p1 ;设置背景

    mov bh,24 ;设置行数为最后一行
    mov al,160
    mul bh
    mov bx,ax
    call p2 ;输出折线
    call p3	;输出学号
    call p2	;输出折现

    mov ax,4c00h
    int 21h

p2:
    mov al,'-'
    mov dl,17h;’-‘的颜色
    mov cx,33;一边画33个‘-’
    s:
    mov es:[bx],al
    inc bx
    mov es:[bx],dl
    inc bx
    loop s
ret


p1:
    mov si,1
    mov bl,17h;设置颜色
    mov cx,7d0h ;共设置2000个w,4000个byte(160*25)
    s2:
    mov es:[si],bl
    add si,2
    loop s2
ret

p3:
    mov si,0 ;str'学号'的偏移地址
    mov dl,17h;颜色
    mov cx,len;长度
    s1:
    mov al,ds:[si]
    mov es:[bx],al
    inc bx
    mov es:[bx],dl
    inc bx
    inc si
    loop s1
ret

CODES ENDS
    END START

实验结果:

这篇关于实验3 转移指令跳转原理及其简单应用编程的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!