汇编语言程序设计实验二:多个逻辑段的汇编源程序的编写与调试

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

实验任务1

  • 任务1-1

    • task1_1.asm源码:
    assume ds:data, cs:code, ss:stack
    
    data segment
      db 16 dup(0)
    data ends
    
    stack segment
      db 16 dup(0)
    stack ends
    code segment
    start:
      mov ax, data
      mov ds, ax
    
      mov ax, stack
      mov ss, ax
      mov sp, 16
    
      mov ah, 4ch
      int 21h
    code ends
    end start
    
    • 对task1_1.asm进行编译连接:

    • 调试到line17后,line19前

      问题回答:
      (1)此时DS=076A,SS=076B,CS=076C
      (2)假设程序加载后,code段的段地址是X,则,data段的段地址是X-2, stack的段地址是X-1

  • 任务1-2

    • task1_2.asm源码:
    assume ds:data, cs:code, ss:stack
    
    data segment
        db 4 dup(0)
     data ends
    
    stack segment
        db 8 dup(0)
    stack ends
    code segment
    start:
        mov ax, data
        mov ds, ax
    
        mov ax, stack
        mov ss, ax
        mov sp, 8
    
        mov ah, 4ch
        int 21h
    code ends
    end start
    
    • 对task1_2.asm进行编译连接

    • 调试到line17后,line19前

      问题回答:
      (1)此时DS=076A,SS=076B,CS=076C
      (2)假设程序加载后,code段的段地址是X,则,data段的段地址是X-2, stack的段地址是X-1

  • 任务1-3

    • task1_3.asm源码:
    assume ds:data, cs:code, ss:stack
    
    data segment
      db 20 dup(0)
    data ends
    
    stack segment
      db 20 dup(0)
    stack ends
     code segment
    start:
      mov ax, data
      mov ds, ax
    
      mov ax, stack
      mov ss, ax
      mov sp, 20
    
      mov ah, 4ch
      int 21h
    code ends
    end start
    
    • 对task1_3.asm进行编译连接

    • 调试到line17后,line19前

问题回答:
(1)此时DS=076A,SS=076C,CS=076E
(2)假设程序加载后,code段的段地址是X,则,data段的段地址是X-4, stack的段地址是X-2

  • 任务1-4

    • task1_4源码:
    assume ds:data, cs:code, ss:stack
    code segment
    start:
      mov ax, data
      mov ds, ax
    
      mov ax, stack
      mov ss, ax
      mov sp, 20
    
      mov ah, 4ch
      int 21h
    code ends
    
    data segment
      db 20 dup(0)
    data ends
    
    stack segment
      db 20 dup(0)
    stack ends
    end start
    
    • 对task1_4.asm进行编译连接

    • 调试到line17后,line19前

问题回答:
(1)此时DS=076C,SS=076E,CS=076A
(2)假设程序加载后,code段的段地址是X,则,data段的段地址是X+2, stack的段地址是X+4

  • 任务1-5

    对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是: ceil(N/16) x 16

    xxx segment
      db N dup(0)
    xxx ends
    

      如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成end , task1_4.asm仍然可以正确执行。因为task1_1.asm, task1_2.asm, task1_3.asm 以数据段开始,end start改为end,程序没有标出程序段结束位置,因此无法配对开始位置,识别不出是否为程序段,因此无法运行,而task1_4.asm以程序段开始,可以正常运行。

实验任务2

  • 源代码:
    assume cs:code
    
    code segment
    start:
      mov ax,0b800h
      mov ds,ax
      mov bx,0f00h
      mov cx,80
    
    s:  mov [bx],0403h
      add bx,2
      loop s
    
      mov ah, 4ch
      int 21h
    code ends
    end start
    
  • 运行结果截图:

实验任务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 bx,0
      mov cx,10
    
    s:  mov ax,data1
      mov ds,ax
      mov dl,[bx]
    
      mov ax,data2
      mov ds,ax
      add dl,[bx]
    
      mov ax,data3
      mov ds,ax
      mov [bx],dl
    
      inc bx
      loop s
    
      mov ah,4ch
      int 21h
      code ends
    end start
    
  • 在debug中加载、反汇编、调试截图

  • 相加之前逻辑段data1, data2, data3对应的内存空间原始值截图:

  • 相加之后逻辑段data1, data2, data3对应的内存空间原始值截图:

实验任务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,data2
        mov ss,ax
        mov sp,10h
        
        mov ax,data1
        mov ds,ax
        
        mov bx,0
        mov cx,8
    s:    push [bx]
        add bx,2
        loop s
    
        mov ah, 4ch
        int 21h
    code ends
    end start
    
  • 在debug中加载、反汇编、调试截图:

  • 在程序退出前,使用d命令查看数据段data2对应的内存空间的截图:

实验任务5

  • 源代码:

    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工具对程序进行调试,使用g命令一次性执行到程序返回前(即ine25执行之后、line27执行之前)的截图:

  • 源代码中line19的作用是:将小写字母转换为大写字母

  • 源代码中data段line4的字节数据的用途是:控制字体的颜色

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

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

    此处改成 db 5 dup(2)则为绿色“ NUIST ”,改为 db 5 dup(5)则为品红色“ NUIST ”结果截图如下:

实验任务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
    s:
     mov al,[bx]
     or al,20h
     mov [bx],al
     mov al,[bx + 1]
     or al,20h
     mov [bx + 1],al
     mov al,[bx + 2]
     or al,20h
     mov [bx +2],al
     mov al,[bx + 3]
     or al,20h
     mov [bx+3],al
     add bx,16
     loop s
    
     mov ah, 4ch
     int 21h
    code ends
    end start
    
  • 在debug中加载程序,反汇编,截图如下:

  • 执行到line13退出前,用d命令查看data段对应的内存空间,确认每行第一个单词已经由大写->小写,截图如下:

实验任务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 bp, 0
      mov cx, 5
    col1:
      mov ax, [bx]
      mov es:[bp], ax
      mov ax, [bx+2]
      mov es:[bp+2], ax
      add bx, 4
      add bp, 10h
      loop col1
    
      mov bp, 5
      mov cx, 5
    col2:
      mov ax, [bx]
      mov es:[bp], ax
      add bx, 2
      add bp, 10h
      loop col2
    
      mov cx, 5
      mov bp, 10
    col3:
      mov ax, [bx]
      mov es:[bp], ax
      add bx, 2
      add bp, 10h
      loop col3
    
      mov cx, 5
      mov bp, 5
    col4:
      mov ax, es:[bp]
      mov bl, es:[bp+5]
      div bl
      mov es:[bp+8], al
      add bp,10h
      loop col4
    
      mov ah, 4ch
      int 21h
    code ends
    end start
    
  • debug中加载、调试程序并查看table段原始数据截图:

  • 在debug中运行到程序退出之前,使用d命令查看table段对应的内存空间的截图,确认信息已经按要求结构化地写入到指定内存,截图如下:

实验总结

  • 基础知识是强机,掌握好基础知识后实验能够事半功倍
  • 要善于利用实验进行查漏并利用自我研究与网络工具书进行补缺
  • 及时的巩固总结能有效提升学习效果
posted @ 2021-11-12 00:06  诺晨HERE  阅读(35)  评论(3)    收藏  举报