实验3 多个段的汇编源程序编写与调试

Posted yingzi-yrr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实验3 多个段的汇编源程序编写与调试相关的知识,希望对你有一定的参考价值。

实验任务1

task1.asm

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

进行汇编链接。得到运行结果:

技术图片

 

 使用debug调试:

反汇编 u 0 3a

技术图片

 

 

技术图片

 

 

技术图片

 

 

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

db 5 dup(2)
--> 改成:
db 2,3,4,5,6

技术图片

 

 进行debug

技术图片

 

 

技术图片

 

 

技术图片

 

 

技术图片

 

 从理论上分析15-25行:实现五次循环,初始化数据段偏移地址为0,初始化辅助段的偏移地址为0f00。将数据段的nuist全部化成大写,并将它们存入辅助段中字的低位。将数据段的后面五个字节存入依次存入对应辅助段中字的高位。

根据实验结果猜测Line4中的数据存入辅助段中字的高位,决定了显示了的低位字节的颜色。

实验任务二

源代码:

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

s:    mov ah,0
    mov al,[si]
    add si,1
    mov bl,10
    div bl
    add al,48
    add ah,48
    mov dl,al
    mov dh,ah
    
    mov ah,2
    mov dl,dl
    int 21h
    mov ah,2
    mov dl,dh
    int 21h
    loop s

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

结果:

技术图片

 

 实验任务三

源代码:

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

技术图片

 

 1、CPU执行程序前,程序返回前,data段中的数据为多少?

      23 01 56 04 89 07 bc 0a ef 0d ed 0f ba 0c 87 09

技术图片

 

2、CPU执行程序,程序返回前,cs=076c    ,ss=076b   ,ds=076a   。

技术图片

 

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

实验任务四

源代码:

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

1、CPU执行程序前,程序返回前,data段中的数据为多少?

 23 01 56 04

技术图片

 

2、CPU执行程序,程序返回前,cs=076c    ,ss=076b   ,ds=076a   。

 技术图片

 

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

4、如果段中的数据占N个字节,则程序加载后,该段的实际占有空间为:(16)的INT[log16N]次方。

 实验任务五

源代码:

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

1、CPU执行程序前,程序返回前,data段中的数据为多少?

23 01 56 04

技术图片

 

 

2、CPU执行程序,程序返回前,cs=076a    ,ss=076e   ,ds=076d   。

技术图片

 

 

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

实验任务六

我认为(3)(即实验任务五)的程序仍能够正确执行,因为该程序段的程序入口start是在程序段开始位置,所以执行时仍是从入口位置开始执行。

实验任务七

源代码:

 

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,c1
    mov es,ax
    
    mov bx,0
    mov si,0
    mov cx,8
s:    mov ah,0
    mov al,[bx]
    add ax,[bx+16]
    mov es:[si],ax
    
    add si,1
    add bx,1
    loop s
    mov ax,4c00h
    int 21h
code ends
end start

 

 

 

结果检验:

技术图片

 

 技术图片

 

 实验任务八

源代码:

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 ax,b
    mov ss,ax
    mov sp,16
    
    mov cx,8
    mov bx,0
s:    push [bx]
    add bx,2
    loop s
    
    mov ax,4c00h
    int 21h
code ends
end start

结果检验:

技术图片

 

 

 

 

以上是关于实验3 多个段的汇编源程序编写与调试的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

[汇编语言]实验五:编写,调试具有多个段的程序

汇编实验五 编写调试具有多个段的程序

实验 5 编写调试具有多个段的程序