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
- 实验结果:

or 30h是为了转换为ASCII码输出。30h是ASCII中′0′的编号,其二进制形式为:00110000,所以or上一个30h表示输出从'0'开始偏移量为1 9 3的数字。
$是预定义符号,表示当前的偏移地址,使用jmp $,可以进入死循环。
- 问题一:

loop s1指令的机器码是E2F2,其中F2就是转移的位移量的补码形式,二进制形式为11110010,转化为原码的二进制形式为10001110,十进制表示为-14,所以其位移量就是-14。在执行汇编指令loop s1时,ip是0019H,同时ip+2,此时ip是001BH,加上位移量-14后,其ip为000D。

- 问题二:

loop s2指令的机器码是E2F0,其中F0就是转移的位移量的补码形式,二进制形式为11110000,转化为原码的二进制形式为10010000,十进制表示为-16,所以其位移量就是-16。在执行汇编指令loop s2时,ip是0037H,同时ip+2,此时ip是0039H,加上位移量-16后,其ip为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
- 问题一:
(ax) = offset s1
(bx) = offset s2
(cx) = cs
- 问题二:
- ax:

call word ptr ds:[0]:将s1代码段的起始地址ip压入栈中,即将IP=0021H压入栈中。
随后指令跳转到ds:[0]存放的地址,即s1代码段,执行pop ax出栈操作,将栈中的0021H赋值给ax。所以ax的值就是s1的起始地址。
- bx:

call dword ptr ds:[2]:将s2代码段的cs地址和起始地址ip压入栈中,即将CS=076CH和IP=0026H压入栈中。
随后指令跳转到ds:[2]存放的地址,即s2代码段,执行pop bx出栈操作,将栈中后入栈的0026H赋值给bx。所以bx的值就是s2的起始地址。
- cx:

执行pop cx出栈操作,将栈中先入栈的076CH赋值给cx。所以cx的值就是s2代码段的cs值。
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 bx,0
mov byte ptr ds:[len],10
s: mov ax,0
mov al,ds:[bx]
call printNumber
call printSpace
inc bx
loop s
mov ah,4ch
int 21h
printNumber:
div byte ptr ds:[len]
mov dx,ax
or dl,30h
mov ah,2
int 21h
mov dl,dh
or dl,30h
mov ah,2
int 21h
ret
printSpace:
mov dl,' '
mov ah,2
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,0
mov cx,len
mov bl,00000010b
mov bh,0
call printStr
mov si,0
mov cx,len
mov bl,00000100b
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
- 运行结果:

5.实验任务五
assume cs:code, ds:data
data segment
stu_no db '201983290184'
len = $ - stu_no
len1 = (80-len)/2
data ends
code segment
start:
mov ax,data
mov ds,ax
mov bl,00010000b
call printColor
mov si,0
mov bl,00010111b
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
- 运行结果:
