实验2 多个逻辑段的汇编源程序编写与调试
任务1-1


在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A___, 寄存器(SS) =_076B_, 寄存器(CS) = 076C
假设程序加载后,code段的段地址是X,则,data段的段地址是_X-2H_, stack的段地址是_X-1H_
任务1-2



在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A___, 寄存器(SS) =_076B___, 寄存器(CS) = _076C___
假设程序加载后,code段的段地址是X,则,data段的段地址是_X-2H_, stack的段地址是_X-1H_
任务1.3


在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A___, 寄存器(SS) =_076C___, 寄存器(CS) = _076E___
假设程序加载后,code段的段地址是X,则,data段的段地址是X-4H_, stack的段地址是X-2H_
任务1.4


在debug中将执行到line9结束、line11之前,记录此时:寄存器(DS) = _076C___, 寄存器(SS) =_076E___, 寄存器(CS) = _076A___
假设程序加载后,code段的段地址是 X_,则,data段的段地址是_X+2H_, stack的段地址是X+4H_
任务1.5
实际分配给该段的内存空间大小是 (N+15)/16,取整-1,再乘以16.单位:Byte
只有Task1_4.asm可以正常运行
原因:1,2,3,会默认成为数据段的首地址。。end除了通知编译器程序结束外,还可以通知编译器程序的入口在什么地方。在程序4中我们用end指令指明了程序的入口在标号start处。
任务2
assume cs:code code segment start: mov ax,0b800h mov ds,ax ;ds寄存器获得了段地址 mov bx,0f00h ;偏移地址 mov cx,50h mov ax,0403h s: mov ds:[bx],ax add bx,2 loop s mov ah,4c00h int 21h code ends end start
在汇编语言程序中,数据不能以字母开头,再b800之前加0.


任务三
assume cs:code data1 segment db 50, 48, 50, 50, 0, 48, 49, 0, 48, 49 ; ten numbers data1 ends data2 segment db 0, 0, 0, 0, 47, 0, 0, 47, 0, 0 ; ten numbers data2 ends data3 segment db 16 dup(0) data3 ends code segment start: mov ax, data1 mov ds, ax ;ds指向data1 mov bx, 0 mov cx, 10 ;循环次数为10 s: mov ax, [bx] ;bx中存放的数据作为一个偏移地址ea,段地址sa默认在ds中。将sa:ea数据送入ax中。 add ax, [bx+16] mov [bx+32], ax inc bx loop s mov ah, 4c00h int 21h code ends end start



任务4
assume cs:code
data1 segment
dw 2, 0, 4, 9, 2, 0, 1, 9
data1 ends
data2 segment
dw 8 dup(?)
data2 ends
code segment
start:
mov ax, data1
mov ds, ax ;ds寄存器指向data1
mov ax, data2
mov es, ax ;es寄存器指向data2
mov ss, ax
mov sp, 32 ;设置栈顶为data1:32
mov bx, 0 ;bx为data的偏移量
mov cx, 8 ;循环8次
s1: push [bx]
add bx, 2
loop s1
mov bx,16
mov cx, 8 ;s2也循环8次
s2: pop [bx] ;将栈顶的数据送入data2:bx
add bx, 2 ;循环bx=bx+2
loop s2
mov ah, 4ch
int 21h
code ends
end start
push将一个寄存器中的数据入栈
pop出栈用一个寄存器接收数据


任务5
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


使用g命令一次性执行到程序返回前

源代码中line19的作用是?
进行相与运算,结果-32,即把大写字母转化为小写字母
把任意一个字符与二进制数11011111(十六进制DF)进行and,除了第六位之外所有位都保持不变,而第六位清零。及将所有字符转为大写。
and指令在两个操作数的对应位之间进行按位逻辑与操作
(ascii码)

8位色彩代码用来控制输出颜色
02H为黑底绿字。
任务6
assume cs:code, ds:data data segment db 'Pink Floyd ' db 'JOAN Baez ' db 'NEIL Young ' db 'Joan Lennon ' data ends code segment start: mov ax, data mov ds, ax mov bx, 0 mov cx, 4 ;循环4次 s: mov ax, [bx] or ax, 20h ;用or指令将大写转为小写,通过或操作,把第六位变成1 ,其他位不变。 mov [bx], ax add bx, 16 ;bx=bx+16 loop s mov ah, 4ch int 21h code ends end start


任务七
assume cs:code, ds:data, es:table data segment db '1975', '1976', '1977', '1978', '1979' ;字节 dw 16, 22, 382, 1356, 2390 ;字 dw 3, 7, 9, 13, 28 data ends table segment db 5 dup( 16 dup(' ') ) ;5*16的 table ends code segment start: mov ax, data mov ds, ax ;ds寄存器指向data mov ax, table mov es, ax mov bx, 0 ;偏移量初始设为0 mov bp, 0 mov cx, 5 ;years循环5次 years: mov ax, ds:[bx] mov es:[bp], ax mov ax, ds:[bx+2] mov es:[bp+2], ax add bx, 4 add bp, 10h loop years ;拷贝了年份 mov bp, 5 mov cx, 5 ;income循环5次 income: mov ax, ds:[bx] mov es:[bp], ax add bx, 2 add bp, 10h loop income ;拷贝了收入 mov cx, 5 ;people循环5次 mov bp, 10 people: mov ax, ds:[bx] mov es:[bp], ax add bx, 2 add bp, 10h loop people ;拷贝了人数 mov cx, 5 ;average循环5 次 mov bp, 5 average: mov ax, es:[bp] ;被除数 mov bl, es:[bp+5] div bl ;除法指令,bl存放除数 mov es:[bp+8], al add bp,10h loop average ;求平均收入的数值 mov ah, 4ch int 21h code ends end start






浙公网安备 33010602011771号