实验三
实验任务一:
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

① line27, 汇编指令 loop s1 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机 器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明 是如何计算得到跳转后标号s1其后指令的偏移地址的。
位移量为-14,从当前位置0019到000D,同时000D也需要跳过,再减去2,那么位移量就是-14;cpu通过指令机器码获得转移的位移,通过当前指令位移减去机器码中的位移得到跳转后的偏移地址。F2为-14的补码,那么位移量就是-14.

② line44,汇编指令 loop s2 跳转时,是根据位移量跳转的。通过debug反汇编,查看其机 器码,分析其跳转的位移量是多少?(位移量数值以十进制数值回答)从CPU的角度,说明 是如何计算得到跳转后标号s2其后指令的偏移地址的。
位移量为-16,从当前位置0037到0029,同时跳过0029,再减去2,那么偏移量就是-12;cpu通过指令机器码获得转移的位移,通过当前指令位移减去机器码中的位移得到跳转后的偏移地址。F0为-16的补码,那么位移量就是-16.
试验任务二:
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指令的跳转原理,先从理论上分析,程序执行到退出(line31)之前,寄存器(ax) = ? 寄存器(bx) = ? 寄存器(cx) = ?
执行call word ptr ds:[0]时,将指令s1的偏移地址放入栈中,然后跳转到s1执行,将栈顶s1偏移地址赋值给ax,sp+2,同理bx,ds:[4]中存储的是cs,pop cx时,sp为sp+4,所以cx赋值为cs。
ax=s1,bx=s2,cx=cs
② 对源程序进行汇编、链接,得到可执行程序task2.exe。使用debug调试,观察、验证调试 结果与理论分析结果是否一致?

观察可得,实验结果与分析完全一致。
试验任务三:
assume cs:code, ds:data data segment x db 99, 72, 85, 63, 89, 97, 55 len equ $- x ;len为x的长度 data ends code segment start: mov ax, data mov ds, ax mov si, 0 mov bl, 10 mov cx, len s: mov ah, 0 mov al, [si] call printNumber call printSpace inc si loop s mov ah, 4ch int 21h printNumber: div bl mov dl, al ;al为商,存在dl中 mov bh, ah ;ah为余数,存在bh中 or dl,30H ;输出十位dl mov ah,2 int 21h mov dl, bh ;输出个位bh or dl,30H mov ah,2 int 21h ret printSpace: mov ah, 2 mov dl, ' ' int 21h ret code ends end start

试验任务四
assume cs:code, ds:data
data segment
str db 'try'
len equ $ - str
data ends
stack segment
db 16 dup(0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,16
mov ax, data
mov ds, ax
mov ax, 0b800h ;显存的内存地址为b8000h~bFFFFh
mov es, ax
mov di, 0
mov cx, len
mov si, offset str
s1:
mov bl, 2 ;设定颜色为绿色
mov bh, 0 ;设置行
call printStr
loop s1
mov cx, len
mov si, offset str
mov bh, 24 ;设置行
mov al, 0a0h ;每行的字节数为160(8每行0列)
mov ah, 0
mul bh
mov di, ax ;设置位置
s2:
mov bl, 4 ;设定颜色为红色
call printStr
loop s2
mov ah, 4ch
int 21h
printStr:
mov ah, bl ;ah存颜色
mov al, [si] ;al存显示的内容
mov es:[di], ax ;es:[di]是指定输出位置
add di, 2
inc si
ret
code ends
end start

试验任务五
assume cs:code, ds:data
data segment
stu_no db '201983290147'
len = $ - stu_no
data ends
stack segment
dw 0,0,0,0,0,0,0,0,0 ;定义一个段,用来做栈段,容量为16个字节
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,16
mov ax, data
mov ds, ax
mov ax, 0b800h
mov es, ax
;第一层循环
mov di, 0
mov cx, 24
s1:
push cx ;将外层循环的cx压栈
mov cx, 80 ;将cx设置成内层循环的次数
s2:
mov ax, 1720h
mov es:[di], ax
add di, 2
loop s2
mov di, 0
pop cx ;从栈顶将cx的值进行恢复
mov ax, es
add ax, 0ah
mov es, ax
loop s1
;第二层循环
mov di, 0
mov cx, 30
s3:
mov ax, 172dh
mov es:[di], ax
add di, 2
loop s3
;第三层循环
mov di, 003ch ;设置学号起始位置
mov si, offset stu_no
mov cx, len
s4:
mov ah, 017h ;ah存颜色
mov al, [si] ;al存显示的内容
mov es:[di], ax ;es:[di]是指定输出位置
inc si
add di, 2
loop s4
;第四层循环
mov cx, 38
s5:
mov ax, 172dh
mov es:[di], ax
add di, 2
loop s5
mov ah, 4ch
int 21h
code ends
end start

浙公网安备 33010602011771号