ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【汇编语言实验五】编写、调试具有多个段的程序

2021-12-11 19:02:01  阅读:147  来源: 互联网

标签:code 汇编语言 mov ss ax 编写 data ds 调试


*任务(1)(2)(3)基本步骤相同,这里只列举出(1)的实验步骤

步骤一:把要使用的代码粘贴到masm文件夹中。

步骤二:编译、连接、用debug调试。

步骤三:用r命令查看各寄存器的值。

    cs是code的段地址,ds是data的段地址,ss是stack的段地址。这是因为代码前面的声明:   assume cs:code, ds:data, ss:stack

步骤四:用u命令反汇编,注意反汇编是code段,所以u命令后接的应该是cs。

步骤五:用g命令执行,根据反汇编得到的代码,执行到mov ax,4c00之前。这里g命令的使用是断点的使用。

步骤六:使用d命令查看data段的值。由于data的段地址是ds,所以从ds:0到ds:f查看16个字节。

*任务(2)(3)步骤大同小异,这里就不多列举了。


实验结果:

任务一:

任务二:

任务三:

任务四:

任务一修改:

任务二修改:

任务三修改:

结论:从反汇编可以看出,把end start改成end后,只有实验三可以正常运行。

分析:start提供程序的入口,使cs:ip 指向第一条要执行的指令。任务一和任务二的代码中,汇编指令代码段并不是在开头,所以cs:ip在默认的开头;任务三的汇编指令代码在开头,cs:ip刚好指向她。

关于任务二的第4小问:举ex5_1为例;其存储数据的段地址是ds。

①ex5_1源代码:

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

经过编译连接运行后,使用r命令查看,ds=075a , ss=076b , cs=076c,这意味着给data段落分配了10h,即16字节的空间。

②ex5_1_2源代码(data段落的字节给了17个字节的数据):     (此步骤也可以使用任务三的各个寄存器的值)

assume cs:code, ds:data, ss:stack
data segment
  dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h,0123h
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

经过编译连接运行后,使用r命令查看,ds=075a , ss=076c , cs=076d,这意味着给data段落分配了20h,即32字节的空间。

结论:由此看来,储存的数据不足16字节,给他分配16字节的空间;储存的数据多于16字节的整数倍,则会给多余的、不满16字节的数据分配一整的16字节的空间。

答案:(N/16+1)*16

另外,在修改程序的过程中,如果把英文字符写成中文字符,例如:把  ”,“ 写成 ”,“,会出现如下错误


任务五:

源代码:

assume cs:code, ds:a, es:b, ss:c
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 8 dup(0)
c ends      

code segment
start:
mov ax,a
      mov ds,ax      mov ax,b
      mov es,ax
      mov ax,c
      mov ss,ax      mov cx,8       mov bx,0
 s: mov al, ds:[bx]
    add al, es:[bx]
    mov ss:[bx],al
    inc bx
    loop s

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


①编译、连接

②debug执行,d命令查看c段

③u命令反汇编,g命令执行

④d命令查看c段


任务六:

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

①编译、连接

②d命令查看执行前ss段

③debug执行,r命令查看各寄存器初始值,u命令反汇编,g命令断点执行

④d命令查看执行后ss段

标签:code,汇编语言,mov,ss,ax,编写,data,ds,调试
来源: https://blog.csdn.net/qq_40592576/article/details/121851666

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有