式武神

导航

汇编语言实验三

一、实验目的

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

二、实验准备

复习教材chapter 6-8章。

三、实验内容

1.实验任务1


assume cs:code, ds:data
data segment
        db 'Nuist'
        db 5 dup(2)
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,运行并观察结果。

使用debug工具对程序进行调试,执行到程序返回前,即line27之前,观察结果。

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

基于观察,分析、猜测这里的数值作用是什么?

这里的数值作用是更改字符的颜色。

 

2.实验任务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 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

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段中数据及反汇编调试的截图

①data段中的数据为:0123H 0456H 0789H 0ABCH 0DEFH 0FEDH 0CBAH 0987H

②cs=cs=076CH,ss=076BH,ds=076AH

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

 

4.实验任务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段中的数据为:0123H 0456H 

②cs=cs=076CH,ss=076BH,ds=076AH

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

④程序加载后,该段实际占有空间为N+16个字节

 

5.实验任务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段中的数据为:0123H 0456H 

②cs=cs=076AH,ss=076EH,ds=076DH

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

 

6.实验任务6

修改指令后运行截图

第三个程序可以正确执行,因为默认进入的就是code段,第一第二个程序都将data段和stack段放在code段的前面,而第三个程序将data段和stack段放在code段后面,所以只有第三个程序可以正确执行。

 

7.实验任务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 ds, ax
    mov ax, b
    mov es, ax
    mov cx, 8
    mov di, 0
s:    mov bx, [di]
    add bx, es:[di]
    push ds
    mov ax, c1
    mov ds, ax
    mov [di], bx
    pop ds
    inc di
    loop s
          
    mov ax, 4c00h
    int 21h
code ends
end start

 

8.实验任务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,a
    mov ds,ax
    mov di,0
    mov ax,b
    mov ss,ax
    mov sp,10h
    mov cx,8

s:  push [di]
    add di,2
    loop s

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

posted on 2020-11-22 21:19  式武神  阅读(156)  评论(3编辑  收藏  举报