汇编语言王爽---第四版
记录一下在学习汇编的过程中遇到的有意思的习题
2021/10/05
1.编写程序向内存0:200~0:23F依次传送数据0~63。
assume cs:code
code segmentstart:mov ax,0H mov ds,ax ;ax=ds*16+bxmov bx,200H ;十六进制mov dx,0 ;初始化累加器dx=0mov cx,64 ;设置循环次数64s: mov ds:[bx],dl inc dl ;dx自增inc bx ;bx自增 ds:bx指向下一个单元loop smov ax,4c00Hint 21H
code ends
end start
2021/10/07
2.计算ffff:0~ffff:b单元中的数据的和,结果存放在dx中
;计算ffff:0~ffff:b单元中的数据的和,结果存放在dx中
assume cs:code
code segmentstart: mov ax,0ffffhmov ds,ax ;设置段地址mov bx,0 ;ds:bx指向 ffff:0mov dx,0 ;设置累加器dx=0mov cx,0bH ;循环12次s:mov al,[bx] mov ah,0add dx,ax ;dx=(ds)*16+bxinc bx ;ds:bx指向下一个单元loop smov ax,4c00Hint 21H
code ends
end start
2021/11/1
3.试编写一程序计算以下表达式:
(提示:可以采用移位指令或者乘除法指令)
Z=(3X十Y-5)/2
;Z=(3X十Y-5)/2
assume cs:code,ds:data
data segment VARX dw 15VARY dw 10VARZ dw ?
data endscode segment
start:mov ax,datamov ds,axmov ax,VARX ;ax<-xshl ax,1 ;ax<-ax*2add ax,VARX ;ax<-ax*2+axadd ax,VARY ;3*x+ysub ax,5 ;3*x+y-5shr ax,1 ;(3X十Y-5)/2mov VARZ,axmov ax,4c00hint 21h
code ends
end start
4.设AL寄存器的初值为0A9H,将AL寄存器中的8位数分成2组,每组4位,编程实现把这两组数从高到低分别放在AL、BL中。
assume cs:code
code segment
start:mov ax,0A9Hmov bl,0AHdiv blmov bl,ah ;bx=0009Hmov ax,0A9Hmov cl,4shr al,cl ;al=000AHmov ax,4c00hint 21h
code ends
end start
2021/11/2
5.《汇编语言》王爽第四版,检测点9.1(1)(2)
(1)若要使程序中的jmp指令执行后,CS:IP指向程序的第一条指令,在data段中应该定义哪些数据
assume cs:code
data segmentdata ends
code segmentstart:mov ax,datamov ds,axmov bx,0jmp word ptr [bx+1]code ends
end start
指向第一条指令,则要使IP的值为0000H即可,而jmp word ptr为段内转移指令,相当于把IP值赋值为后面内存单元的值,故只需要第一个字节为0即可。
assume cs:code
data segmentdb 4 dup(0)
data ends
code segmentstart:mov ax,datamov ds,axmov bx,0jmp word ptr [bx+1]code ends
end start
调试
(2)补全程序,使jmp指令执行后,CS:IP指向程序的第一条指令
assume cs:code
data segmentdd 12345678H
data ends
code segment
start:mov ax,datamov ds,axmov bx,0mov [bx],bxmov [bx+2],csjmp dword ptr ds:[0]mov ax,4c00Hint 21H
code ends
end start
执行jmp指令后指向第一条指令,CS段没有改变,只需要改变IP值为0000H。而段间转移相当于把内存地址开始的前两个字节赋值给IP,后面的两字节赋值给CS
调试
2021/11/08
6.编程实现以下功能:双字变量A,B,相加结果放入双字变量C中,相减结果放入双字变量D中。
assume cs:code,ds:data
data segmentA dd 12345678H B dd 98765432H C dd ? D dd ?
data endscode segment
start:mov ax,datamov ds,axmov si,0clcmov cx,2s:mov ax,word ptr [A+si]adc ax,word ptr [B+si]mov word ptr [C+si],ax inc siinc siloop sclcmov si,0mov cx,2s0:mov ax,word ptr [A+si]sbb ax,word ptr [B+si]mov word ptr [D+si],axinc siinc siloop s0mov ax,4c00hint 21h
code ends
end start
7.编程实现功能两个128位数据相加
assume cs:code;ds:data
data segmenta dw 1,2,3,4,5,6,7,8b dw 8,7,6,5,4,3,2,1c dw 8 dup(0)
data ends
code segmentstart: mov ax,datamov ds,axclc ;清除标志位CF的值mov si,14mov cx,8s:mov ax,ds:a[si]adc ax,ds:b[si] ;ax=ax+b[si]+cFmov ds:c[si],axdec sidec si ;sub si,2loop smov ax,4c00Hint 21H
code ends
end start
8.在数据段内连续存放着10个字节型无符号二进制数,编写一段程序,求出该10个数之和,并将结果存放在寄存器AX中。
assume cs:code,ds:data
data segmentA db 1B,10B,11B,110B,111B,101B,100B,1111B,1110B,1000B
data ends
code segment
start: mov ax,datamov ds,axmov ax,0mov si,0clcmov cx,10s:adc al,byte ptr [A+si]inc siloop smov ax,4c00Hint 21H
code ends
end start
2021/11/16
1.统计分数
assume cs:code,ds:data
data segment
Fenshu db 80,45,60,77,88,99,58a db 0B db 0data endscode segmentstart:mov ax,datamov ds,axmov bx,0mov cx,7s:cmp byte ptr[bx],60jb next ;小于60转移到nextinc a ;a=5jmp lastnext:inc Bjmp lastlast:inc bxloop smov ax,4c00Hint 21H
code ends
end start
- 编写一个程序,将包含任意字符,以0结尾的字符串的小写字母转变成大写字母。
assume cs:code,ds:data
data segmentdb "Today is a good day 0"
data endscode segment
start:mov ax,datamov ds,axmov bx,0s1:cmp byte ptr[bx],'0' je last s2:cmp byte ptr[bx],'a'jb s5 s3:cmp byte ptr[bx],'z'ja s5s4:sub byte ptr[bx],20Hs5:inc bxjmp s1
last:mov ax,4c00Hint 21H
code ends
end start
3.编写程序实现以下功能:字变量X与字变量Y比较大小(无符号数),如果大于则字变量z值为1;如果等于,则z值为0;小于则z为-1。
assume cs:code,ds:data
data segmentx dw 5y dw 7z dw 0
data ends
code segment
start:mov ax,datamov ds,axmov ax,xmov bx,y
s1:cmp ax,bx ;不低于就转移jnb s2amov z,-1jmp last
s2:cmp ax,bx ;不deng就转移jne s3mov z,0jmp last
s3:cmp ax,bx mov z,1jmp last
last:mov ax,4c00Hint 21Hcode ends
end start
2021/11/23
- 假如变量定义如下:
A DB 5,7,15
SUM DW ?,?,?
请编程实现分别求1+2+……+N(N的值分别从A中取),求和值放入到SUM中,其中求和过程用子程序实现。
assume cs:code,ds:data
data segmentA db 5,7,15sum dw ?,?,?
data ends
code segment
start: mov ax,datamov ds,ax mov si,0mov di,0mov cx,3s: mov ax,0mov bx,0call kalamov sum[di],axadd di,2inc si loop smov ax,4c00Hint 21H
kala:clcadc ax,bxinc bxcmp bL,A[si]jna kalaret
code ends
end start
2.将数据段中定义的两位数据以十进制的形式分别保存到字符串变量CHAR1、CHAR2、CHAR3中。其中进制转串用子程序实现。
DATA SEGMENT
A DB 12,34,56
CHAR1 DW 2DUP(?)
CHAR2 DW 2DUP(?)
CHAR3DW 2DUP(?)
DATA ENDS
assume cs:code,ds:data
data segmenta db 12,34,56char1 dw 2 dup(0)char2 dw 2 dup(0)char3 dw 2 dup(0)
data ends
code segment
start:mov ax,datamov ds,axmov si,0mov di,0mov bl,10mov cx,3s: call dididimov char1[di],axinc siadd di,2loop smov ax,4c00hint 21h
dididi:mov al,[si]mov ah,0div blretcode endsend start
3.请编写完整程序实现以下功能:设DAT单元存放一个0-9的字节数据,在sqrtab数据区存放了0-9的平方值,实现在sqrtab中查出DAT单元中数据的平方值,然后送入SQR单元,其中查表的方法用子程序实现
DAT DB 8
SQRTAB DB 0,1,4,9,16,25,36,49,64,81
SQR DB ?
assume cs:code,ds:data
data segment
dat db 8
sqrtab db 0,1,4,8,16,25,36,49,64,81
sqr db ?
data ends
code segment
start:mov ax,datamov ds,axs:mov al,datmov ah,0mov si,0mov si,axcall mmmov sqr,alloop smov ax,4C00Hint 21Hmm:mul datcmp al,sqrtab[si]jne mm ;不等于就转移ret
code ends
end start
2021/12/14
编程输入一个字符串,将其原样输出
assume cs:code,ds:data
data segment
char1 db 11,0,11 dup(0)
char2 db 0AH,'$'
data ends
code segemnt
start:mov ax,datamov ds,axlea dx,char1[1] ;指定入口参数mov ah,0AH ;从键盘读入一个字符串int 21H ;入口参数DS:DXmov bl,char1[1]mov bh,0mov char1[bx+2],'$'lea dx,char2mov ah,09Hint 21H ;OAH换行,0DH回车lea dx,char1add dx,2mov ah,09Hint 21Hmov ax,4C00Hint 21H
code ends
end start
也有一种简单的写法,如下
不过这种写法比较笼统,没有考虑到输入的字符串与定义的字符串长度不一致的情况
assume cs:code,ds:data
data segment
char db 11,0,11 dup(0),'$'
data ends
code segment
start: mov ah,0AHlea dx,charint 21Hadd dx,2mov ah,09Hint 21Hmov ax,4c00Hint 21H
code ends
end start
持续更新中~~
汇编语言王爽---第四版相关推荐
- 汇编语言 王爽 第四版 第二章 检测点2.2
汇编语言 王爽 第四版 课后检测点 课后实验 持续更新~~ 检测点2.2 给定段地址为0001H,仅通过变化偏移地址寻址,CPU的寻址范围为 0010H 到 1000FH . 最小肯定是偏移地址为0, ...
- 汇编语言 王爽 第四版 实验5
汇编语言 王爽 第四版 课后检测点 课后实验 持续更新~~ 实验5 编写.调试具有多个段的程序 1 编译连接下面程序,用debug加载.跟踪,回答问题. assume cs:code,ds:data, ...
- 汇编语言 王爽 第四版 实验1
汇编语言 王爽 第四版 课后检测点 课后实验 持续更新~~ 文章目录 实验1 查看CPU和内存,用机器指令和汇编指令编程 1 开始执行命令: 2 指令 过程 3 4 实验1 查看CPU和内存,用机器指 ...
- 汇编语言 王爽 第四版 第三章 检测点3.2
汇编语言 王爽 第四版 课后检测点 课后实验 持续更新~~ 检测点3.2 1 补全下面的程序,使其可以将10000H-1000FH中的8个字,逆序拷贝到20000H-2000FH中. mov ax,1 ...
- 汇编语言 王爽 第四版 第六章 检测点6.1
汇编语言 王爽 第四版 课后检测点 课后实验 持续更新~~ 检测点6.1 1 下面的程序实现依次用内存0:0~0:15单元中的内容改写程序中的数据,完成程序: assume cs:codesg cod ...
- 汇编语言 王爽 第四版 前两章学习心得
博客开篇 从大学入学开始,心里就萌生了写博客的想法,奈何自己太懒惰,一直没有付诸于行动.工作后,最近上班还算清闲,故又萌生出了写博客的想法.千里之行,始于足下.谨以此篇博客作为自己的博客开端,文中不足 ...
- 《汇编语言》王爽(第四版) 第十章 实验10
文章目录 前言 一.子程序1 显示字符串 1.实验任务 2.分析 (1)如何在指定位置显示 (2)如何显示指定颜色 (3)保存子程序中用到的寄存器 3.代码 二.子程序2 解决除法溢出的问题 1.实验 ...
- 《汇编语言》王爽(第四版) 第十二章 实验12
文章目录 前言 一.思路分析 1.安装 2.设置中断向量 3.do0程序 4.测试 5.优化 二.最终成果 1.完整代码 2.效果图 总结 前言 本文是王爽老师<汇编语言>(第四版) 第十 ...
- 《汇编语言》王爽(第四版) 第十六章 实验16
文章目录 前言 一.实验任务 二.思路分析 1.程序框架 2.设置前景色 3.设置背景色 三.最终成果 1.完整代码 2.效果图 总结 前言 本文是王爽老师<汇编语言>(第四版) 第十六章 ...
- 《汇编语言》王爽(第四版)第八章 实验7
文章目录 前言 一.题目 二.分析 1.内存分配情况 2.数据结构分析 3.实现思路 (1)设置段寄存器 (2)复制"年份"数据 (3)复制"年总收入"数据 ( ...
最新文章
- 解决小米手机缩放窗口问题
- UNREFERENCED_PARAMETER的作用 (unreferenced formal parameter 警告)
- IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列
- 最懒惰的算法—KNN
- leetcode|第三大的数java题解
- 后端接口重定向_接口自动化面试题,建议收藏!
- win10 iis网站服务器,windows10如何搭建IIS服务器
- loadrunner自学笔记-性能测试的注意要点
- 如何查看Oracle数据库字符集 尚未研究
- 利用ASP.NET MVC源代码调试你的应用程序
- 公司有加密需求,需要试用天锐绿盾,该如何操作?
- 【OpenCV】用sobel算子和Susan算子提取恩智浦智能车赛道边缘
- vue设置右边距_数控CNC雕刻机使用系列之二: 维宏软件的参数设置
- 恶意抢注商标的认定标准是什么?商标被抢注怎么解决?
- Linux 服务器配置 ASF 云挂卡
- 英语学习APP案例分析
- Matlab 可视化世界地图,matlab绘制世界地图的脚本
- 香港和内地重疾险25种常见重疾定义对比全解析
- m1MacBook Pro pycharm打字卡顿问题解决
- Gurobi运筹学开发教程02:基于系数矩阵和右侧项的python+gurobi建模
热门文章
- 打印准考证服务器异常显示,2020准考证打印30个常见问题汇总及解决办法
- csdn 博客代码块显示复制按钮
- 面向初学者的 Android 应用开发基础知识
- 数据库课程设计——学生选课管理系统
- C语言入门练习题-题目+答案
- 主键和外键举例_mysql 基础篇之主键和外键
- 华为服务器欧拉系统怎么改ip,EulerOS系统配置
- as ssd测试软件得分分析,SSD性能评判:教你读懂利用AS SSD BenchMark测试SSD固态硬盘性能的参数-网络教程与技术
-亦是美网络...
- 私生子与假婊子——谈中国手机JAVA游戏
- Centos 7/linux 安装gcc 教程