实验3 转移指令跳转原理及其简单应用编程
实验一
实验源码
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
【运行截图】
【问题1】
F2是补码形式的偏移量,即11110010,其原码为10001101+1=10001110【补码->原码,负数时,后七位取反+1】,因此偏移量为-14,此时IP为001B,二进制为27,所以27-14=13,loop0D
【问题2】
F0为16进制的补码,11110000,原码为10001111+1=10010000,即为-16,IP=0039为3*16+9=57,57-16=41,所以loop 29.
实验二
【实验源码】
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 ;s1地址放入ds[0]
mov word ptr ds:[2], offset s2 ;s2地址放入ds[2] 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
用debug进行跟踪确认,“call 标号”是将该指令后的第一个字节偏移地址入栈,再转到标号处执行指令。
ax=s1的IP,bx=s2的IP,cx=s2的CS
实验三
【实验代码】
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 byte ptr ds:[len],10 mov cx,7 mov bx,0 s: mov al,ds:[bx] mov ah,0 inc bx call printNumber call printSpace loop s mov ah,4ch int 21h printNumber: div byte ptr ds:[len] mov dx,ax mov ah,2 or dl,30h int 21h mov ah,2 mov dl,dh or dl,30h int 21h ret printSpace: mov dl,' ' mov ah,2 int 21h ret code ends end start
【实验截图】
实验四
【实验代码】
assume cs:code, ds:data data segment string db 'try' len equ $ - string data ends code segment start: mov ax,data mov ds,ax mov si,0 mov cx,len mov bl,2 mov bh,0 call printStr mov si,0 mov cx,len mov bl,4 mov bh,24 call printStr mov ah,4ch int 21h printStr: mov ax,0b800h mov es,ax mov ax,0 mov al,bh mov dx,160 mul dx mov di,ax s: mov al,ds:[si] mov es:[di],al inc si inc di mov es:[di],bl inc di loop s ret code ends end start
【实验截图】
实验五
【实验代码】
assume cs:code, ds:data data segment stu_no db '201983290052' len = $ - stu_no len1 = (80-len)/2 data ends code segment start: mov ax,data mov ds,ax mov bl,16 call printColor mov si,0 mov bl,23 mov bh,24 call printStr mov ah,4ch int 21h printColor: mov ax,0b800h mov es,ax mov ax,0 mov al,25 mov dx,0 mov dx,80 mul dx mov cx,ax mov al,' ' mov di,0 s: mov es:[di],al inc di mov es:[di],bl inc di loop s ret printStr: mov ax,0b800h mov es,ax mov ax,0 mov al,bh mov dx,160 mul dx mov di,ax mov al,'-' mov cx,len1 s1: mov es:[di],al inc di mov es:[di],bl inc di loop s1 mov cx,len s2: mov al,ds:[si] mov es:[di],al inc si inc di mov es:[di],bl inc di loop s2 mov al,'-' mov cx,len1 s3: mov es:[di],al inc di mov es:[di],bl inc di loop s3 ret code ends end start
【实验截图】