【接口技术】实验1:简易汇编程序调试

news2024/12/24 10:34:47

实验1 简易汇编程序调试

一、实验目的

1:掌握在集成开发软件环境中汇编程序的编写、调试方法。

2:学会用DOS功能调用(1号和2号)完成输入和输出。

二、实验内容

1-1

在以BUF为首地址的字节存储区存放有若干个无符号数,求该序列中的最大值,并在屏幕上输出该最大值。输入如下源程序并运行,查看运行结果。要求:了解汇编指令,学会单步调试。

1-2

在1-1程序的基础上,添加修改代码补充程序,要求能同时求出最大值和最小值,并输出。

2-1

从键盘上输入一个字符,如果输入的是大写字母,则在屏幕上输出其对应的小写字母,如果输入了除大写字母外的其他字符,提示信息。

2-2

在上面程序的基础上,添加修改代码补充程序,要求:判断输入的字符,如果是大写字母则输出其小写字母,如果输入的字符是小写字母则输出其对应的大写字母,输入其他字符则提示信息。

三、源程序代码(含详细注释)

1-1

stack   segment stack

db  200 DUP(?)

stack   ends

data segment

buf db 12h,22h,4h,15h,9h,63h,1h,60h,62h    ;buf区,db存放9个无符号数

N equ $-BUF  ;Nbuf区的数据个数

max db ?    ;max存放db中的最大值,?表示还没有数据

min db ?    ;min存放db中的最小值

data ends

code segment

    assume cs:code,ds:data,ss:stack ;假定cscodedsdatassstack

start:

    mov ax,data         ;data送到ax

    mov ds,ax           ;ax送到ds

    mov si,offset buf   ;buf首地址送到si,所以si存放数据段地址

    mov cx,N            ;N送到cx,所以cx存放数据的数目

    call maxmin         ;调用maxmin子程序

    mov cl,bh           ;bh送到cl,(bh是存放的最大值)

    mov ah,02h          ;02h送到ah,调用dos2号功能

    mov dl,cl           ;cl送到dl

    int 21h             ;中断,输出

    mov ax,4c00h        ;返回dos

    int 21h             ;中断,退出

maxmin  proc            ;子程序maxmin

    push ax             ;ax送入stack

    mov bh,[si]         ;sibuf首地址)送到bh

    mov bl,bh           ;bh送到bl(好像没什么用)

    dec cx              ;cx自减1

A1:

    inc si              ;si自增,即取下一个buf数据

    mov al,[si]         ;将新的数据送到al

    cmp al,bh           ;比较albh的大小,al-bh=0,zf=1

    jle A3              ;zf=1,转移A3(当前数和最大值相等)

A2:

    mov bh,al           ;al送到bh,更新最大值

A3:

    loop A1             ;循环A1

    pop ax              ;弹出ax

    ret                 ;修改IP,实现近转移?

maxmin endp             ;子程序maxmin结束

code ends

end start

1-2

stack segment stack

db  200 DUP(?)

stack   ends

data segment

buf db 12h,22h,4h,15h,9h,63h,1h,60h,62h    ;buf区,db存放9个无符号数

N equ $-BUF  ;Nbuf区的数据个数

max db ?    ;max存放db中的最大值,?表示还没有数据

min db ?    ;min存放db中的最小值

data ends

code segment

    assume cs:code,ds:data,ss:stack ;假定cscodedsdatassstack

start:

    mov ax,data         ;data送到ax

    mov ds,ax           ;ax送到ds

    mov si,offset buf   ;buf首地址送到si,所以si存放数据段地址

    mov cx,N            ;N送到cx,所以cx存放数据的数目

    call maxmin         ;调用maxmin子程序

    mov max,bh  ;bh to max

    mov min,bl  ;bl to min

    mov ah,02h          ;02h送到ah,调用dos2号功能

    mov dl,max          

    int 21h             ;中断,输出max

    mov ah,02h          ;02h送到ah,调用dos2号功能

    mov dl,min          

    int 21h             ;中断,输出min

    mov ax,4c00h        ;返回dos

    int 21h             ;中断,退出

maxmin  proc            ;子程序maxmin

    push ax             ;ax送入stack

    mov bh,[si]         ;sibuf首地址)送到bh

    mov bl,bh           ;bh送到bl

    dec cx              ;cx自减1

A1:

    inc si              ;si自增,即取下一个buf数据

    mov al,[si]         ;将新的数据送到al

    cmp al,bh           ;比较albh的大小

    jbe A2              ;if al <= bh, max still

    mov bh,al          ;if al > bh, max update(bh)

    jle A3              ;if al <= bh, still in data

A2:

    cmp al,bl           ;compare al bl

    jae A3              ;if al >= bl, min still

    mov bl,al           ;if al < bl, min update(bl)

A3:

    loop A1             ;循环A1

    pop ax              ;弹出ax

    ret                 ;修改IP,实现近转移?

maxmin endp             ;子程序maxmin结束

code ends

end start

2-1

stack segment stack

    db  200 dup(0)

stack ends

data  segment

string db 'Please input an English letter!', 0ah,0dh, '$'   ;定义用户输入错误信息后的提示信息,同时采用换行0ah,0dh, '$'

data ends

code segment

    assume cs:code, ds:data,  ss:stack

 

start:

    mov ax,data     ;data送入ax

    mov ds,ax       ;ax送入ds,即dsdata

    mov ah,01h      ;调用func-1

    int 21h         ;中断

    cmp al,'A'      ;比较alA

    jl exit         ;如果al 小于 A,则跳转到exit,也就是说肯定不是大写字母

L1:

    cmp al,'Z'      ;比较alZ

    jg exit         ;如果al 大于 Z,则跳转到exit,也就是说肯定不是大写字母

    add al,32       ;al自增32,当前的al是大写字母,加32是为了变成小写字母

    mov cl,al       ;al送入cl,即cl含转化的小写字母

       

exit1:

    mov dl,cl       ;cl送入dl

    mov ah,02h      ;调用func-2

    int 21h         ;中断

    mov ax,4c00h    ;返回dos

    int 21h         ;中断

   

exit:

    mov dl,0ah      ;0a送入dl

    mov ah,02h      ;调用func-2

    int 21h         ;中断

    mov ax,data     ;data送入ax

    mov ds,ax       ;ax送入ds

    mov dx,offset string    ;string送入dx

    mov ah,09h      ;调用func-9

    int 21h         ;中断

    mov ax,4c00h    ;返回dos

    int 21h         ;中断

code ends

end start

2-2

stack segment stack

    db  200 dup(0)

stack ends

data  segment

string db 'Please input an English letter!', 0ah,0dh, '$'

data ends

code segment

    assume cs:code, ds:data,  ss:stack

 

start:

    mov ax,data     ;data送入ax

    mov ds,ax       ;ax送入dsds也有data

    mov ah,01h      ;func-1

    int 21h

    cmp al,'A'      ;比较alA

    jl exit         ;如果al 小于 A,则去exit(非大写字母和小写字母)

    cmp al,'Z'      ;比较alZ

    jg NotUpper     ;如果al 大于 Z,则去notupper(非大写字母,可能是小写字母)

    jmp Upper       ;无条件去upper(一定是大写字母)

NotUpper:

    cmp al,'a'      ;比较ala

    jl exit         ;如果al 小于 a,则去exit(非小写字母)

    cmp al,'z'      ;比较alz

    jg exit         ;如果al 大于 z,则取exit(非小写字母)

    jmp Lower       ;一定是小写,无条件取lower

Upper:

    add al,32       ;变成小写

    mov cl,al       ;al送到cl

    jmp exit1       ;无条件去exit1

Lower:

    sub al,32       ;变成大写

    mov cl,al       ;al送到cl

       

exit1:

    mov dl,cl       ;2-1一样的操作了,此处不再赘述

    mov ah,02h

    int 21h

    mov ax,4c00h

    int 21h

   

exit:

    mov dl,0ah

    mov ah,02h

    int 21h

    mov ax,data

    mov ds,ax

    mov dx,offset string

    mov ah,09h

    int 21h

    mov ax,4c00h

    int 21h

code ends

end start

 

四、遇到的问题和解决过程

问题1:在本地使用vscode编写asm代码完成后,用U盘传输到实验室电脑上的环境中,注释均乱码且无法编译成功。

解决1:发现是采用的编码格式不一样,本地使用UTF-8,而实验室电脑的环境使用ANSI。于是我们先在本地上用记事本打开asm文件,点击【文件】——【另存为】——【编码】处选择ANSI即可。最后注释均可以在实验室电脑上正常显示,编译也可以正常进行。

问题2:硬件插上后,实验室电脑并未显示连接成功。

解决2:发现实验箱未插电,后续找到黑色的电源线之后即可正常工作。

五、实验结果

1-1:


如上图所示,可以观察到终端窗口会输出c字符。由于本实验是输出buf区的最大字符,人为可以发现最大字符对应的16进制值是63h,查询ASCII表之后发现63h对应c,因此程序会输出c字符。

1-2:

如上图所示,可以观察到终端窗口会输出c字符和笑脸字符。由于本实验是输出buf区的最大字符和最小字符,人为可以发现最大字符对应的16进制值是63h和1h,查询ASCII表之后发现63h对应c、1h对应不可打印字符(笑脸),因此程序会输出c字符和笑脸。

2-1:

如上图所示,可以观察到终端窗口会输出大写字母A转化后的小写字母a,输出非大写字母a的提示信息【Please input an English letter!】。由于本实验是将输入的大写字母转为小写字母,将其他非大写字母的输入输出提示信息,因此程序在接收键盘输入的A后会输出a,在接受其他非大写字母输入后会输出预设的string。

2-2:

    如上图所示,可以观察到终端窗口会输出小写字母a转化后的大写字母A。由于本实验是新增功能——将输入的小写字母转为大写字母,因此程序在接收键盘输入的a后会输出A。其他功能与2-1相似,此处不再赘述。

六、实验体会与总结

1:学会了查找十六进制数对应的ASCII码,来判断程序输出的结果是否正确。(ASCII码对照表 十六进制的字符对照表_未来无限的博客-CSDN博客)

2:学习了DOS功能调用的基本方法,例如1号功能是从键盘读入1个字符、9号功能是显示器输出一串字符,回车换行用0ah,0dh, '$'等知识点。(汇编--学习笔记(四)-DOS功能调用-CSDN博客)

3:学习了基本汇编语言指令的程序编写,特别是几类跳转指令,例如无条件跳转jmp等。(汇编语言跳转指令总结_汇编语言小于跳转指令-CSDN博客)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1251312.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

02 RANSAC算法 及 Python 实现

文章目录 02 RANSAC算法 及 Python 实现2.1 简介2.2 算法流程2.3 RANSAC 算法实现直线拟合2.4 利用 RANSAC 算法减少 ORB 特征点误匹配 02 RANSAC算法 及 Python 实现 2.1 简介 RANSAC &#xff08;Random Sample Consensus&#xff0c;随机抽样一致&#xff09;算法的 基本假…

网络通信基础概念介绍

网络通信基础概念介绍 局域网LAN 局域网&#xff0c;即 Local Area Network&#xff0c;简称LAN。 局域网内的主机之间能方便的进行网络通信&#xff0c;又称为内网&#xff1b;局域网和局域网之间在没有连接的情况下&#xff0c;是无法通信的。 局域网是指在一个相对较小的…

Android设计模式--外观模式

弈之为术&#xff0c;在人自悟 一&#xff0c;定义 外观模式要求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。提供一个高层次的接口&#xff0c;使得子系统更易于使用。 外观模式在开发中的使用频率是非常高的&#xff0c;尤其是在第三方的SDK里面&#xff0…

redis运维(二十)redis 的扩展应用 lua(二)

一 redis 的扩展应用 lua redis lua脚本语法 ① 什么是脚本缓存 redis 缓存lua脚本 说明&#xff1a; 重启redis,脚本缓存会丢失 下面讲解 SCRIPT ... 系列 SCRIPT ② LOAD 语法&#xff1a;SCRIPT LOAD lua代码 -->载入一个脚本,只是预加载,不执行思考1&#xff1…

leetcode中“辅助栈”类题目和“单调栈”类题目的异同

1 总结 1 栈中元素的特性 2 单调栈存在一次性连续删除多个栈顶的情况&#xff0c;但是普通的栈&#xff0c;一次只pop掉一个栈顶元素 2 LC1209. 删除字符串中的所有相邻重复项 II - 普通辅助栈 class Solution {public String removeDuplicates(String s, int k) {int ns.l…

OSG粒子系统与阴影-爆炸模拟(3)

爆炸模拟示例 爆炸模拟示例的代码如程序清单11-4 所示&#xff1a; /* 爆炸模拟示例 */ void explosion_11_4() {osg::ref_ptr<osgViewer::Viewer> viewer new osgViewer::Viewer();osg::ref_ptr<osg::GraphicsContext::Traits> traits new osg::GraphicsContex…

Linux:Ubuntu虚拟机安装详解:VMware下的逐步指南

目录 1. centOS系统 2. ubuntu系统 1. 下载Ubuntu映像 step1 step2 step3 2. 新建虚拟机 step1 step2 Step3 step4 step5 step6 内存 内核 映像 显示 网络 3. 网络配置 NAT模式 本机IP获取 ​编辑 bridge模式 4. 开启虚拟机 5. 虚拟机常用配置 语言 …

物联网后端个人第十二周总结

学习工作进度 物联网方面 1.模拟设备通过规则引擎将数据通过mqtt进行转发 在物联网平台上实现模拟设备通过规则引擎将数据通过mqtt进行转发已经全部完成了&#xff0c;所使用的物联网平台在这方面有不少的问题和bug&#xff0c;也可能是没有按照开发者的想法对平台进行使用才导…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑系统一次频率响应特性的新型电力系统源网荷储协调鲁棒规划》

这篇文章的标题涉及到新型电力系统的源&#xff08;发电源&#xff09;、网&#xff08;电网&#xff09;、荷&#xff08;负荷&#xff0c;即用电需求&#xff09;以及储&#xff08;储能系统&#xff09;的协调鲁棒规划&#xff0c;其中考虑了系统的一次频率响应特性。 让我…

软件设计师:计算机组成与体系结构之计算机基础知识

计算机基础知识 数据的表示 码制及进制转换 原码&#xff1a;将数值转成二进制反码&#xff1a;正数与原码完全相同&#xff1b;负数&#xff0c;除了符号位其他位取反补码&#xff1a;正数与原码完全相同&#xff1b;负数&#xff0c;在补码的基础上加1移码&#xff1a;补码…

CUDA编程二、C++和cuda混合编程的一些基础知识点

目录 一、C运行过程 1、C编译过程 2、代码运行示例 单文件 多文件 a、编译所有cpp文件&#xff0c;但是不链接 b、链接所有的.o文件 c、运行程序 CMake编译 代码 使用方法 编译过程 代码运行 二、C和cuda混合编程 cuda 单文件 cuda和C多文件 手动分步编译 C…

TDA笔记:夏克林老师,南洋理工大学

TDA比传统的统计方法有优势&#xff1a;benchmark中展现了这种优势 laplacian矩阵 多种单纯复形构造方式&#xff0c;可以构造出不同表征 二部图&#xff1a;Dowker complex Tor algebra可以用到多大数据 目前较新

python教程:正常shell与反弹shell

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 正常shell需要先在攻击端开机情况下开启程序,然后攻击端运行程序,才能连接 反弹shell,攻击端是服务端,被攻击端是客户端 正常shell,攻击端是客户端,被攻击端是服务端 反弹shell,先启用服务端,再启用客户端 反弹shell的好处…

OPPO VOOC快充原理

1 USB 3.0标准A插头 USB 3.0连接器是基于USB 2.0改进而来的&#xff0c;这个设计给USB 3.0连接器带来了一些潜在风险&#xff0c;如果USB 3.0设备插入主机的速度太慢&#xff0c;3.0的针脚还没来得及被识别到&#xff0c;就会被主机判定成USB 2.0的设备。 Figure 1-1 USB 3.0标…

【C++】构造函数和析构函数第四部分(深拷贝和浅拷贝)--- 2023.11.25

目录 什么是浅拷贝&#xff1f;浅拷贝的问题使用深拷贝解决浅拷贝问题结束语 什么是浅拷贝&#xff1f; 如果在一个类中没有人为定义拷贝函数&#xff0c;则系统会提供默认拷贝函数。那么在此默认拷贝函数中主要进行了简单的赋值操作&#xff0c;那这个简单的赋值操作我们一般…

教师编制缩减是为什么

老师们有没有注意到一个趋势&#xff1f;那就是教师编制正在逐步缩减。不知道你们发现没有&#xff0c;我最近在研究教育领域的新闻&#xff0c;发现这两年教师编制缩减的消息越来越多。这是为什么呢&#xff1f;今天就来跟大家聊一聊。 原因一&#xff1a;资金压力 第一个原因…

HarmonyOS应用开发实战—登录页面【ArkTS】

文章目录 本页面实战效果预览图一.HarmonyOS应用开发1.1HarmonyOS 详解1.2 ArkTS详解二.HarmonyOS应用开发实战—登录页面【ArkTS】2.1 ArkTS页面源码2.2 代码解析2.3 心得本页面实战效果预览图 一.HarmonyOS应用开发 1.1HarmonyOS 详解 HarmonyOS(鸿蒙操作系统)是华为公司…

SD卡选型参考

文档版本日期类型REV1.02023.11.25新建 SD卡对于大家来说&#xff0c;应该很熟悉了&#xff0c;都是我们在各类电子设备中经常使用的。不过大家在购买SD卡的时候都会关注哪些参数呢&#xff1f;可能大部分使用者&#xff0c;甚至包括我在内也只是会关注下容量&#xff0c;当然是…

案例-某验四代滑块反爬逆向研究一

系列文章目录 第一部分 案例-某验四代滑块反爬逆向研究一 文章目录 系列文章目录前言一、分析流程二、定位 w 值生成位置三、device_id 值的定位生成四、pow_msg 值 和 pow_sign 值的生成总结 前言 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff…