实验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

 

 

 

 

 

 

posted @ 2021-11-09 11:48  卜文bobo  阅读(79)  评论(2)    收藏  举报