汇编程序正负数及零的个数统计
- 格式:wps
- 大小:45.00 KB
- 文档页数:5
汇编加减乘除
汇编语言是一种底层的计算机语言,用于控制计算机硬件进行加减乘除等基本运算。
加法是指将两个数值相加得到一个和,例如将数值A和数值B相加得到结果C。
在汇编语言中,可以使用ADD指令来进行加法运算。
减法是指从一个数值中减去另一个数值得到一个差值,例如从数值A中减去数值B得到结果C。
在汇编语言中,可以使用SUB指令来进行减法运算。
乘法是指将两个数值相乘得到一个积,例如将数值A和数值B相乘得到结果C。
在汇编语言中,可以使用MUL指令来进行乘法运算。
除法是指一个数值除以另一个数值得到一个商,例如将数值A除以数值B得到结果C。
在汇编语言中,可以使用DIV指令来进行除法运算。
汇编语言中的加减乘除运算可以用不同的寄存器来存储和操作数据。
例如,可以使用AX寄存器来存储一个加法操作的结果,使用BX 寄存器来存储一个减法操作的结果,使用CX寄存器来存储一个乘法操作的结果,使用DX寄存器来存储一个除法操作的结果。
总之,汇编语言提供了丰富的指令和寄存器来进行加减乘除等基本运算,通过合理的组合和操作这些指令和寄存器,可以实现复杂的计算功能。
单⽚机汇编案例之统计正负数个数这是我单⽚机实验作业的源码,统计正负数个数。
写得不好,仅供参考。
如有BUG,欢迎指正。
;;;;本程序从键盘获取输⼊,并统计输⼊的正整数和负整数的个数,结果存于40H、41H;;;;;此处把0归于正数。
数值范围 -128 - 127ORG 00HLCALL GETKEY ;从键盘获取数据,输⼊的必须是⼗进制整数,可带负号,每个整数之间必须有其他字符LCALL Static ;统计正负数个数SJMP $;; 统计正负数个数Static:MOV R1, #30H ;数据地址指针MOV 41H, #00H ;统计正数个数由于统计⽤地址单元与数据区单元很近,数据区最多存放16个数据MOV 40H, #00H ;统计负数个数MOV 90H, R7MOV R2, 90H ;R2存放数据个数WHIL: ;取下⼀个数,判断正负MOV A, @R1JB ACC.7, NegeINC 40H ;正数SJMP IncRNege:INC 41H ;负数IncR:INC R1DJNZ R2, WHILRET;;串⼝通信模式1初始化initmod1:MOV TMOD, #20H ; 设置T1为模式2MOV TL1, #0E8H ; 装⼊定时常数, 波特率1200bit/sMOV TH1, #0E8H ; ⾃动重装MOV SCON, #50H ;设置串⾏通信模式1 ,允许接收SETB TR1 ; 启动T1RET;;;获取键盘输⼊,数据暂存50H, 再转换成数字存进30HGETKEY:LCALL String ;输出提⽰字符串LCALL Input ;获取键盘输⼊的字符串LCALL DeciRET;提⽰字符串:Enter a group decimal integer:MSG: DB 0x45,0x6e,0x74,0x65,0x72,0x20,0x61,0x20,0x67,0x72,0x6f,0x75,0x70,0x20,0x64,0x65,0x63,0x69,0x6d,0x61,0x6c,0x20,0x69,0x6e,0x74,0x65,0x67,0x65,0x72,0x3a,0x00 ;;发送字符串String:LCALL initmod1 ;串⼝通信模式1初始化MOV DPTR, #MSG ;取发送数据区⾸地址Show:CLR AMOVC A, @A+DPTRJZ Finish ;检查字符是否为结束标志0H, A=0,则字符输出完成MOV SBUF, A ;在UART窗⼝显⽰字符CLR TIJNB TI, $INC DPTRSJMP ShowFinish:CLR TR1 ;关闭定时器T1RET;;读取键盘输⼊字符串并存⼊以50H为⾸地址的单元Input:LCALL initmod1 ;串⼝通信模式1初始化MOV R0, #50H ;设接收数据的地址指针为R0Read: ;从UART窗⼝读取数据并打印CLR RIJNB RI, $MOV A, SBUFCJNE A, #0DH, Continue ;检查回车字符0DH, 不是回车继续读取SJMP ReadOver ;回车字符,结束读取Continue: ;打印⽤户输⼊并保存MOV SBUF, A ;打印接收到的数据CLR TIJNB TI, $CJNE A, #08H, Store ;检查退格字符\b, 不是退格,则保存数据DEC R0 ;是退格,数据指针回退SJMP ReadStore:MOV @R0, A ;保存数据INC R0 ;后移数据指针SJMP Read ;循环读取ReadOver: ;读取结束,在字符串后加上结束符0HMOV @R0, #00HCLR TR1 ;关闭定时器RET;;将⾸地址为50H的单元中的字符串转化为⼗进制数,存30H, 个数存R7;;可转化的字符串格式:-12, 30, -45 每个数之间必须有其他字符隔开 -12@34 也⾏表⽰-12和34 Deci:MOV R3, #30H ;R3指向存放⼗六进制数的地址MOV R1, #90H ;R1指向存放中间结果的地址MOV R2, #00H ;R2存放中间结果的位数MOV R0, #50H ;R0指向数据源MOV R7, #00H ;R7存放最后结果个数SJMP WhWhile:INC R0 ;有些分⽀直接跳转过来,R0还没加1,只好这样做了。
计算机组成原理与汇编语言程序设计课后习题及解答徐洁,俸远祯电子工业出版社第1章习题一1.什么是程序存储工作方式?答:计算机的工作方式——存储程序工作方式。
即事先编写程序,再由计算机把这些信息存储起来,然后连续地、快速地执行程序,从而完成各种运算过程。
2.采用数字化方法表示信息有哪些优点?用数字化方法表示信息的优点:(1)抗干扰能力强, 可靠性高。
(2)依靠多位数字的组合,在表示数值时可获得很宽的表示范围以及很高的精度。
(3)数字化的信息可以存储、信息传送也比较容易实现。
(4)可表示的信息类型与范围及其广泛,几乎没有限制。
(5)能用逻辑代数等数字逻辑技术进行信息处理,这就形成了计算机硬件设计的基础。
3.如果有7×9点阵显示出字符A的图像,请用9个七位二进制代码表示A的点阵信息。
4.数字计算机的主要特点是什么?1. (1)能在程序控制下自动连续地工作;(2|)运算速度快;(3)运算精度高;(4)具有很强的信息存储能力;(5)通用性强,应用领域及其广泛。
5.衡量计算机性能的基本指标有哪些?答:衡量计算机性能的基本指标:(1)基本字长——参加一次运算的数的位数;(2)数据通路宽度——数据总线一次能并行传送的位数;(3)运算速度——可用①CPU的时钟频率与主频,②每秒平均执行指令数,③典型四则运算的时间来表示。
(4)主存储器容量——可用字节数或单元数(字数)×位数来表示。
(5)外存容量——常用字节数表示。
(6)配备的外围设备及其性能。
(7)系统软件配置。
7.系统软件一般包括哪些部分?列举你所熟悉的三种系统软件。
系统软件一般包括操作系统,编译程序、解释程序、各种软件平台等。
例如WINDOWS98操作系统,C 语言编译程序等,数据库管理系统。
8.对源程序的处理有哪两种基本方式?对源程序的处理通常有两种处理方式:解释方式和编译方式。
第2章习题二1.将二进制数(101010.01)2 转换为十进制数及BCD码。
信息与通信工程学院微机原理软件实验报告班级:姓名:学号:日期:2011年12月实验一DEBUG的使用 (1)一、实验目的 (1)二、实验内容 (1)三、预习思考 (3)四、实验过程 (4)五、实验总结 (9)实验二分支、循环程序设计 (10)一、实验目的 (10)二、实验内容 (10)三、预习思考 (10)四、实验过程 (10)(一)、流程图 (11)(二)、源代码 (11)(三)、实验分析 (11)五、实验总结 (14)实验三代码转换程序设计 (15)一、实验目的 (15)二、实验内容 (15)三、预习思考 (15)四、实验过程 (16)(一)流程图 (16)(二)模块层次图 (16)(三)源代码 (17)(四)实验分析 (21)五、实验总结 (22)实验四子程序设计 (23)一、实验目的 (23)二、实验内容 (23)三、预习思考 (23)四、实验过程 (24)(一)流程图 (24)(二)模块层次图 (25)(三)源代码 (25)(四)实验分析 (34)五、实验总结 (35)实验五中断程序设计 (37)一、实验目的 (37)二、实验内容 (37)三、预习思考 (37)四、实验过程 (38)(一)流程图 (38)(二)源代码 (39)(三)实验分析 (45)五、实验总结 (46)实验一 DEBUG 的使用一、实验目的1.掌握汇编程序的编辑、编译、连接和执行的全过程;2.学习和掌握用DEBUG调试程序的方法。
二、实验内容1.用编辑软件,输入以下汇编语言源程序:DAT SEGMENTA DB 20B DB 15Y DB 3 DUP(0)Z DB 0,0DAT ENDSSTA SEGMENT STACKDW 50 DUP(?)STA ENDSCOD SEGMENTASSUME CS:COD,DS:DATSTAR PROC FARPUSH DSXOR AX,AXPUSH AXMOV AX,DATMOV DS,AXMOV AX,STAMOV SS,AXMOV AL,AMOV Z,ALMOV Z+1,ALCALL SUB1MOV AL,BMOV Z,ALMOV Z+1,ALCALL SUB1MOV AL,AMOV Z,ALMOV AL,BMOV Z+1,ALCALL SUB1ADD WORD PTR Y,AXADC BYTE PTR[Y+2],0RETSTAR ENDPSUB1 PROCMOV AL,ZMOV AH,Z+1MUL AHADD WORD PTR Y,AXADC BYTE PTR[Y+2],0RETSUB1 ENDPCOD ENDSEND STAR2.通过编译,连接形成可执行文件。
盛年不重来,一日难再晨。
及时宜自勉,岁月不待人。
1.编写统计AX中1、0个数的源程序。
1的个数存入CH,0的个数存入CL。
CODE SEGMENTASSUME CS:CODESTART: MOV CX, 0MOV DX,17AA1: SUB DX, 1JZ AA3SHL AX, 1JNC AA2INC CHJMP AA1AA2: INC CLJMP AA1AA3: MOV AH,4CHINT 21HCODE ENDSEND START2.编写比较两个字符串STRING1和STRING2所含字符是否完全相同的源程序,若相同则显示“MATCH”,若不相同则显示“NO MATCH”。
程序:DATA SEGMENTR1 DB 'MATCH',0AH,0DHR2 DB 'NO MATCH',0AH,0DH STRING1 DB 'XXXXX'N1 EQU $-STRING1STRING2 DB 'YYYYY'N2 EQU $-STRING2DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START: MOV AX,DATAMOV DS,AXMOV AX,N1CMP AX,N2JNZ AA1ADD AX,1LEA SI,STRING1LEA DI,STRING2AA2: MOV BL,[SI]MOV BH,[DI]INC SIINC DISUB AX,1JZ AA3CMP BL,BH JZ AA2JMP AA1AA3: LEA BX,R1 MOV CX,7 AA4: MOV DL,[BX] INC BXMOV AH,2INT 21HLOOP AA4JMP EAA1: LEA BX,R2 MOV CX,10 AA5: MOV DL,[BX] INC BXMOV AH,2INT 21HLOOP AA5INT 21HCODE ENDSEND START3.从键盘读入一个四位的十六进制数,CRT显示等值的二进制数.由于每个十六进制数位对应4个二进制,所以每读入一个十六进制位后,即可将其对应的4个二进制位依次输出。
汇编语言统计输入中各字符出现的次数DATA SEGMENT BUFFER DB 100 DB ? DB 100 DUP(?)CHARS DB 'INPUT:$' DATA ENDS CODE SEGMENT ASSUMECS:CODE,DS:DATA MAIN PROC FAR PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX START: MOV DX,OFFSET CHARS MOV AH,9 INT 21H MOV DX,OFFSET BUFFER MOV AH,0AH INT 21H MOV DL,0AH MOV AH,2 INT 21H MOV DL,0DH MOV AH,2 INT 21H MOV SI,OFFSET BUFFER INC SI MOV AL,[SI] INC SI MOV DL,[SI] MOV DH,[SI]MOV DI,SI MOV CL,AL MOV CH,0 MOV BL,1 MOV BH,0 DEC CL GO1: INC SI CMP DL,[SI] JNE TO1 INC BL TO1: LOOP GO1 CALL OUTPUT MOV BL,1 TO5: INC DIDEC AL CMP AL,1 JE TO3 CMP DH,[DI] JE TO5 MOV DL,[DI] MOV SI,DI MOV CL,AL MOV CH,0 DEC CL GO2: INC SI CMP [SI],DL JNE TO2 INC BL MOV [SI],DH TO2: LOOP GO2 CALL OUTPUT MOV BL,1 JMP TO5 TO3: CMP DH,[DI] JE TO4 MOV DL,[DI] MOV BL,1 CALL OUTPUT TO4: RET MAINENDP ;?------------------------- OUTPUT PROC PUSH AX PUSH CX PUSHF MOV AH,2 INT 21H MOV DL,20H MOV AH,2 INT 21H MOV AL,BL MOV AH,0 MOV CL,10 DIV CL ADD AH,30H ADD AL,30H MOV CH,AH MOVDL,AL MOV AH,2 INT 21H MOV DL,CH MOV AH,2 INT 21H MOV DL,0AH MOV AH,2 INT 21H MOV DL,0DH MOV AH,2 INT 21H POPF POP CX POP AX RET OUTPUT ENDP CODE ENDS END MAIN ;?-----------------第1页共1页。
分类统计字符个数00一、实验目的000通过编程实现字符进行分类统计。
00利用DOS功能调用INT 21H的10(0Ah)号功能,掌握进行键盘输入字符串的方法以及数据区设置。
00掌握8086指令: CMP、JB、JA、SHL、INC、LEA、INT、JNZ、SCASB、LOOPE/LOOPNE等。
00二、实验内容0001、编写一个程序实现将数据段中存储在STRING处到NUM处的字符串进行分类统计,然后将结果存入以letter、digit和other为名的存储单元中。
查找字符串STRING中是否有空格,如有找出第一个出现的位置(先用十六进制显示,后修改为十进制显示),否则输出N。
002、修改前述1的程序,实现从键盘输入一个以回车键作为结束符的字符串(字符个数不超过80个),存入BUF中,分类统计BUF中字符串,将结果存入以letter、digit和other为名的存储单元中,屏幕输出大小写字母个数、数字个数和其它字符个数,并查找字符串BUF中是否有空格,如有找出第一个出现的位置(用十进制显示),否则输出N。
(对有余力的同学)00实验结果:00DEBUG 调试并查看结果的正确性。
000对存储区STRING的内容“12ABCDE#!@Y(78)=(1).”000屏幕显示:00N00对存储区STRING的内容“12ABCD E#! @Y(78)=(1).”000屏幕显示:00Place=700对第2部分,如键盘输入0012ABCDE# 3456789143!@Y(78)=(1).回车000输出结果:00Letter=6000Digit=1500Other=900Place=900三、分析与体会00本次实验我花了较长的时间来完成。
初略的程序花了5个多小时完成。
后来遇到转换为十进制的时候就卡住了。
后来在第六周周三的时候听了课以后才会做。
00第一个代码很长,有340多行代码。
其实核心代码不多。
主要是每一次转换为16进制以及10进制的时候,重复了相同的代码。
4.1、判断下列标识符的合法性。
1)、code 合法2)、Data 合法3)、ABCDH 合法4)、1abcH 不5)、eax 不6)、01 合法7)、A?@ 合法8)、www@zsu 合法9)、***********.cn不10)、AX$DX 合法11)、_BX 合法12)、CX 不4.2、按下面要求写出相应的数据定义语句(未指定变量名的,可任意指定或省缺)。
1)、定义一个字节区域,第一个字节的值为20,其后跟20个初值为0的连续字节;DB 20,20 DUP(0)2)、定义一个以0为结束符的字符串,其初值为:The course is easy;DB “The course is easy”,03)、定义一个以'$'为结束符的字符串,该串中含有换行符和回车符;DB 0D,0A,”$”4)、定义100个字,其初值为0;DW 100 DUP(0)5)、从一个偶地址开始定义一个字变量word;EVENWORD DW ?6)、先定义一个字符串String,其偏移量指定为10,其初值为"ABCDEF",然后再定义3个字类型的数组Data,要求String和Data的偏移量相同;ORG 10STRING DB "ABCDEF"ORG 10DATA DW 3 DUP(?)7)、定义一个字符串String,其初值为"12345678",再定义4个字类型的数组Data,要求String和Data共享同一片内存单元;STRING DB "12345678"ORG $-8DATA DW 4 DUP (?)4.3、把下列C语言的变量定义语句改写成与之等价的汇编语言语句。
1)、char ch1, ch2[3], ch3[]="Are you ready?", ch4='Q';CH1 DB ?CH2 DB 3 DUP (?)CH3 DB "Are you ready?",0CH4 DB “Q”2)、int w1, w2[5], w3=0x1234, w4[]={90, 89, 432, 344};W1 DW ?W2 DW 5 DUP (?)W3 DW 1234HW4 DW 90,89,432,3443)、long int d1=1234, d2, d3[10], d4[]={1, 2, 3, 4, 5, 6};D1 DD 1234D2 DD ?D3 DD 10 DUP(?)D3 DD 1,2,3,4,5,64.4、假设4.3题中三组变量在内存中是连续存放的,且变量ch1的偏移量是20H,试求出其它每个变量的偏移量。
汇编语言程序设计试题及答案1.对于有符号的数来说,下列哪个值最大()A:0F8HB:11010011BC:82 D:123Q2.下列有关汇编语言中标号的命名规则中,错误的是()A:通常由字母打头的字符、数字串组成B:标号长度不能超过31个字符C:?和$不能单独作为标号D:.号不可位于标号首3.8088/8086存储器分段,每个段不超过()A.64K个字B.32K个字节C.1兆个字节D.64K个字节4.寻址指令MOV CX, [BX + DI + 20]使用的是哪一种寻址方式()A:寄存器寻址B:相对基址变址寻址C:变址寻址D:基址变址寻址5.若AX= - 15要得到AX=15应执行的指令是()A.NEG AXB.NOT AXC.INC AXD.DEC AX6.8086/8088系统执行传送指令MOV时()A.不影响标志位B.影响DF方向标志C.影响SF符号标志D.影响CF进位标志7.若要求一个操作数中的若干位维持不变,若干位置“1”,可以使用()A:NOT B:OR C:AND D:XOR8.下列指令中段默认为堆栈段的是()A.MOV AX,[BX+SI+10]B.ADD AX,ES:[SI]C.SUB [BX],[BP][DI]D. MOV DX,[1000H]9.关于8086/8088微机系列,下列说法哪个是正确的()A:一个存储单元由16个二进制位组成,简称字。
B:当存储一个字数据时,低字节放高地址位,高字节放低地址位。
C:在内存空间中,可以无限分配段,且段的大小不受限制。
D:段与段之间可以邻接,也可以重叠。
10.下列关于堆栈的说法,错误的是()A:以“先入后出”为原则。
B:栈区最高地址单元的前一个单元为栈底。
C:运行中SP寄存器动态跟踪栈顶位置。
D:压栈和弹出都是以字节为单位。
11.表示过程定义结束的伪指令是()A.ENDPB.ENDSC.ENDD.ENDM12.BUF1 DB 3 DUP(0,2 DUP (1,2),3)COUNT EQU $-BUF1符号COUNT等价的值是()A.6B.18C.16D.913.下列标志位中,可以用来判断计算结果正负的是()A:PF B:SF C:DF D:OF14.下列指令正确的是()A. MOV [100H], [BX]B.MOV DS, ESC. ADD V[BX], CXD.MOV AX, 34H15.下列哪个寄存器是属于指针寄存器()A:SI B:DX C:SP D:ES二、填空题 (每小题4 分,共 20 分)1.下列程序段求数组FLD的平均值,结果在AL中。
汇编-加减法指令算术运算、逻辑运算与移位操作指令加法运算类指令加法指令普通加法指令ADD影响 6 个标志位带进位加法指令ADC影响 6 个标志位加 1 指令INC影响 5 个标志位不会影响CF使⽤ADC之前要先把CF清零INC的操作数不可以是段寄存器和⽴即数求内存数据段中M1 和M2 为⾸的两个 20 字节数之和,并将结果写⼊M2 为⾸的区域中按照字节运算LEA SI, M1LEA DI, M2MOV CX, 20CLC ; 使CF = 0NEXT: MOV AL, [SI]ADC [DI], ALINC SIINC DIDEC CXJNZ NEXTHLT按照字运算LEA SI, M1LEA DI, M2MOV CX, 10CLC ; 使CF = 0NEXT: MOV AX, [SI]ADC [DI], AXADD SI, 2ADD DI, 2DEC CXJNZ NEXTHLT减法运算类指令SUB:对标志位的影响与ADD相同SBB:对标志位的影响与INC相同对操作数的要求及对标志位的影响与SUB相同SUB:OPRD1 −OPRD2 −CF−−−−>OPRD1DEC对操作数的要求及对标志位的影响与INC相同应⽤程序例; 程序功能:延时(定时)MOV BL, 2NEXT1: MOV CX, 0FFFFH ; 0是为了让计算机识别这是⼀个16进制数字NEXT2: DEC CXJNZ NEXT2 ;ZF=0 转NEXT2DEC BLJNZ NEXT1 ; ZF=0 转NEXT1HLT ;暂停执⾏NEG指令NEG OPRD8/16位寄存器或存储器操作数0 −OPRD−−−−>OPRD因此这个指令⼜叫求补指令Processing math: 100%执⾏NEG指令之后,⼀般情况下都会使得CF为 1 ,除⾮给定的操作数为零才会使CF为 0当指定的操作数的值为 80H(−128) 或者 8000H(−32768) ,则执⾏NEG指令后结果不变,但OF置⼀,其他情况下OF均置零CMP指令CMP OPRD1,OPRD2操作OPRD1 −OPRD2指令执⾏的结果不影响⽬标操作数,仅影响标志位常⽤于⽐较两个数字的⼤⼩两个⽆符号数的⽐较CMP AX,BX若AX≥BX则CF=0若AX<BX则CF=1若AX=BX则CF=0,ZF=1两个带符号数的⽐较CMP AX,BX两个数字的⼤⼩由OF和SF共同决定OF和SF状态相同AX≥BXOF和SF状态不同AX<BX(异或相同不同)CMP指令⽰例LEA BX, MAXLEA SI, BUFMOV CL, 20MOV AL, [SI]NEXT : INC SICMP AL, [SI]JNC GOON ; CF=0转移XCHG [SI], ALGOON: DEC CLJNZ NEXTMOV [BX], ALHLT程序功能在 20 个数字中寻找最⼤值并放⼊MAX。
汇编语⾔(五)——算术运算类指令汇编语⾔(五)—— 算术运算类指令算术运算类指令状态标志是处理器的基本标志,⼀⽅⾯作为加减运算和逻辑运算的辅助结果,另⼀⽅⾯可以构成各种条件,实现程序分⽀。
五个基本的状态标志分别为进位标志CF、溢出标志OF、零标志ZF、符号标志SF和奇偶标志PF。
算术运算对数据进⾏加减乘除,是基本的数据处理⽅法,加减运算有“和”或“差”的结果的同时,还有进借位、溢出等状态标志是结果的⼀部分。
进位和溢出标志处理器按照⽆符号整数求得结果,设置进位标志CF、溢出标志OF。
汇编程序员在计算⽆符号数时,应关⼼进位标志;在计算有符号数时,应关注溢出标志。
进位标志CF(Carry Flag)当加减法运算结果的最⾼有效位有进位(加法)或借位(减法)时,进位标志置为1,即 CF = 1;否则 CF = 0。
1. 针对⽆符号整数,判断加减结果是否超出表达范围(⽆符号整数的表达范围:N位⽆符号整数的表达范围位0 -1,如8位⽆符号整数的表达范围为0 255,16位⽆符号整数的表达范围为0 65535,32位⽆符号整数的表达范围位0-1)。
2. 有进位时,加上进位或借位后运算结果仍然正确。
; ⽆进位, CF = 0; 8 位 2进制 两位 16 进制 10 进制00111010 3A 58+ 01111100 + 7C + 124= 10110110 = B6 = 182; 有进位, CF = 1; 8 位 2进制 两位 16 进制 10 进制10101010 AA 170+ 01111100 + 7C + 124= 100100110 = 126 = 294 = 256 + 38 ; 结果为低位部分,即 38溢出标志OF(Overflow Flag)有符号数加减结果有溢出,则OF = 1;否则 OF = 0。
∼2N ∼∼∼2321. 针对有符号整数,判断加减结果是否超出表达范围(有符号整数(补码)的表达范围:N位有符号整数的表达范围位- -1,如8位有符号整数的表达范围为-128 127,16位有符号整数的表达范围为-32768 32767,32位有符号整数的表达范围位-1)。
实验二统计数据个数程序一、实验目的:掌握将多位十六进制数转换成多位十进制数ASCII码的方法。
二、实验内容:统计内存数组中大于0和小于0的元素个数,并将统计结果分别存放在LRESULT和HRESULT变量中,并显示个数。
三、程序流程图:程序流程如图2.5所示。
四、编写源程序如下:DATA SEGMENTARY DB 1,3,-1,2,6,-9,-5,7,8,1,3,8,-6,8,-9,-7,2,4,-3,-3 DB -4,7,7,8,3,1,3,6,8,5,5,6,4,5,7,-4,2,4,5,-7,5,4 DB 2,5,7,8,8,8,7,6,-5,4,3,2,1,-1,2,2,3,-4,5,6,7N=$-ARYLRESULT DW 0HRESULT DW 0TJJG DB 'STATISTICS RESULT:',0DH,0AH,'$'DATA ENDSCODE SEGMENTASSUME CS:CODE, DS:DATASTART: MOV AX,DATAMOV DS,AXMOV ES,AXSHOW MACRO BPUSH DXPUSH AXMOV DX,BMOV AH,02HINT 21HPOP AXPOP DXENDMXOR CX,CXMOV CX,NLEA SI,ARYLOP: MOV AL,[SI]CMP AL,0JNS PLUSINC LRESULTJMP CONTPLUS: INC HRESULTCONT: INC SILOOP LOPLEA DX,TJJGMOV AH,09HINT 21HSHOW '+'MOV AX,HRESULTCALL DISPLSHOW 0DHSHOW 0AHSHOW '-'MOV AX,LRESULTCALL DISPLMOV AX,4C00HINT 21HDISPL PROCPUSH DXPUSH AXMOV CX,10MOV DX,00HMOV BX,00HDIV CXMOV BX,DXADD AL,30HDISPL1: MOV DL,ALMOV AH,02HINT 21HMOV DL,BLADD DL,30HMOV AH,02HINT 21HPOP AXPOP DXRETDISPL ENDPCODE ENDSEND START编写完源程序后,保存为后缀为“TONGJI.ASM”文件。
C语言中的正负数以及数值溢出C语言中的正负数以及数值溢出在数学中,数字有正负之分。
在C语言中也是一样。
下面是店铺分享的C语言中的正负数以及数值溢出,欢迎大家参考!在C语言中,short、int、long 都可以带上符号,例如:short a = -10; //负数int b = +10; //正数long c = (-9) + (+12); //负数和正数相加如果不带正负号,默认就是正数。
符号也要在内存中体现出来。
符号只有正负两种情况,用1位就足以表示,这1位就是最高位。
以int 为例,它占用32位的内存,0~30位表示数值,31 位表示正负号。
如下图所示:在编程语言中,计数往往是从0开始,例如字符串 "abc123",我们称第 0 个字符是 a,第 1 个字符是 b,第 5 个字符是 3。
这和我们平时从 1 开始计数的.习惯不一样,大家要慢慢适应,培养编程思维。
在符号位中,用0表示正数,用1表示负数。
例如int 类型的-10、+16 在内存中的表示如下:如果不希望设置符号位,可以在数据类型前面加 unsigned,如下所示:unsigned short a = 12;unsigned int b = 1002;unsigned long c = 9892320;这样,short、int、long 中就没有符号位了,所有的位都用来表示数值。
也就意味着,使用了unsigned 只能表示正数,不能表示负数了。
如果是unsigned int,那么可以省略 int ,只写 unsigned,例如:unsigned n = 100;它等价于:unsigned int n = 100;输出无符号数使用%u,代码如下:#include #include int main(){ int a1 = 1234, a2 = -1234;unsigned int b1 = 5678, b2 = -5678; printf("a1=%d, a1(u)=%u ", a1, a1); printf("a2=%d, a2(u)=%u ", a2, a2); printf("b1=%d, b1(u)=%u ", b1, b1); printf("b2=%d, b2(u)=%u ", b2, b2); return 0;}输出结果:a1=1234, a1(u)=1234a2=-1234, a2(u)=4294966062b1=5678, b1(u)=5678b2=-5678, b2(u)=4294961618可以发现,无论变量声明为有符号数还是无符号数,只有当以 %u 格式输出时,才会作为无符号数处理;如果声明为unsigned 却以d% 输出,那么也是有符号数。
STACK SEGMENT STACK 'STACK'
DW 100H DUP(?)
TOP LABEL WORD
STACK ENDS
DA TA SEGMENT
NOTE0 DB 'DATA: ',0DH,0AH,'$'
NOTE1 DB 0DH,0AH,'GTEATZ $'
NOTE2 DB 0DH,0AH,'ZERO $'
NOTE3 DB 0DH,0AH,'LITTLEZ $'
BUFFER DW 14,-8,9,0,8,-3,-8,22,34,-24,21,46,75,23,-33
GREATZ DW ?
ZERO1 DW ?
LITTLEZ DW ?
MESS1 DB 0DH,0AH,'NAME:WUY AOZENG NO:12041215',0DH,0AH,'$' MESS2 DB 'NAME:XUTAO NO:12041429',0DH,0AH,'$'
OUT_STR DB 150 DUP('$')
DA TA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DA TA,ES:DA TA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV AX,STACK
MOV SS,AX
LEA SP,TOP
XOR AX,AX
MOV GREATZ,AX
MOV ZERO1,AX
MOV LITTLEZ,AX
MOV CX,14
LEA SI,BUFFER+2
ST_COUNT:
MOV AX,[SI]
ADD SI,2
AND AX,AX
JLE COUNT1
INC GREATZ
JMP COUNT3
COUNT1:
JL COUNT2
INC ZERO1
JMP COUNT3
COUNT2:
INC LITTLEZ
COUNT3:
DEC CX
JNZ ST_COUNT
LEA DX,NOTE0
MOV AH,09H
INT 21H
LEA BX,BUFFER
MOV CX,14
ADD BX,2
D2A:
MOV AX,[BX] ;读出二进制数放在AX中
CALL DEC2ASC ;调用转化和打印过程
MOV DL,' ' ;输出空格
MOV AH,2
INT 21H
ADD BX,2 ;后移
LOOP D2A
MOV DX,OFFSET NOTE1
MOV AH,9
INT 21H
MOV AX,GREATZ
CALL DEC2ASC
MOV DX,OFFSET NOTE2
MOV AH,9
INT 21H
MOV AX,ZERO1
CALL DEC2ASC
MOV DX,OFFSET NOTE3
MOV AH,9
INT 21H
MOV AX,LITTLEZ
CALL DEC2ASC
MOV AH,09H
LEA DX,MESS1
INT 21H
MOV AX,4C00H
MOV AH,09H
LEA DX,MESS2
INT 21H
MOV AX,4C00H
MOV AH,4CH
INT 21H
;===================================================================== ===
DEC2ASC PROC
PUSH BX ;保护
PUSH CX
LEA DI,OUT_STR ;将处理后的放入DI
MOV DX,DI
CMP AX,0
JNE NON_0
ZERO: MOV BYTE PTR[DI],'0' ;如果是0
MOV BYTE PTR[DI+1],'$'
JMP OUT_ASC
NON_0: TEST AX,8000H ;不是0
JZ PTIVE ;判断符号,是正号跳转
NTIVE: NEG AX ;取反
MOV BYTE PTR[DI],'-' ;置负号
JMP CON
PTIVE: MOV BYTE PTR[DI],'+' ;置正号
CON: INC DI
MOV DX,0
MOV CX,10000 ;万位
IDIV CX ;带符号数除法
ADD AL,30H
MOV byte ptr[DI],AL
MOV AX,DX
MOV DX,0
MOV CX,1000 ;千位
IDIV CX
ADD AL,30H ;加30H变成ASCII
MOV byte ptr[DI+1],AL ;写入
MOV AX,DX
MOV CL,100 ;百位
IDIV CL
ADD AL,30H
MOV byte ptr[DI+2],AL
MOV AL,AH
MOV AH,0
MOV CL,10 ;十位
IDIV CL
ADD AL,30H
MOV BYTE PTR[DI+3],AL
ADD AH,30H
MOV BYTE PTR[DI+4],AH ;个位
OUT_SIG:LEA DI,OUT_STR
MOV DL,BYTE PTR[DI]
MOV AH,2
INT 21H
INC DI
MOV DX,DI
B2: CMP BYTE PTR[DI],'0'
JNE OUT_ASC
INC DI
INC DX
JMP B2
OUT_ASC:MOV AH,09H ;打印
INT 21H
POP CX
POP BX
XOR AX,AX
RET
DEC2ASC ENDP
;====================================
CODE ENDS
END START
实验结果:。