1. 实验任务1

教材「实验9 根据材料编程」(P187-189)编程:在屏幕中间分别显示绿色、绿底红色、白底蓝色的字符串'welcome to masm!'。

解题思路:根据学习的知识,我知道该页在显示缓冲区的位置从B8000H开始,要在屏幕中间,对照表格,我输出的三行应是11,12,13行。11行的起始地址为1760,我的输入内容占16bytes*2=32。(160-32)/2=64。所以我的初始地址偏移量是1760+64=1824,转换为十六进制是720h。B8000H+720H=B8720H,所以我把初始es设置为B872,这样偏移变量就从0开始。

编写代码的想法,内层循环控制每行输出字符,外层循环控制打印三行。

 1 assume cs:code, ds:data, ss:stack
2 data segment
3 db 'welcome to masm!'
4 db 2h,24h,71h ;颜色
5 data ends
6 stack segment stack
7 db 16 dup (0)
8 stack ends
9
10 code segment
11 start:
12 mov ax,data
13 mov ds,ax
14 mov ax,stack
15 mov ss,ax
16 mov sp,16
17 mov ax,0B872h
18 mov es,ax
19 mov cx,3
20 mov bx,16
21 s:
22 push cx
23 mov cx,16
24 mov si,0
25 mov di,0
26 s0:
27 mov al,ds:[di]
28 mov ah,ds:[bx]
29 mov es:[si],ax
30 add si,2
31 inc di
32 loop s0
33
34 pop cx
35 mov ax,es
36 add ax,000ah
37 mov es,ax
38 inc bx
39 loop s
40
41 mov ax,4c00h
42 int 21h
43
44 code ends
45 end start

实验代码运行结果:

 2. 实验任务2

编写子程序printStr,实现以指定颜色在屏幕上输出字符串。调用它,完成字符串输出。

子程序printSar

