实验3 转移指令跳转原理及其简单应用编程
四、实验结论
1.实验任务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
运行截图:
-
回答问题①
位移量是-14。
loop
指令所在行的数据是E2F2
,其中E2
代表loop
指令,F2
代表位移量。F2
是十六进制补码形式,对应十进制原码是-14。loop
指令定义是当前IP+有符号偏移量=跳转地址
,当前IP
指向下一条指令的开始地址为001B
,所以跳转地址为000D
。 -
回答问题②
位移量是-16。分析同①类似。
-
回答问题③
2.实验任务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) = ? 附上调试结果界面截图。
(ax)=0021 (bx)=0026 (cx)=076C
word为短转移,把s1处的IP进栈,然后跳转到s1的地址。把s1处的IP值送入ax。
dword为远转移,把s2出的CS:IP值进栈,然后跳转到s2处。把s2的IP值送入bx,s2 的CS值送入 cx。
3.实验任务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 cx,len mov si,0 s: mov ah,0 mov al,[si] mov bx,offset printnumber call bx mov bx,offset printSpace call bx inc si loop s mov ah, 4ch int 21h printnumber: mov bl,10 div bl mov bx,ax mov ah,2 mov dl,bl or dl,30h int 21h mov dl,bh or dl,30h int 21h ret printSpace: mov ah,2 mov dl,' ' int 21h ret code ends end start
-
运行测试截图
4.实验任务4
-
task4.asm源码
assume cs:code, ds:data data segment str db 'try' len equ $ - str data ends code segment start: mov ax, data mov ds, ax mov ax,0B800H mov es,ax mov si,offset printStr mov ah,2 mov bx,0 call si mov si,offset printStr mov ah,4 mov bx,0F00H call si mov ah, 4ch int 21h printStr: mov cx,len mov si,0 s: mov al,[si] mov es:[bx+si],ax inc si inc bx loop s ret code ends end start
-
运行测试截图
5.实验任务5
-
task5.asm源码
assume cs:code, ds:data data segment stu_no db '20192308060' len = $ - stu_no data ends code segment start: mov ax, data mov ds, ax mov ax,0B800H mov es,ax mov cx,0780H mov ah,10H mov al,' ' mov bx,0 s: mov es:[bx],ax add bx,2 loop s mov cx,80 mov ah,17H mov al,'-' s1: mov es:[bx],ax add bx,2 loop s1 mov cx,len mov bx,0F44H mov si,0 s2: mov al,[si] mov es:[bx],ax inc si add bx,2 loop s2 mov ah, 4ch int 21h code ends end start
-
运行测试截图