ICode9

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

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

2021-11-08 08:33:53  阅读:121  来源: 互联网

标签:汇编 code mov ds bp ax bx 源程序 调试


1. 实验任务1 task1_1调试到line17结束、line19之前截图: 问题回答 ① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = 076A 寄存器(SS)= 076B, 寄存器(CS) = 076C ② 假设程序 加载后,code段的段地址是X,则,data段的段地址是X-2, stack的段地址是 X-1。 任务1-2 task1_2调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图 问题回答 ① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = 076A, 寄存器(SS)= 076B, 寄存器(CS) =076C ② 假设程序加载后,code段的段地址是X,则,data段的段地址是X-2, stack的段地址是 X-1。 task1_3调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图 问题回答 ① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = 076A, 寄存器(SS)= 076C, 寄存器(CS) = 076E ② 假设程序加载后,code段的段地址是X,则,data段的段地址是X-4, stack的段地址是 X-2。 任务1-4 任务task1_4.asm源码task1_4调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图 问题回答 ① 在debug中将执行到line9结束、line11之前,记录此时:寄存器(DS) = 076C, 寄存器(SS) =076E, 寄存器(CS) = 076A ② 假设程序加载后,code段的段地址是X,则,data段的段地址是X+2, stack的段地址 是X+4。 任务1-5 基于上述四个实验任务的实践、观察,总结并回答: ① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 如果是N的整数倍,即为N,否则:(N/16+1)*16。 ② 如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成 end , 哪一个程序仍然可以正确执行。结合实践观察得到的结论,分析、说明原因。

 

 

 

 

 

 

 

原因:实际上伪指令end 描述了程序的结束和程序的入口。在编译、连接后,"end start" 指明的程序入口,被转化为一个入口地址,存储在可执行文件的描述信息中。当把start去掉之后程序入口转换成一开始默认的076A,而task1_1,task1_2,task1_3的真正程序段入口不为076A导致程序在内存空间中无法找到正确的指令。

实验任务2 编写一个汇编源程序,实现向内存单元b800:0f00 ~ b800:0f9f连续160字节,依次重复填充十六进制数 据03 04。 Tips: 1. 在实验1的实验任务3中,做过达到同样效果的实验。但当时是通过debug的f命令实现填充的。这一 次,要求编程实现。
assume cs:code

code segment
start:
    mov ax, 0b800h
    mov ds, ax
    mov bx, 0f00h
    mov cx, 50h            
         
s:  mov ds:[bx], 0403h
    add bx, 2                    
    loop s

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

 

(问题)

debug执行程序后,用d指令访问内存单元发现并未填入内存

 

 

 编程实现时,注意进制问题、字节顺序问题。编写后,运行程序,如果与实验1的实验任务3结果不一致,说明程序编写有错误。

3. 实验任务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 ax,data1
    mov ds,ax
    mov bx,0
    mov cx 0ah
    s:mov ax,ds:[bx]
    add ax,ds:[bx+10h]
    mov ds:bx[bx+20],ax
    inc bx
    loop s
    mov ah,4ch
    int 21h
code ends
end start

结果:

4. 实验任务4

assume cs:code, ss:stack
data1 segment
dw 2, 0, 4, 9, 2, 0, 1, 9
data1 ends
data2 segment
dw 8 dup(0)
data2 ends
stack segment
dw 8 dup(0)
stack ends
code segment
start:
mov ax, data1
mov ds, ax
mov bx, 0
mov cx, 8
mov sp, 9
s1: push ds:[bx]
add bx, 2
loop s1
mov ax, data2
mov ds, ax
mov bx, 0
mov cx, 8
s2: pop ds:[bx]
add bx, 2
loop s2
mov ah, 4ch
int 21h
code ends
end start

实验结果:

5. 实验任务5 对程序进行汇编、链接,得到可执行文件,运行并观察结果。

使用debug工具对程序进行调试,执行到程序返回前,即line25执行之后、line27执行之前,观察 结果。 源代码中line19的作用是? 将小写字母变成大写字母,大写字母不变,通过与操作实现。 修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。 
db 2,3,4,5,6 --> 改成: db 5 dup(2) 或 db 5 dup(5)

 经过分析应该是修改颜色。

6. 实验任务6 ① 补全程序,将data段中的每行第一个单词从大写->小写。
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 cx, 64
        mov bx, 0
        mov ax,20h

s:      
        or [bx], ax
        inc bx
        loop s
        mov ah, 4ch
        int 21h
   mov ah, 4ch
   int 21h
code ends
end start
② 在debug中加载程序,反汇编,执行到line13退出前,用d命令查看data段对应的内存空间,确认每 行第一个单词已经由大写->小写。 

7. 实验任务7 问题场景描述: Power idea公司1975年-1979年的基本情况如下: 程序task7.asm的逻辑段data中(line4-6),已经定义好了这些数据。 要求: ① 补全程序,实现题目要求,把年份、收入、雇员人数、人均收入,以结构化方式写入table段中。 表格中,每行数据,在逻辑段table中占16个字节,各项数据占据字节大小分配如下。期中,数据之间用 空格间隔。
assume cs:codesg

data segment
    db '1975', '1976', '1977', '1978', '1979'
    dd 16, 22, 382, 1356, 2390
    dw 3, 7, 9, 13, 28
data ends

table segment
          db 5 dup( 16 dup(' ') )
table ends

codesg segment
start: 
    mov ax, data
    mov ds, ax
    mov ax, table
    mov es, ax 
    mov bx, 0 
    mov bp, 0      
    mov cx, 5
    ;年份
    s:  
        mov dx, cx    
        mov cx, 4    
        mov si, 0    
        s1:
            mov al, ds:[bx+si]
            mov es:[bp+si], al
            inc si
            loop s1
        mov cx, dx

        mov byte ptr es:[bp+4],' '  
        add bx, 4 
        add bp, 10h    
        loop s 


    mov bp, 0
    mov cx, 5
    ;收入
    s2:    
        mov ax,ds:[bx]    
        mov es:[bp+5],ax
        mov ax,ds:[bx+2]
        mov es:[bp+7],ax
        mov byte ptr es:[bp+9], ' '  
        add bx, 4 
        add bp, 10h
        loop s2
    mov bp, 0
    mov cx, 5
    ;雇员
    s3:
        mov ax, ds:[bx]    
        mov es:[bp+0ah], ax
        mov byte ptr es:[bp+0ch], ' ' 
        add bx, 2 
        add bp, 10h
        loop s3
    mov bp,0
    mov cx,5 

    ;人均
    s4:  
        mov ax, es:[bp+5]
        mov dx, es:[bp+7]
        div word ptr es:[bp+0ah] 
        mov es:[bp+0dh], ax  
        mov byte ptr es:[bp+0fh], ' ' 
        add bp, 10h
        loop s4  
    mov ax, 4c00h
    int 21h
codesg ends
end start   

 

② 汇编、连接后,在debug中加载、调试程序。灵活、合理使用u命令、g命令、d命令,显示刚开始逻 辑段table的数据信息,以及,结构化存入数据后,数据段table的数据信息,确认实现题目要求。

 

 

 

 

标签:汇编,code,mov,ds,bp,ax,bx,源程序,调试
来源: https://www.cnblogs.com/DerekRay/p/15506327.html

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

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

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

ICode9版权所有