实验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
- 回答问题
① 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
实验结果: