实验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)
跳转指令为E2F2
F2为补码
补码11110010
原码10001110
即为十进制的-14,十六进制的-E
IP位置为1B
1B-E=D
即为标号s1的位置
(2)
跳转指令为E2F0
F0为补码
补码11110000
原码10010000
即为十进制的-16,十六进制的-10
IP位置为39
39-10=29
即为标号s2的位置
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
分析
执行第一个call时将当时的IP压入栈,即offset s1,则ax为offset s1
执行第二个call时将当时的CS、IP依次压入栈,bx为IP,cx为CS,则bx为offset s2,cx为offset code
结果
执行后,ax与offset s1相等,bx与offset s2相等,cx与offset code相等,与分析一致
DATAS SEGMENT
x db 99, 72, 85, 63, 89, 97, 55
len equ $- x
DATAS ENDS
STACKS SEGMENT
db 16 dup(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
mov ax,stacks
mov ss,ax
mov sp,16
mov bx,0
mov cx,7
s1:
mov ah,0
mov al,ds:[bx]
call f1
call f2
inc bx
loop s1
MOV AH,4CH
INT 21H
f1:
mov dl,10
div dl;16b/8b,al 商,ah 余数
add al,48
add ah,48
mov dh,ah;ah有冲突
mov ah,2
mov dl,al
int 21h
mov ah,2
mov dl,dh
int 21h
ret
f2:
mov ah,2
mov dl,20h
int 21h
ret
CODES ENDS
END START
结果
DATAS SEGMENT x db 'try' len equ $ - x DATAS ENDS STACKS SEGMENT db 16 dup(0) STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX mov ax,stacks mov ss,ax mov sp,16 mov si,0 mov cx,len mov bl,0ah;颜色 0 000 1 010 mov bh,0;行 call printStr mov si,0 mov cx,len mov bl,0ch;0 000 1 100 mov bh,24;0-24 call printStr MOV AH,4CH INT 21H printStr: mov ah,0 mov al,bh mov dl,0a0h;160 mul dl;ax 积 ;显示位置 mov di,ax mov ax,0b800h mov es,ax s1: mov al,ds:[si] mov es:[di],al mov es:[di+1],bl inc si add di,2 loop s1 ret CODES ENDS END START
结果
DATAS SEGMENT stu_no db '201983290229' len = $ - stu_no DATAS ENDS STACKS SEGMENT db 16 dup(0) STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX mov ax,stacks mov ss,ax mov sp,16 ;前24行 mov ax, 0b800h mov es, ax mov si, 1;颜色 mov al, 24 mov dl, 80 mul dl;ax 积 mov cx, ax print0: mov al, 17h;0 001 0 111 mov es:[si], al add si, 2 loop print0 sub si, 1 ;最后一行 mov ax, 80 sub ax, len mov dl, 2 div dl;商 al mov dl, al;dl=(80-len)/2 分隔符长度 ;左 mov ch,0 mov cl,dl call printSeparator ;中 mov di,0;字符串开始 mov cx,len;字符串长度 mov bl,17h;颜色0 001 0 111 call printStr ;右 mov ch,0 mov cl,dl call printSeparator MOV AH,4CH INT 21H printStr: s1: mov al,ds:[di] mov es:[si],al mov es:[si+1],bl inc di add si,2 loop s1 ret printSeparator: mov al, '-' mov ah, 17h;0 001 0 111 mov word ptr es:[si], ax add si, 2 loop printSeparator ret CODES ENDS END START
结果