实验3 转移指令跳转原理及其简单应用编程
实验任务1
代码
assume cs:code, ds:data data segment x db 1, 9, 3 len1 equ $ - x ; 符号常量, $指下一个数据项的偏移地址,这个示例中,是3 y dw 1, 9, 3 len2 equ $ - y ; 符号常量, $指下一个数据项的偏移地址,这个示例中,是9 data ends code segment start: mov ax, data mov ds, ax mov si, offset x ; 取符号x对应的偏移地址0 -> si mov cx, len1 ; 从符号x开始的连续字节数据项个数 -> cx 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, offet y ; 取符号y对应的偏移地址3 -> si mov cx, len2/2 ; 从符号y开始的连续字数据项个数 -> cx 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
调试结果:
(1)位移量 补码F2=1111 0010,原码=1000 1110=-14
下一条指令地址001B=27, 跳转地址=27+(-14)=13=000Dh
(2)位移量 补码F0=1111 0000,原码=1001 0000=-16
下一条指令地址0039=57,跳转地址=57+(-16)=41=0029h
实验任务2
代码
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
(1)
ax=s1的IP
bx=s2的IP
cx=s2的CS
(2)调试结果与理论分析结果是一致的。
实验任务3
代码
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
代码
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,02h#属性颜色 mov bx,0#位移到第一行 call si mov si,offset printStr#第二次打印 mov ah,04h 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
代码
assume cs:code, ds:data data segment stu_no db '201983290241' 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
调试结果: