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

实验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.hqwc.cn/news/217318.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

web前端开发基础----标准流布局和非标准流布局

1&#xff0c;标准流布局 标准流&#xff0c;也称文档流或普通流&#xff0c;是所有元素默认的布局方式。 在标准流中&#xff0c;元素按照其在 HTML 中出现的顺序&#xff0c;自上而下依次排列&#xff0c;并占据其父容器内的可用空间。 标准流中的元素按照其自然尺寸和位置进…

如何将Postman API转换JMeter进行扩展

可扩展性 Postman测试无法扩展。如果您的集合中有很多请求&#xff0c;Postman / Newman将使用1个线程&#xff08;用户&#xff09;并按顺序执行这些请求&#xff0c;而不是使用多个线程并发执行。 性能测试能力 由于可扩展性限制&#xff0c;Postman不适合API性能测试。性…

AutoDL tensorboard实现可视化

1.在自己的代码中&#xff0c;writer SummaryWriter(../tf-logs)&#xff0c;具体位置看自己在哪个路径下 我的云服务器下event保存在这里&#xff0c;程序跑起来之后点开这个文件夹就能看见events 2.在容器实例中选择AutoPanel 3.选择tensorboard打开即可看见 4.出现问题 打…

你知道如何使用队列实现栈吗?(C语言)

这时一道非常经典的题型&#xff0c;因为栈和队列的性质是相反的&#xff0c;队列的数据是先入先出&#xff0c;栈的数据是后入先出&#xff0c;那么怎样使用两个队列实现栈呢&#xff1f; 225. 用队列实现栈https://leetcode.cn/problems/implement-stack-using-queues/ 这是…

PS去除图片上的文字。

问题描述&#xff1a;如何使用PS去除图片上的文字。 解决办法&#xff1a; 第一步&#xff1a;使用框选命令选中文字所在区域&#xff0c;如下图所示。 第二步&#xff0c;右键选择填充&#xff0c;选择内容填充即可。 第三步&#xff0c;文字去除效果如下。

Linux-基本指令(1.0)

Linux是一个非常流行的操作的知识&#xff0c;并提供实例帮助读者更好地理解。让我们一起来学习吧&#xff01;系统&#xff0c;也是云计算、大数据、人工智能等领域的重要基础。学习Linux命令是Linux系统管理的基础&#xff0c;也是开发过程中必不可少的技能。本博客将介绍Lin…

人工智能 -- 神经网络

1、什么是神经网络 什么是人工智能&#xff1f;通俗来讲&#xff0c;就是让机器能像人一样思考。这个无需解释太多&#xff0c;因为通过各种科幻电影我们已经对人工智能很熟悉了。大家现在感兴趣的应该是——如何实现人工智能&#xff1f; 从1956年夏季首次提出“人工智能”这…

[HCIE] IPSec-VPN (IKE自动模式)

概念&#xff1a; IKE&#xff1a;因特网密钥交换 实验目标&#xff1a;pc1与pc2互通 步骤1&#xff1a;R1与R3配置默认路由 R1&#xff1a; ip route-static 0.0.0.0 0.0.0.0 12.1.1.2 R2&#xff1a; ip route-static 0.0.0.0 0.0.0.0 23.1.1.2 步骤2&#xff1a;配ACL…

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;算法的 基本假…

怎么当代课老师教学生

老师朋友们&#xff0c;有没有帮忙当过代课老师呢&#xff1f;或者&#xff0c;没当过的老师是不是对这种职业充满了好奇&#xff1f;让我来分享一下&#xff0c;当代课老师的日常是什么样的吧&#xff01; 备课 说起备课&#xff0c;那可是个大工程&#xff01;不过&#xff…

每日一题:LeetCode-103/107.二叉树的(层序/锯齿形层序)遍历

每日一题系列&#xff08;day 04&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

Java 设计模式——建造者模式

目录 1.概述2.结构3.实例3.1.产品类3.2.抽象建造者类3.3.具体建造者类3.4.指挥者类3.5.测试 4.优缺点5.使用场景6.模式扩展7.创建者模式对比 1.概述 建造者模式 (Builder Pattern) 是一种创建型设计模式&#xff0c;用于创建复杂对象。它将对象的构建过程分离成独立的部分&…