功能:以指定颜色在屏幕上(从屏幕左上角开始)输出字符串要求:字符串以0结尾入口参数字符串的起始地址—> ds: si (其中,字符串所在段的段地址—> ds, 字符串起始地址的偏移地址—> si字符串颜色—> al出口参数:无

 1 assume cs:code, ds:data
2 data segment
3 str db 'try', 0
4 data ends
5
6 code segment
7 start:
8 mov ax, data
9 mov ds, ax
10
11 mov si, offset str
12 mov al, 2
13 call printStr
14
15 mov ah, 4ch
16 int 21h
17
18 printStr:
19 push bx
20 push cx
21 push si
22 push di
23
24 mov bx, 0b800H
25 mov es, bx
26 mov di, 0
27 s:
28 mov cl, [si]
29 mov ch, 0
30 jcxz over
31 mov ch, al
32 mov es:[di], cx
33 inc si
34 add di, 2
35 jmp s
36
37 over:
38 pop di
39 pop si
40 pop cx
41 pop bx
42 ret
43
44 code ends
45 end start

把line3改为:strdb 'another try', 0

改变了内容

把line12改为:mov al, 4

改变了字体颜色

基于运行结果,理解源代码,以及,组合使用转移指令call和ret实现子程序的原理与方法。

  • 具体地,在line18-40中:line19-22, line36-39,这组对称使用的push、pop,这样用的目的是什么?

答:保留现场,将子程序运行前寄存器的值保留下来,运行结束后再还原,不干扰原程序的运行,不改变它的值。避免了程序间的冲突和错误。

  • line30的功能是什么?

答:将字符内容和它的颜色属性存入指定的显存中,打印到屏幕上。

3. 实验任务3

使用任意文本编辑器,录入汇编源程序task3.asm。

子程序num2str:功能:把0~2559之间的任意整数转换成数字字符串,

例如,把1984转换成'1984'入口参数要转换的整数 —> ax数字字符串的起始地址 —> ds:di (其中:数字字符串所在段的段地址—> ds,字符串起始地址的偏移地址—>di)出口参数:无

 1 assume cs:code, ds:data
2 data segment
3 x dw 1984
4 str db 16 dup(0)
5 data ends
6
7 code segment
8 start:
9 mov ax, data
10 mov ds, ax
11 mov ax, x
12 mov di, offset str
13 call num2str
14
15 mov ah, 4ch
16 int 21h
17
18 num2str:
19 push ax
20 push bx
21 push cx
22 push dx
23
24 mov cx, 0
25 mov bl, 10
26 s1:
27 div bl
28 inc cx
29 mov dl, ah
30 push dx
31 mov ah, 0
32 cmp al, 0
33 jne s1
34 s2:
35 pop dx
36 or dl, 30h
37 mov [di], dl
38 inc di
39 loop s2
40
41 pop dx
42 pop cx
43 pop bx
44 pop ax
45
46 ret
47 code ends
48 end start

子任务1对task3.asm进行汇编、链接,得到可执行程序后,在debug中使用u命令反汇编,使用g命令执行到line15(程序退出之前),使用d命令查看数据段内容,观察是否把转换后的数字字符串'1984'存放在数据段中str标号后面的单元。

可以看到存入单元内。

子任务2

对task3.asm源代码进行修改、完善,把task2.asm中用于输出以0结尾的字符串的子程序加进来, 实现对转换后的字符串进行输出。

把task3.asm源代码中,line3中整数改成0~2559之间的任意数值,运行测试,观察结果。

 4. 实验任务4

使用任意文本编辑器,录入汇编源程序task4.asm。

 1 assume cs:code, ds:data
2 data segment
3 str db 80 dup(?)
4 data ends
5
6 code segment
7 start:
8 mov ax, data
9 mov ds, ax
10 mov si, 0
11
12 s1:
13 mov ah, 1
14 int 21h
15 mov [si], al
16 cmp al, '#'
17 je next
18 inc si
19 jmp s1
20 next:
21 mov cx, si
22 mov si, 0
23 s2: mov ah, 2
24 mov dl, [si]
25 int 21h
26 inc si
27 loop s2
28
29 mov ah, 4ch
30 int 21h
31 code ends
32 end start

运行结果:

汇编、链接、运行程序,输入一个字符串并以#结束(比如,2020, bye#)观察运行结果。结合运行结果,理解程序功能,了解软中断指令。

具体地:line12-19实现的功能是?

答:利用软中断指令,int 21h中的1号子功能,将输入的字符串中“#”前的字符存储到指定的栈断中。

line21-27实现的功能是?

答:统计“#”前的字符个数作为循环次数,利用2号子功能在屏幕上输出。

5. 实验任务5

在visual studio集成环境中,编写一个简单的包含有函数调用的c程序。代码如下:

#include <stdio.h>
int sum(int, int);
int main() {
int a = 2, b = 7, c;
c = sum(a, b);
return 0;
}
int sum(int x, int y) {
return (x + y);
}

在line7, line13分别设置断点,在调试模式下,查看反汇编代码。

line7断点:

进入sum子函数中,line13断点:

分析反汇编代码,从汇编的角度,观察高级语言中参数传递和返回值是通过什么实现的,以及,参数入栈顺序,返回值的带回方式,等等。

答:高级语言中参数传递和返回值都是通过寄存器实现的。

参数入栈顺序自右向左,b的值传入寄存器eax,a的值传入寄存器ecx,之后使用call指令调用子函数sum

在函数内将结果存入了eax中。返回主函数中,eax的值传给c。

五、实验总结

1、进一步了解总结了之前实验中的显存区域输出,实际操作了课上讲解的内容,屏幕位置的具体计算。

2、了解和使用了软中断指令。

实验4 汇编应用编程和c语言程序反汇编分析的更多相关文章

  1. 实验十五 GUI编程练习与应用程序部署

    实验十五  GUI编程练习与应用程序部署 实验时间 2018-12-6 一:理论部分 1.Java 程序的打包:编译完成后,程序员将.class 文件压缩打包为 .jar 文件后,GUI 界面序就可以 ...

  2. 03-第一个C语言程序的分析

    本文目录 一.代码分析 二.开发和运行C程序的步骤 三.总结 说明:这个C语言专题,是学习iOS开发的前奏.也为了让有面向对象语言开发经验的程序员,能够快速上手C语言.如果你还没有编程经验,或者对C语 ...

  3. c语言环境初始化&c语言和汇编混合编程

    bootloader通常会分为两个阶段:第一阶段采用汇编语言来编写,主要是一些核心的初始化工作(内存,时钟的初始化),第二阶段使用C语言来编写,主要是它会完成一些板载硬件的初始化(串口,网口)然后其启 ...

  4. 【转】VxWorks中高精度实时时钟的实现及C语言汇编混合编程

    最近一个项目中需要在VxWorks下使用一个高精度实时时钟,要求精度为1ms,溢 出时间大于5小时.VxWorks提供系统时钟,该时钟在操作系统启动后开始计数,精度为1个tick,可以通过tickGe ...

  5. 20145225《Java程序设计》 实验五 Java网络编程及安全

    20145225<Java程序设计> 实验五 Java网络编程及安全 实验报告 一.实验内容 基于Java Socket实现安全传输. 基于TCP实现客户端和服务器,结对编程一人负责客户端 ...

  6. ARM中C和汇编混合编程及示例(转)

    在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的.在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较 ...

  7. 20145215实验五 Java网络编程及安全

    20145215实验五 Java网络编程及安全 实验内容 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验步骤 本次实验我的结对编程对象是20145208蔡野,我负责编写客 ...

  8. C51与汇编混合编程详解

    C51和汇编混合编程(1)-C语言中嵌入汇编 1.在 C文件中要嵌入汇编代码片以如下方式加入汇编代码: #pragma ASM ;Assembler Code Here #pragma ENDASM ...

  9. 实验5 Spark SQL编程初级实践

    今天做实验[Spark SQL 编程初级实践],虽然网上有答案,但都是用scala语言写的,于是我用java语言重写实现一下. 1 .Spark SQL 基本操作将下列 JSON 格式数据复制到 Li ...

随机推荐

  1. MathType总结编辑括号的类型(中)

    MathType中的符号模板多种多样,能够满足各类用户的使用需求.即使是一些不常用的符号也有相应的模板,因为在工作学习中我们都需要他们,只是有的用的多有的用的少而已,下面我们就一起来看看公式编辑器编辑 ...

  2. 用MindManager画思维导图的好处有哪些?

    大家都听说过思维导图吧?有没有将这样一种图形思维工具真正运用到我们的日常生活中去呢?是否真的知道思维导图怎么用呢?今天小编就来给大家讲一讲,思维导图怎么用. 老规矩,先给大家讲一讲小编用的软件跟系统, ...

  3. 你还在 if...else?代码这样写才好看!

    前言 if...else 是所有高级编程语言都有的必备功能.但现实中的代码往往存在着过多的 if...else.虽然 if...else 是必须的,但滥用 if...else 会对代码的可读性.可维护 ...

  4. LNMP 一键安装脚本

    这个脚本是使用shell编写,为了快速在生产环境上部署lnmp/lamp/lnmpa(Linux.Nginx/Tengine/OpenResty.MySQL/MariaDB/Percona.PHP), ...

  5. 【CF607B】Zuma——区间dp(记忆化搜索/递推)

    以下是从中文翻译成人话的题面: 给定一个长度小于等于500的序列,每个数字代表一个颜色,每次可以消掉一个回文串,问最多消几次可以消完? (7.16) 这个题从洛谷pend回来以后显示有103个测试点( ...

  6. django项目运行步骤

    第一步: 创建gjango项目 django-admin startproject dname python manage.py startapps aname 第二部: 运行 -- 编辑设置 -- ...

  7. gitlab 文件读取+rce复现 CVE202010977

    文件读取实现,首先生成两个project 再任意一个project添加issue,然后描述如下: ![a](/uploads/11111111111111111111111111111111/../. ...

  8. WPF 学习笔记(一)

    一.概述 WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,随着.NET Framework 3.0发布第一个版本.它提供了统一的 ...

  9. msql语句

    表相关语句: 创表相关 CREATE TABLE `Student`( `s_id` VARCHAR(20), `s_name` VARCHAR(20) NOT NULL DEFAULT '', `s ...

  10. 极简python教程:快速入门好方法

    大家好,我是测试奇谭的作者风风. 其实很久之前,就有身边的同事或者网友让我分享一些关于python编程语言的快速教程,他们的痛点同大多数自学编程语言的人一样,遇到了这些问题: 网络上的信息太多,良莠不 ...