汇编语言实验三

汇编语言实验三

一、实验目的

1. 理解和掌握将数据、代码、栈放入不同逻辑段的程序的编写和调试
2. 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式
3. 掌握大小写字符的转换方法、数字字符和数值之间的转换方法
4. 理解并掌握各种寻址方式的灵活应用
5. 掌握汇编指令loop, and, or,div, mul的用法

 

二、实验准备

复习教材chapter 6-8章。

 

三、实验内容

1.实验任务1

task1.asm;

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

 

使用masm、link对task1.asm进行汇编、链接,得到可执行文件task1.exe,运行并观察结果。

 

 

使用g命令跳转到循环结束

 

 

修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果

 

 

 

 

 可以看出这里的line4的数值作用是控制显示颜色的。

 

2.实验任务2

task2.asm;

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 di,0
    mov cx,5

s:    mov ah,0
    mov al,ds:[di]
    mov bl,10
    div bl
    mov ds:[10+di],al
    mov ds:[11+di],ah

    mov ah,2
    mov dl,ds:[10+di]
    add dl,30h
    int 21h

    mov ah,2
    mov dl,ds:[11+di]
    add dl,30h
    int 21h

    mov ah,2
    mov dl," "
    int 21h
    
    inc di
    loop s

    mov ax,4c00h
    int 21h
code ends
end start

 

运行结果

 

 

 

 

 3.实验任务3

task3.asm;

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

对task3.asm进行汇编、链接并执行程序

 

 

 反汇编的结果

 

 

 执行到程序退出前,查看data段数据

 

 

 (1)data段数据为:0123H 0456H 0789H 0ABCH 0DEFH 0FEDH 0CBAH 0987H

   (2)程序返回前,cs=076C、ss=076B、ds=076A

   (3)设程序加载后,code段的段地址为x,则data段的段地址为x-2,stack段的段地址为x-1

 

4.实验任务4

task4.asm;

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

汇编、链接并执行程序

 

 

 进行反汇编,并运行到程序返回前,用d命令查看data段中的数据

 

(1)data段中的数据为:0123H 0456H 

(2)cs=076C、ss=076B、ds=076A

(3)设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1

(4)对于如下定义的段:

name segment

...

name ends

如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为16字节。

 

5.实验任务5

task5.asm;

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

汇编、链接并执行程序

 

 

 反汇编,运行到程序返回前,用d命令查看data段中的数据

(1)data段中的数据为:0123H 0456H 

(2)cpu执行程序,程序返回前,cs=076A,ss=076E,ds=076D

(3)设程序加载后,code段的段地址为X,则data段的段地址为X+3, stack段的段地址为X+4

 

6.实验任务6

如果将(1)、(2)、(3)题中最后一条伪指令"end start"改为"end"(也就是说不指名程序的入口),则那个程序仍然可以正确执行?请说明原因。

 

第(3)题的程序可以正确执行,因为如果不指定入口,则会按照顺序执行,第(1)、(2)题的数据段都放在了代码段的前面,数据段会被当成指令进行编译,可能出现错误,但第(3)题数据段位于代码段的后面不影响。

 

7.实验任务7

task7.asm

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

c segment
    db 0,0,0,0,0,0,0,0    
c ends

code segment

start:     mov ax,a        
        mov ds,ax       
        
        mov ax,c       
        mov es,ax      
        
        mov ax,0        
        mov bx,0
        mov cx,8
        
    s:    mov al,ds:[bx]   
        add ax,ax        
        mov es:[bx],al    
        inc bx
        loop s
        
        mov ax,4c00h
        int 21h
        
code ends
end start

 

 

 

 

 

 

 编译完后使用d命令查看,可以看出a,b段相加给c段。

 

8.实验任务8

task8.asm

assume cs:code,ds:a,ss:b
 
    a segment
        dw 1,2,3,4,5,6,7,8,9,0ah,0ch,0dh,0eh,0fh,0ffh
    a ends
 
    b segment
        dw 0,0,0,0,0,0,0,0
    b ends
 
    code segment
    start:
        
        mov ax,b
        mov ss,ax
        mov sp,10h    
        
        
        mov ax,a
        mov ds,ax
        mov bx,0
        
        mov cx,8
        
        s:
            push [bx]
            add bx,2
        loop s
        
        mov ax,4c00h
        int 21h
    code ends
 
end start

 

 

 

 

 

 

 

 成功将a段中的前8个字型数据,逆序存储到b段中。

 

posted on 2020-11-26 19:37  飞羽0-0  阅读(224)  评论(1)    收藏  举报