201983290125汇编语言实验二

1.任务一

 

1-1

汇编并连接task1_1.asm

 

用g命令打断点,使程序执行至17行停止,查看寄存器的值

 

 (1)ds=076A;

          ss=076B;

          cs=076C;

(2)ds=X-0002;

         ss=X-0001;

 

1-2

 

 (1)ds=076A

          ss=076B;

          cs=076C;

(2)ds=X-0002;

         ss=X-0001;

 

1-3

 

(1)ds=076A

          ss=076C;

          cs=076E;

(2)ds=X-0004;

         ss=X-0002;

 

1-4

 

(1)ds=076C;

          ss=076E;

          cs=076A;

(2)ds=X+0002;

         ss=X+0004;

 

1-5

(1)如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为 (n+15)/16,即对N/16向上取整,因为段大小为16字节整数倍,不满的部分也要补足16字节。

(2)

只有1-4可以执行,原因如下:

start标号表示程序段的开始,end start表示程序段结束,start和end start必须成对出现,如果end start不存在,则忽略start标号,当作缺省处理。当程序开头即为程序入口时,可以缺省。

只有1-4的开头是代码段,所以只有1-4可以执行。

 

2.任务2

 代码如下:

assume cs:code
code segment
    
    mov ax,0b800h
    mov ds,ax
    mov bx,0f00h
    mov cx,80
p:
    mov ds:[bx],0403h
    inc bx
    inc bx
    loop p

    mov ah,4ch
    int 21h
code ends

 结果如下:

 

3.任务3

代码如下

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
mov ax,data2
mov es,ax
mov ax,data3
mov ss,ax
mov bx,0
mov cx,10
s:
mov ax,0
add ax,ds:[bx]
add ax,es:[bx]
mov ss:[bx],ax
inc bx
loop s

mov ax,4c00h
int 21h

code ends
end start

未进入代码段时的值

 

data1为076a:0000开始的10个单元,data2,data3分别从076b,076c开始,可以看到076c此时全为0

运行后,076c结果如下

 

 变成了data1+data2

 

4.任务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
    mov ax,data2
    mov ss,ax
    mov cx,8
    mov sp,16
    mov bx,0
s:
    mov ax,[bx]
    push ax
    inc bx
    inc bx
    loop s
    
    mov ah, 4ch
    int 21h
code ends
end start

 进入代码段前:

 

代码段运行完毕后

 

 

5.任务5

运行程序

 

 执行到25、27行之间

 

 line 19 作用

将data1中内存单元值与0dfh即16进制数df进行与运算,而df化成二进制为11011111,与运算将第6位原本的数字变成0,

大写字母ascii范围01000001~01011010,小写字母为01100001-01111010,所以将小写字母第6位的1变更成0,即可小写转大写,

而大写字母原本的0不变,所以第19行将所有字母变成大写。

 

改为db 5 dup(2)

结果如下:

 

 一个字符占一个字,即2字节,低位字节表示ascii吗,高位字节表示字符参数,高4位底色,第4位字符本身颜色。

 

6.任务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 cx,4
   mov bx,0
s:
   mov dx,cx
   mov cx,4
   mov si,0
p:
   mov al,ds:[bx+si]
   or al,00100000B
   mov ds:[bx+si],al
   inc si
   loop p
add bx,16
mov cx,dx
loop s
   mov ah, 4ch
   int 21h
code ends
end start

 

 

 

 

7.任务7

 

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(' ') )  ;
table ends

code segment
start:
    mov ax,data
    mov ds,ax
    mov ax,table
    mov es,ax
    mov bx,0
    mov si,0
    mov cx,5
p:
    mov ax,ds:[bx]
    mov es:[si],ax
    mov ax,ds:[bx+2]
    mov es:[si+2],ax
    add bx,4
    add si,16
    loop p
    mov bx,20
    mov cx,5
    mov si,5
s:
    mov ax,0
    mov es:[si+2],ax
    mov ax,ds:[bx]
    mov es:[si],ax
    add bx,2
    add si,16
    loop s
    mov bx,30
    mov cx,5
    mov si,10
q:
    mov ax,ds:[bx]
    mov es:[si],ax
    add bx,2
    add si,16
    loop q
    mov cx,5
    mov si,0
r:
    mov ax,es:[si+5]
    mov dx,es:[si+7]
    div word ptr es:[si+10]
    mov es:[si+13],ax
    add si,16
    loop r



    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(' ') )  ;
table ends

code segment
start:
    mov ax,data
    mov ds,ax
    mov ax,table
    mov es,ax
    mov bx,0
    mov si,0
    mov cx,5
p:
    mov ax,ds:[bx]
    mov es:[si],ax
    mov ax,ds:[bx+2]
    mov es:[si+2],ax
    add bx,4
    add si,16
    loop p
    mov bx,20
    mov cx,5
    mov si,5
s:
    mov ax,0
    mov es:[si+2],ax
    mov ax,ds:[bx]
    mov es:[si],ax
    add bx,2
    add si,16
    loop s
    mov bx,30
    mov cx,5
    mov si,10
q:
    mov ax,ds:[bx]
    mov es:[si],ax
    add bx,2
    add si,16
    loop q
    mov cx,5
    mov si,0
r:
    mov ax,es:[si+5]
    mov dx,es:[si+7]
    div word ptr es:[si+10]
    mov es:[si+13],ax
    add si,16
    loop r



    mov ah, 4ch
    int 21h
code ends
end start

 

 运行前后:

 

 

 

 

 实验总结:

1.通过本次实验,掌握了循环loop的用法。

2.了解了通过与、或运算改变字母大小写的方法

3.了解了字符在内存中的存储方式。

 

 

 

 

 

 

 

 

 

 

 

 

 

         

 

posted @ 2021-11-07 15:15  玉骢  阅读(139)  评论(3编辑  收藏  举报