首页 > 编程语言 >汇编上机-04

汇编上机-04

时间:2022-11-21 09:12:42浏览次数:35  
标签:汇编 04 上机 mov cx call div dec bx

【题目】

  编写汇编程序,在程序中设置两个加数,显示加法算式,用户输入运算结果,给出正确与否的信息。 {提示: 1) 显示十进制数据:书p227 binidec 2) 输入十进制数据:书p200 decibin}

【分析】

   其实这个程序的难点在于10进制的输入和输出!因为相对于01、02、03来说,前面的输入输出都是字符或者字符串,没有考虑到字符转换的问题。

  书上其实给出了很详细的例子,所以这里给出的也是书上的提炼。

  本人技艺不精,如有错误还请指出。

>>>代码部分

 利用封装的思想,将输入和输出抽离出来成为子程序,以简化主程序

1.输入十进制

  我们首先可以知道,(目前已学)汇编要么直接输入字符串,要么直接输入字符(是不是有点C++快速读入的感觉)

  我们采用依次输入字符,将字符转化为数字,在利用“p=p*10+a”的原理,将输入的字符转换为数字

步骤:

  • 输入字符
  • 将该字符-30h
  • 判断该字符是否在数字的范围内,若否则判断为输入别的字符,停止字符转数字的操作,转向ret
  • 是则利用bx保存最终的结果

下见代码

decibin proc near
;从键盘输入一个十进制数,存入BX寄存器
	mov bx,0    ;将bx清空,用于保存数据
newchar:
	mov ah,01h
	int 21h    ;步骤一
	sub al,30h  ;步骤二
	jl exit
	cmp al,09h
	jg exit    ;步骤三
	cbw      ;ax中为目前输入的数值
	xchg ax,bx  ;将ax中的数与bx交换,目的是将原本存在bx中的数扩大10倍
	mov cx,0ah  
	mul cx
	xchg ax,bx  ;换回来,bx扩大了10倍,ax不变
	add bx,ax   ;步骤四
	jmp newchar
exit:
	ret
decibin endp

2.输出十进制

难点在哪呢? 你怎么将一个寄存器里面的数用十进制输出?其实和二进制、十六进制的输出相同,输出十进制依旧是输出字符,只不过我们需要将基数作为10,找出每个数位上的数字,从前往后输出即可

步骤

  • 将除数按照10000、1000、...、1的顺序放入cx中,被除数放在bx中不动,每次进行dec_div时从左往右一位一位输出
  • 除出的商直接输出,余数放在bx中,其实就是将每个数按照10的倍数分解,依次输出

下见代码

binidec proc near
;把BX寄存器中的数以十进制的形式在屏幕上显示出来
	mov cx,10000d
	call dec_div
	mov cx,1000d
	call dec_div
	mov cx,100d
	call dec_div
	mov cx,10d
	call dec_div
	mov cx,1d
	call dec_div
	ret
binidec endp


dec_div proc near
;除法运算:(bx)/(cx)
;入口参数:(bx)=被除数,(cx)=除数
;出口参数:(bx)<--余数,商显示
	mov ax,bx
	mov dx,0
	div cx
	mov bx,dx
	mov dl,al    ;ax里面al即够用本题的余数,所以仅考虑al即可,不用考虑ah
	add dl,30h
	mov ah,02h
	int 21h
	ret
dec_div endp

【完整代码】

data segment
	oper1	dw	12
	oper2	dw	45
	result	dw	?
	right_msg	db	'right',0dh,0ah,'$'
	wrong_msg	db	'wrong',0dh,0ah,'$'
	crlf	db	0dh,0ah,'$'
data ends

code segment
	assume cs:code,ds:data
main proc far

start:
	;段地址送段寄存器
	mov ax, data
	mov ds,ax
	;加法计算,结果存入result
	mov ax,oper1
	add ax,oper2
	mov result,ax
	;显示算式
	mov bx,oper1
	call binidec
	mov ah,02h
	mov dl,2bh
	int 21h
	mov bx,oper2
	call binidec
	mov ah,02h
	mov dl,3dh
	int 21h
	;用户输入运算结果,并显示信息
	call decibin
	mov ah,09h
	lea dx,crlf
	int 21h
	;判断用户输入是否正确,并显示信息
	cmp bx,result
	jz right
	lea dx,wrong_msg
	jmp output
right:
	lea dx,right_msg
output:
	mov ah,09h
	int 21h
	
	mov ax,4c00h
	int 21h
main endp

binidec proc near
;把BX寄存器中的数以十进制的形式在屏幕上显示出来
	mov cx,10000d
	call dec_div
	mov cx,1000d
	call dec_div
	mov cx,100d
	call dec_div
	mov cx,10d
	call dec_div
	mov cx,1d
	call dec_div
	ret
binidec endp


dec_div proc near
;除法运算:(bx)/(cx)
;入口参数:(bx)=被除数,(cx)=除数
;出口参数:(bx)<--余数,商显示
	mov ax,bx
	mov dx,0
	div cx
	mov bx,dx
	mov dl,al
	add dl,30h
	mov ah,02h
	int 21h
	ret
dec_div endp


decibin proc near
;从键盘输入一个十进制数,存入BX寄存器
	mov bx,0
newchar:
	mov ah,01h
	int 21h
	sub al,30h
	jl exit
	cmp al,09h
	jg exit
	cbw
	xchg ax,bx
	mov cx,0ah
	mul cx
	xchg ax,bx
	add bx,ax
	jmp newchar
exit:
	ret
decibin endp
	
code ends

end start

  

 

标签:汇编,04,上机,mov,cx,call,div,dec,bx
From: https://www.cnblogs.com/Qiansui/p/16884582.html

相关文章

  • Ubuntu22.04 安装 K8S
    一、环境软件版本:服务版本操作系统ubuntuserver22.04LTS容器运行时​​containerd.io​​1.6.8-1k8s1.24.5网络插件calico3.24.1节点说明:k8s集群角色IP主机名安装组件......
  • .cfi_* 汇编指示符
    CFI即CallFrameInformation,是DWARF2.0定义的函数栈信息,DWARF即DebuggingWithAttributedRecordFormats,是一种调试信息格式。在人家的汇编文件里头经常看到​......
  • NUCLEO-F042K6驱动的彩色灯环(WS2812)
    NUCLEO-F042K6驱动的彩色灯环(WS2812)NUCLEO-F042K6是STMicroelectronics出品的Nucleo系列开发板之一,MCU为Cortex-M0核心的STM32F042K6。WS2812是常用的集成驱动电路的16M色LE......
  • Jenkins容器<二>---发布springboot项目 20221004
    一、Jenkins容器<->---通过docker安装 20221004 二、Jenkins容器<二>---发布springboot项目 20221004   1、系统配置      安装插件 ......
  • 64位Ubuntu 16.04运行32位程序
    AndroidSDK的部分工具是64位的,部分则是32位的。在64位Xubuntu下安装AndroidSDK后不能运行mksdcard工具,然后AndroidStudio就有问题。在64位Ubuntu下安装32位应用程序所需......
  • Ubuntu 16.04安装Brackets 1.7失败,缺失libgcrypt11,解决办法
    Ubuntu16.04安装Brackets1.7失败,缺失libgcrypt11,解决办法mingdu.zhengatgmaildotcom问题Ubuntu16.04安装Brackets1.7失败,提示缺失libgcrypt11。sudodpkg-iBracke......
  • 图文详解在VMware Workstation 16 PRO虚拟机上安装Ubuntu 22.04.5 linux系统
    一、下载Ubuntulinux系统镜像机构下载地址官网地址https://cn.ubuntu.com/download南京大学https://mirrors.nju.edu.cn/ubuntu-releases/20.04.5/山东......
  • linux系统安装--ubutun20.04
    实验室设备:电脑实验软件:VMvare workstation、系统isoubutun20.04系统安装:1、新建虚拟机   2、设置光驱,加载镜像iso   3、系统安装配置 ......
  • DLGOPENGL-04理论知识
    什么是OPENGL?我们需要知道OpenGL是“开放图形库”的缩写。OpenGL是一种API,它允许我们相对容易地在屏幕上输出图形,而不必确切地知道背景中发生了什么。整个过程在某种程度......
  • 2022-2023-1 20221304 《计算机基础与程序设计》第十二周学习总结
    2022-2023-120221304《计算机基础与程序设计》第十二周学习总结作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP这个作......