实验3 转移指令跳转原理及其简单应用编程
实验任务1
给出程序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其后指令的偏移地址的。
转移地址 000D 13
执行loop指令后的ip 001B 27
位移量: 13 - 27 = -14;
回答问题②
② line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机
器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明
是如何计算得到跳转后标号s2其后指令的偏移地址的。
转移地址 0029 41
执行loop后的ip 0039 57
位移量: 41 - 57 = -16;
问题③
③ 附上上述分析时,在debug中进行调试观察的反汇编截图
实验任务2
给出程序task2.asm源码
点击查看代码
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) = ? (bx) = ? (cx) = ? 附上调试结果界面截图
① 根据call指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,寄存器(ax) =
0021 寄存器(bx) = 0026 寄存器(cx) = 076C
② 对源程序进行汇编、链接,得到可执行程序task2.exe。使用debug调试,观察、验证调试
结果与理论分析结果是否一致。
实验任务3
给出程序源码task3.asm
点击查看代码
assume cs:code, ds:data
data segment
x db 99, 72, 85, 63, 89, 97, 55
len equ $- x
data ends
code segment
start:
mov ax, data
mov ds, ax
mov si, offset x
mov cx, len
mov bl, 10
s:
mov ah, 0
mov al, [si]
call printNumber
call printSpace
inc si
loop s
mov ax, 4c00h
int 21h
printNumber:
div bl
mov dl, al
or dl, 30h
mov bh, ah
mov ah, 2
int 21h
mov dl, bh
or dl, 30h
int 21h
ret
printSpace:mov ah, 2
mov dl, 20h
int 21h
ret
code ends
end start
运行测试截图
实验任务4
给出程序源码task4.asm
点击查看代码
assume cs:code, ds:data, ss:stack
data segment
string db 'try'
len = $ - string
data ends
stack segment
dw 2 dup(?)
stack ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, stack
mov ss, ax
mov sp, 2
mov cx, len
mov ax, 0
mov si, ax
mov bl, 0Ah
mov bh, 0 ; bh: 行号(第1行)
call printStr
mov bl, 0Ch
mov bh, 24 ; bh: 行号(第25行)
call printStr
mov ah, 4ch
int 21h
printStr:
mov al, bh
mov dl, 0A0h
mul dl
mov di, ax
mov ax, 0b800h
mov es, ax
push si
push cx
startToPrint:
mov al, ds:[si]
mov es:[di], al
mov es:[di+1], bl
inc si
add di, 2
loop startToPrint
pop cx
pop si
ret
code ends
end start
运行测试截图
实验任务5
给出程序源码task5.asm
点击查看代码
assume cs:code, ds:data
data segment
stu_no db '201983290185'
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