学习<<汇编语言 -王爽>>,自已完成的一道实试题 (4)

实验10 编写子程序- 第三小题 (材料详见书上209页)

题目描述:

3.数值显示:将二进制数据用十进制显示到屏幕

子程序描述:

名称:dtoc

功能:将word型数据转变为表示十进制的字符串,字符串以0结尾。

参数:(ax)=word型数据

ds:si指向字符串的首地址

返回:无

应用举例:编程将数据12666以十进制的形式在屏幕的8行3列,用绿色显示出来。

12666 = 317AH

10 = 0AH


以下是我解答的完整的代码:

:>----------------------------------------------------------------------------------------

assume cs:codesg, ds:datasg, ss:stacksg

datasg segment

db 16 dup(0)  ;这里用16个字节来保存转换后的每位十进制ASCII码值

datasg ends     ;最后一个字节总为0, 用来定位字符末尾的结束符

stacksg segment

dw 0,0,0,0,0,0,0,0

stacksg ends

codesg segment

start: mov ax, 12666

mov bx, datasg

mov ds, bx

mov bx, stacksg

mov ss, bx

mov sp, 10h  ;初始化栈

mov si, 0

call dtoc

mov dh, 8

mov dl, 3

mov cl, 2

call show_str

mov ax, 4c00h

int 21H

;(用来转成十进制数对应的ASCII码的子程序)

dtoc: push dx

push cx

push bx  ;以上保存子程序中要用到的寄存器

mov si, 0Eh  ;初始化si指向datasg段中倒数第二个字节空间

mov bx, 0Ah  ;bx保存除数,ax各dx中保存了被除数 10

s1: mov dx, 0

div bx

mov cx, ax  ;保存一份ax的值,用cx来检测结果中的商ax是否为0

add dl, 30h  ;由于除数是10 所以结果中的余数一定小于10,取dl就行了

mov byte ptr [si], dl  ;保存对应的十进制数的ASCII值

jcxz ok1  ;如果除以10的商为0表示处理完了

dec si  ;因为要倒序,si从后往前移动

jmp s1

ok1: pop bx

pop cx

pop dx

ret

;(用来在屏幕指定位置显示内容的子程序)

show_str: push es

push ax

push bx  ;以上保存子程序中要用到的寄存器

mov ax, 0B800h  ;显存首地址

mov es, ax

mov al, 160  ;显存中每行所占的字节数(每行能显示80个字符)

mul dh

mov bx, ax

mov al, 2  ;显存中每个显示字符所占的字节数(显示字符=属性字节+ASCII码)

mul dl

add bx, ax  ;此时bx为由参数指定显示位在显存中的首地址

mov ch, 0

mov dl, cl  ;因为要用cx来检测是否处理到字符串的结尾0, 先用dl保存参数cl

s0: mov cl, ds:[si]  ;取出之前处理好的一个字符

jcxz ok0

mov byte ptr es:[bx], cl  ;往显存中存入ASCII码

mov byte ptr es:[bx].1h, dl  ;往显存中存入属性字节

inc si  ;移动到下一个字符

add bx, 2  ;移动到下一个显存字符空间的首地址

jmp s0

ok0: pop bx

pop ax

pop es

ret

codesg ends

end start

:<----------------------------------------------------------------------------------------

总结:

起初还以为可以用8位的除法,测试后发现有溢出,Debug调试发现用8位除法al(最大值为FFH)保存不了4F2H (1266/10) ,还是得改用16位除数来解决溢出。jcxz指令用来处理不知道具体处理次数是很有用...

-------------   以上的习题部分及代码引用于王爽老师的<<汇编语言>>第二版  ----------------

时间: 2024-10-18 14:45:19

学习<<汇编语言 -王爽>>,自已完成的一道实试题 (4)的相关文章

学习&lt;&lt;汇编语言 -王爽&gt;&gt;这本书一段时间,自已完成的一道实试题 (2)

实验9 根据材料编程 (材料详见书上188页) 编程:在屏幕中间分别显示绿色.绿底红色.白底蓝色的字符串 'welcome to masm!' 材料:   80X25彩色字符模式显示缓冲区的结构: 内存地址空间中,B8000H~BFFFFH共32KB的空间,该模式下显示器可以显示25行,每行80个字符,每个字符可以有256种属性(背景色.前景色.闪烁.高亮等组合信息). 这样,一个字符在显示缓冲区中共占两个字节,分别存放字符的ASCII码和属性.80X25模式下,一屏的内容在显示缓冲区中共占40

学习&lt;&lt;汇编语言 -王爽&gt;&gt;,自已完成的一道实试题 (6)

实验13  编写.应用中断例程 第一小题(材料详见书上262页) 题目描述: (1)编写并安装int 7ch中断例程,功能为显示一个用0结束的字符串,中断例程安装在0:200处. 参数:(dh)=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串首地址. 以上中断例程安装成功后,对下面的程序进行单步跟踪,尤其要注意观察int.iret指令执行前后CS.IP和栈中的状态. 以下是我解答的完整的代码: :>-------------------------------------------

汇编语言 王爽

汇编语言 王爽 目录 汇编语言... 1 王爽... 1 第一章:基础知识 第二章:寄存器 第三章 寄存器(内存访问) 第四章 第一个程序 第六章  包含多个段的程序 第七章 更灵活定位内存的方法 第八章 数据处理的两个基本问题 第一章:基础知识 汇编语言:汇编语言是什么?为什么学习汇编语言?学习汇编语言是学习什么? 早起使用机器语言,但机器语言 晦涩难懂也难以使用,所以出现了汇编语言.即用通熟易懂的汇编指令替代全是二进制0和1的机器指令. 于是也就出现了编译器,即把汇编指令翻译成机器指令. 机

汇编语言 王爽第二版 总结

汇编语言 王爽第二版 总结,所以内容都是8086的 summary asssembly ,汇编总结 why: 最初始的编程语言就是使用打孔机,打出来的0 1 代码,然后把卡片插入到电脑中运行然后 看输出结果,这种纯01的二进制代码,编写困难调试困难运行结果的显示看着也很蛋疼,就像 一个简单的"hello world",11个字符,需要11×8个二进制,并且再进行输出,就更麻烦,因为 全部都是二进制,代码.为了更高效的开发程序,就出现了汇编语言,用来代替二进制代码的输入. what: 汇

汇编语言(王爽)pdf

下载地址:网盘下载 <汇编语言(第2版)>是各种CPU提供的机器指令的助记符的集合,人们可以用汇编语言直接控制硬件系统进行工作.汇编语言是很多相关课程(如数据结构.操作系统.微机原理等)的重要基础.为了更好地引导.帮助读者学习汇编语言,作者以循序渐进的思想精心创作了<汇编语言(第2版)>.<汇编语言(第2版)>具有如下特点:采用了全新的结构对课程的内容进行组织,对知识进行最小化分割,为读者构造了循序渐进的学习线索:在深入本质的层面上对汇编语言进行讲解:对关键环节进行深入

汇编语言 王爽著

汇编语言让我们深入了解计算机底层,值得去学习了解. 汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址.在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令.普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植.

汇编语言(王爽) 第1章基础知识

1.1 机器语言 机器语言就是机器指令的集合.机器指令是啥呢?就是一列二进制的数据,计算机把它转成高低电平,使计算机的其他器件驱动并运算.(计算机如何使用2进制语言?) 早期程序都是用机器语言写的,但是有个问题就是太麻烦,数据信息太长,写错一个0或1就会来BUG了. 这种机器语言根本不是人写的,注定会被淘汰. 1.2 汇编语言 这个时候,汇编语言就挺身而出. 汇编语言就是机器语言的便于记忆的格式把 一个指令1000100010001000 表示把寄存器A1的内容弄到寄存器A2上.如下 操作介绍:

汇编语言 王爽著第三章

汇编语言(assembly language)是一种用于电子计算机.微处理器.微控制器或其他可编程器件的低级语言,亦称为符号语言.在汇编语言中,用助记符(Mnemonics)代替机器指令的操作码,用地址符号(Symbol)或标号(Label)代替指令或操作数的地址.在不同的设备中,汇编语言对应着不同的机器语言指令集,通过汇编过程转换成机器指令.普遍地说,特定的汇编语言和特定的机器语言指令集是一一对应的,不同平台之间不可直接移植.

汇编语言(王爽) 第6章包含多个段的程序

程序到了内存中我们分为code(代码)段,也就是大部分指令段,数据段,栈 6.1 在代码段中使用数据 上图 dw表示define word定义一个字,16位 会出现cs执行的前16位是数据段,后面才是指令,所以要把IP设成10h 或者直接在第一条指令前面在start,再在最后面的end start 程序运行的第一条不是汇编指令可能会报错把 6.2 在代码段中使用栈 这的题目都是从内存单元的数据换到另一个内存单元 开始奇怪,为啥不直接换,还要专门定义一个栈空间出来做个中间体 查了资料才知道,内存单