实验三 转移指令跳转原理及其简单应用编程
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
实验结果:

浙公网安备 33010602011771号