实验3 多个段的汇编源程序编写与调试
实验3 多个段的汇编源程序编写与调试
实验任务1
代码如下:
assume cs:code, ds:data
data segment
db 'Nuist'
db 2, 3, 4, 5, 6
data ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, 0b800H
mov es, ax
mov cx, 5
mov si, 0
mov di, 0f00h
s: mov al, [si]
and al, 0dfh
mov es:[di], al
mov al, [5+si]
mov es:[di+1], al
inc si
add di, 2
loop s
mov ah, 4ch
int 21h
code ends
end start
数字的作用是表示颜色,不同的数字下NUIST几个字母颜色不同
实验任务2
代码如下:
assume cs:code, ds:data
data segment
db 23, 50, 66, 71, 35
data ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, 0b800H
mov es, ax
mov cx, 5
mov si, 0
mov di, 0f00h
s: mov ah,0;
mov al, [si];
mov bl, 10;
div bl;
mov bh, ah;
mov bl,al;
add bh, 30h;
add bl, 30h;
mov ah,2;
mov dl,bl;
int 21h;
mov dl,bh;
int 21h;
mov dl, 32
int 21h
add si,1;
loop s;
mov ah, 4ch
int 21h
code ends
end start
运行截图如下:
实验任务3
代码如下:
assume cs:code, ds:data, ss:stack
data segment
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
data ends
stack segment
dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends
code segment
start: mov ax,stack
mov ss, ax
mov sp,16
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
end start
截图如下:
data中的数据没有变化
返回前cs=076C ss=076B ds=076A
程序加载后code段的地址为X,则data段的地址为:X-1,stack段的段地址为:X-2
实验任务4
代码如下:
assume cs:code, ds:data, ss:stack
data segment
dw 0123h, 0456h
data ends
stack segment
dw 0, 0
stack ends
code segment
start: mov ax,stack
mov ss, ax
mov sp,16
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
end start
截图如下:
data中的数据没有变化
程序返回前,cs=076C、ss=076B、ds=076A
code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1
该段实际占有的空间为([N/16]+1)*16
实验任务5
代码如下:
assume cs:code, ds:data, ss:stack
code segment
start: mov ax,stack
mov ss, ax
mov sp,16
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
data segment
dw 0123h, 0456h
data ends
stack segment
dw 0,0
stack ends
end start
运行截图如下:
data中的数据没有变化
程序返回前cs=076A,ss=076E,ds=076D
code段的段地址是X,则data段的段地址为X+3,stack段的段地址是X+4
实验任务6
只有task5.exe可以正确执行,因为没有规定开始的时候,默认从最开头开始运行,其他会把数据段当程序运行,只有task5.exe中程序段在开头,刚好运行程序。
实验任务7
代码如下:
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
c1 segment ;
db 8 dup(0)
c1 ends
code segment
start:
mov ax,a
mov es,ax
mov ax,c1
mov ds,ax
mov bx,0
mov cx,8
s1: mov ax,es:[bx]
add [bx],ax
add bx,2
loop s1
mov ax,b
mov es,ax
mov bx,0
mov cx,8
s2: mov ax,es:[bx]
add [bx],ax
add bx,2
loop s2
mov ax,4c00h
int 21h
code ends
end start
结果如下:
实验任务8
代码如下:
assume cs:code
a segment
dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
dw 8 dup(0)
b ends
code segment
start:
mov ax,b
mov ss,ax
mov sp,10h
mov ax,a
mov ds,ax
mov bx,0
s: push[bx]
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
结果如下: