实验2 汇编源程序编写与汇编调试

实验结论

实验任务1


;ex1.asm
assume cs:code
code segment
        mov ax, 0b810h
        mov ds, ax
        mov byte ptr ds:[0], 1
        mov byte ptr ds:[1], 1
        mov byte ptr ds:[2], 2
        mov byte ptr ds:[3], 2
        mov byte ptr ds:[4], 3
        mov byte ptr ds:[5], 3
        mov byte ptr ds:[6], 4
        mov byte ptr ds:[7], 4
        mov ah, 4ch
        int 21h
code ends
end
  • 对ex1.asm进行汇编、链接、运行
    汇编链接

分析ex1.asm可知,代码将1、1、2、2、3、3、4、4赋值给了0b810:0开始的8个连续内存单元,将在屏幕上输出图像,与运行结果一致


  • 使用r命令,得到CX=0031;因此使用u ds:0 30进行反汇编得到如下结果

反汇编

  • 使用d ds:0 L100即可查看段前缀PSP所占的256个字节
    PSP

由执行结果可知,段前缀PSP的内容大部分为无法显示的字符,在少数可显示字符中明显有着ex1.exe即该可执行程序的文件名字样

  • 根据反汇编结果,使用g命令执行到程序退出之前,即AH,4C之前

  • 使用命令g cs:2D
    g命令

使用g命令后,屏幕右上角出现了和直接执行文件时相同的图像


实验任务2

;ex2.asm
assume cs:code
code segment
        mov ax,0b810h
        mov ds,ax

        mov bx,0
        mov ax,101H
        mov cx,4
s:      mov [bx],ax
        add bx,2
        add ax,101H
        loop s
        mov ah,4ch
        int 21h
code ends
end
  • 直接执行:
    汇编链接

与实验一并无差别

  • 反汇编:
    反汇编

  • 调试:

    • 先使用g cs:e执行到进入循环之前

    • 使用t命令单步执行

    • 在执行LOOP 000E分别使用tp指令作对比
      调试
      调试
      调试

      LOOP 000E处:使用t指令时,下一步指令会跳转至000E处,循环执行
      p指令会运行至下一条指令
      t指令:逐语句调试p指令:逐过程调试

  • 将代码第九行mov cx,4改为mov cx,8

    • 重新汇编链接
      汇编链接
    • 使用debug,使用g命令执行到退出程序之前
      执行
      • 对比修改前后ax,bx变化可知,循环次数从4次变成了8次
        修改前 修改后
        ax 0505H 0909H
        bx 0008H 0010H
  • 同样是对连续的内存单元赋值,ex1.asm是人工重复赋值,而ex2.asm是使用循环结构使程序自动赋值,

  • 两者虽然执行结果和功能是一样的,但当需要改变的内存单元个数较多时,显然前者是不合适的


实验任务3

;ex3.asm
assume cs:code
code segment
        mov ax,0b800h
        mov ds,ax

        mov bx,07b8h
        mov cx,10H
s:      mov [bx],0437H
        add bx,2
        loop s
        mov ah,4ch
        int 21h
code ends
end

执行结果

  • 把填充的字数据从0237H改为0239H

执行结果

显示结果颜色不变,字符从7变成了9


  • 把填充的字数据从0237H改为0437H

执行结果

显示结果颜色变为了红色,字符不变

  • 据此分析,这个字数据中高位字节存放的颜色信息,低位字节存放的字符的ASCII码信息

实验任务4

;ex4.asm
assume cs:code
code segment
        mov ax,0
        mov ds,ax

        mov bx,200H
        mov dx,0H;
        mov cx,40H
s:      mov [bx],dx
        inc bx,1
        inc dx;
        loop s
        mov ah,4ch
        int 21h
code ends
end

使用d命令查看0:200~0:23F可得成功修改相应内存空间的值
结果


实验任务5

;ex3.asm
assume cs:code
code segment
        mov ax,cs
        mov ds,ax
        mov ax,0020h
        mov es,ax
        mov bx,0
        mov cx,18h
s:      mov al,[bx]
        mov es:[bx],al
        inc bx
        loop s
        mov ax,4c00h
        int 21h
code ends 0
end
  1. 题目要求将本程序复制到指定位置,那么就需要记录本程序的起始地址和程序长度
  2. 显然mov al,[bx];mov es:[bx],al即为复制语句,将 [bx]复制到es:[bx],因此ds对应的即为本程序的起始地址,es为目标地址,所以第一空填cs
  3. 第二空18h通过重复试验得到、
  • 使用debug的u指令进行反汇编
    反汇编

观察反汇编结果各语句的ip得:18即为语句mov ax,4c00hmov ax,cs的长度

  • 使用d 命令查看0:200开始的长度为1D的连续内存单元

    查看

发现程序以及成功复制到了0:200开始的内存单元,且LOOP语句处的跳转地址也成功自动改为了0210


实验总结

  1. 汇编程序的执行步骤:
    1. masm ex1.asm; 汇编
    2. link ex1.obj; 链接
    3. ex1 或 debug ex1.exe 执行/debug调试
  2. t命令:逐语句

    p命令:逐过程
  3. LOOP指令:标记位置s,cx为循环次数
posted @ 2020-11-01 17:05  PestLa  阅读(105)  评论(3)    收藏  举报