实验3 转移指令跳转原理及其简单应用编程
实验3 转移指令跳转原理及其简单应用编程
试验任务1:
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
程序运行结果:
机器码:E2F2。跳转的位移量为-14,F2为补码,其原码为:10001110 ,对应的十进制为-14.
(cx)=(cx)-1,当cx不为0时,IP地址现在为Loop指令的后一条指令的地址076B:001B。IP地址加上位移量-14时,跳转到000D。
机器码:E2F0。跳转的位移量为-16,F0为补码,其原码为:10010000 ,对应的十进制为-16.
(cx)=(cx)-1,当cx不为0时,IP地址现在为Loop指令的后一条指令的地址076B:0039。IP地址加上位移量-16时,跳转到0029。
实验任务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
ax中存放着s1代码段的地址中的段内偏移地址部分,即执行call word ptr ds:[0]时的ip寄存器中的数值
bx中存放着s2代码段的地址中的段内偏移地址部分,即执行call dword ptr ds:[2]时的ip寄存器中的数值
cx中存放着s2代码段的地址中的段地址部分,即执行call dword ptr ds:[2]时的cs寄存其中的数值
ax=0021 bx=0026 cx =076c
实验任务3:
assume ds:data, cs:code data segment x db 99, 72, 85, 63, 89, 97, 55 len equ $- x data ends code segment start: mov ax, datamov si, offset x mov cx, len s: mov ah, 0 mov al, [si] mov bl, 10 div bl or ah, 30h or al, 30h call printNumber call printSpace inc si loop s mov ax, 4c00h int 21h printNumber: mov bx, ax or bl, 30h or bh, 30h mov ah, 2 mov dl, bl int 21h mov dl, bh 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 si,offset str mov cx, len mov bl, 00000010B mov bp, 00 mov ax, 0B800H mov es, ax s1: call printStr loop s1 mov bl,00000100B mov bp,0F00H mov cx,len mov si,offset str s2: call printStr loop S2 mov ah, 4ch int 21h printStr: mov ax, ds:[si] mov es:[bp],ax inc bp inc si mov es:[bp],bl inc bp ret code ends end start
实验任务5:
assume cs:code, ds:data data segment stu db '----------------------------------201983290422----------------------------------' len = $ - stu data ends code segment start: mov ax, data mov ds, ax mov ax, 0b800h mov es, ax mov si, offset stu mov ah, 00010111B mov cx, 0f00h mov al, ' ' mov di, 0 s2:call s1 loop s2 mov di, 0f00h mov cx, len s:mov al, [si] call s1 inc si loop s mov ah, 4ch int 21h s1:mov es:[di], al inc di mov es:[di], ah inc di ret code ends end start