8086汇编程序实例 第1个与第100个求和,第2与第99......

8086汇编程序实例 第1个与第100个求和,第2与第99......,第1张

; 本程序在MASMPlus 12集成环境下通过编译,经过调试,运行正确。

Code Segment

Assume CS:Code,DS:Code

; -------------------------------------

; 功能:显示指定地址(Str_Addr)的字符串

; 入口:

; Str_Addr=字符串地址(要求在数据段)

; 用法: Output Str_Addr

; 用法举例:Output PromptStr

Output MACRO Str_Addr

lea dx,Str_Addr

mov ah,9

int 21h

EndM

; -------------------------------------

BLOCK1 db 100 dup() ;存放单字节之和

BLOCK2 dw 100 dup() ;存放双字节之和

Press_Key db 13,10,13,10,'The complated Press any key to exit$'

Start: push cs

pop ds

push es

push ds

pop es

lea si,Buffer

mov bx,si

add bx,99

lea di,BLOCK1

mov bp,sp

mov cx,50

cld

Addition: lodsb

add al,[bx]

jnc single

mov ah,1

push ax

jmp $+3

single: stosb

dec bx

loop Addition

lea si,BLOCK2

mov cx,bp

sub cx,sp

add si,cx

shr cx,1

storeword: dec si

dec si

pop [si]

loop storeword

pop es

; -------------------------------------

Exit_Proc: Output Press_Key ;提示 *** 作完成,按任意键结束程序

mov ah,1

int 21h

mov ah,4ch ;结束程序

int 21h

org 6000h ;调整偏移量伪指令ORG

Buffer db 100 dup() ;100个单字节无符号数

Code ENDS

END Start ;编译到此结束

stacksegmentstack\x0d\byte256dup(0)\x0d\stackends\x0d\\x0d\datasegment\x0d\C1dw0;空格数\x0d\C2dw0;数字数\x0d\C3dw0;字母数\x0d\C4dw0;其它字符数\x0d\BUFFdb64,0,64dup();接收输入缓冲区,BUFF[0]存储缓冲区大小,BUFF[1]存储实际输入数,BUFF[2]开始为输入的数据\x0d\SHEXDB'0123456789ABCDEF$'\x0d\MSG1db13,10,'space:$'\x0d\MSG2db13,10,'number:$'\x0d\MSG3db13,10,'alpha:$'\x0d\MSG4db13,10,'other:$'\x0d\MSG5db'inputyourdata,endtoinput#',13,10,'$'\x0d\dataends\x0d\\x0d\codesegment\x0d\assumecs:code,ss:stack,ds:data\x0d\START:\x0d\movax,data\x0d\movds,ax\x0d\movax,stack\x0d\movss,ax\x0d\\x0d\callGetInputData;\x0d\\x0d\callCountInputData;\x0d\\x0d\;输出空格数\x0d\movdx,offsetMSG1\x0d\movax,C1\x0d\callPrintLen\x0d\\x0d\;输出数字数\x0d\movdx,offsetMSG2\x0d\movax,C2\x0d\callPrintLen\x0d\\x0d\;输出字母数\x0d\movdx,offsetMSG3\x0d\movax,C3\x0d\callPrintLen\x0d\\x0d\;输出其他数\x0d\movdx,offsetMSG4\x0d\movax,C4\x0d\callPrintLen\x0d\PROCEXIT:\x0d\;程序退出\x0d\movax,4c00h\x0d\int21h\x0d\\x0d\;打印出长度,长度保存在AX里,DX里存储提示信息地址\x0d\PrintLenprocnear\x0d\pushax\x0d\movah,9h\x0d\int21h\x0d\popax\x0d\\x0d\movcx,4\x0d\PRINTLOOP:\x0d\rolax,1\x0d\rolax,1\x0d\rolax,1\x0d\rolax,1\x0d\pushax\x0d\movdl,al\x0d\anddl,0FH\x0d\movbx,offsetSHEX\x0d\addbl,dl\x0d\movdl,byteptr[bx]\x0d\movah,2\x0d\int21h\x0d\popax\x0d\loopPRINTLOOP\x0d\ret\x0d\PrintLenendp\x0d\\x0d\CountInputDataprocnear\x0d\movch,0\x0d\movcl,byteptr[BUFF+1]\x0d\movsi,offsetBUFF+2\x0d\MYLOOP:\x0d\moval,[si]\x0d\incsi\x0d\\x0d\cmpal,20h;''空格\x0d\jeCCOUNT1\x0d\cmpal,'0';'0'\x0d\jlCCOUNT4\x0d\cmpal,'9';'9'\x0d\jleCCOUNT2\x0d\cmpal,'A';'A'\x0d\jlCCOUNT4\x0d\cmpal,'Z';'Z'\x0d\jleCCOUNT3\x0d\cmpal,'a';'a'\x0d\jlCCOUNT4\x0d\cmpal,'z';'z'\x0d\jleCCOUNT3\x0d\CCOUNT4:\x0d\incC4\x0d\jmpNEXTLOOP\x0d\;空格\x0d\CCOUNT1:\x0d\incC1\x0d\jmpNEXTLOOP\x0d\;数字\x0d\CCOUNT2:\x0d\incC2\x0d\jmpNEXTLOOP\x0d\;字母\x0d\CCOUNT3:\x0d\incC3\x0d\jmpNEXTLOOP\x0d\NEXTLOOP:\x0d\loopMYLOOP\x0d\ret\x0d\CountInputDataendp\x0d\\x0d\;获取输出数据,输入数据保存在BUFF里,个数\x0d\GetInputDataprocnear\x0d\movdx,offsetMSG5\x0d\movah,9h\x0d\int21h\x0d\\x0d\movch,0\x0d\movcl,BUFF\x0d\leabx,BUFF+2;\x0d\INPUTLOOP:\x0d\movah,1\x0d\int21h\x0d\cmpal,'#'\x0d\jzEXITINPUT\x0d\cmpal,13;跳过回车符\x0d\jzINPUTLOOP\x0d\cmpal,10;跳过换行符\x0d\jzINPUTLOOP\x0d\incbyteptr[BUFF+1]\x0d\movbyteptr[bx],al\x0d\incbx\x0d\loopINPUTLOOP\x0d\EXITINPUT:\x0d\ret\x0d\GetInputDataendp\x0d\\x0d\codeends\x0d\\x0d\endSTART

DATA SEGMENT

NUM1 DD 12345678H;设定1个32位数作为被加数。加的时候,先加低16位,再加高16位

NUM2 DD 35462790H;设定另1个32位数作为加数。

NUM3 DD ;存32位和

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START:MOV AX,DATA

MOV DS,AX

LEA SI,NUM1

LEA DI,NUM2

LEA DX,NUM3

MOV AX,[SI]

MOV BX,[DI]

ADD AX,BX

MOV [DX],AX;存放低16位和

INC SI

INC SI

INC DI

INC DI

INC DX

INC DX

MOV AX,[SI]

MOV BX,[DI]

ADC AX,BX;计算高16位和时,要考虑低16位相加带来的进位。

MOV [DX],AX;存放高16位和。

HLT

以上为实现该要求的8086汇编语言程序段,最后的和,存放在数据段中的NUM3中。

1、程序如下:

code segment

assume cs:code, ds:code, ss:code

org 100h

main: mov si,offset x ;取数组中第一个元素的内存地址

mov cx,100 ;数组元素个数

cld ;以下使用lodsb来获得各元素值,为此先清除方向标志

xor ah,ah ;因x内全部为无符号数,所以将ah设为0,以便累加(根据 _fmlyht 意见从循环内移出以提高代码效率)

lab1: lodsb ;从ds:si处取一个字节放入al中,同时si增1即指向下个元素

add sum,ax ;累加

loop lab1 ;循环,前面对cx的赋值规定了循环次数为100次

int 20h ;循环结束后sum中为总和,此处用int 20h退出

x db 100 dup () ;定义100个字节型元素的数组,但不指定初值

sum dw 0 ;sum的初值为0,在程序代码部分中没有对该变量进行初始化,所以会使用这里定义的值为总和的初值

code ends

end main

2、代码如下:

cmp ax,bx ;比较ax与bx

jge lab2 ;若ax>=bx则转至lab2,带符号数比较须使用jg(e)/jl(e)/jng/jnl等指令

xchg ax,bx ;根据 _fmlyht 意见,将ax与bx交换,如此,ax中为两者的较大值,bx为较小值

lab2: cmp ax,cx ;执行到此时,ax中有最初时ax与bx中较大者,这时再比较ax与cx

jge lab3 ;方法与前次类似,至lab3时ax将存有原来三者中最大的数

xchg ax,cx ;没有跳转的话需将cx中较大的值与ax中较小的值交换以使ax中含最大值

lab3:

;至此ax中已是三者中的最大值,下面代码是为完成中间值与最小值的排序,使三者从大到小分别存放于ax、bx、cx。原题无此要求,可去掉。

cmp bx,cx

jge lab4

xchg bx,cx

lab4:

;至此,ax>=bx>=cx

----

谢谢楼下 _fmlyht 朋友指正,已在此答案中改进并注明。

当cpu向内存中写入或读出数据时,这个数据也被存储进高速缓冲存储器中。当符合xms规范管理的扩展内存区。其驱动程序为himemsys,ems内存 符合ems,zdhawg。

8086里面提供了一个叫做地址加法器的东西,可以将要访问的地址从16位加工成20位的地址。以这个20位地址为起点CPU可以向后访问64KB的内存,如果需要访问更多地址,则可以用地址加法器生成一个更大的起点地址(段基址),再从此起点向后又可以访问64KB内存。

扩展资料:

Intel 8086拥有四个16位的通用寄存器,也能够当作八个8位寄存器来存取,以及四个16位索引寄存器(包含了堆栈指标)。资料寄存器通常由指令隐含地使用,针对暂存值需要复杂的寄存器配置。它提供64K 8 位元的输出输入(或32K 16 位元),以及固定的向量中断。大部分的指令只能够存取一个内存位址,所以其中一个 *** 作数必须是一个寄存器。运算结果会储存在 *** 作数中的一个寄存器。

参考资料来源:百度百科-8086

以上就是关于8086汇编程序实例 第1个与第100个求和,第2与第99......全部的内容,包括:8086汇编程序实例 第1个与第100个求和,第2与第99......、用8086汇编语言编写程序键盘输入一段字符以#结束,统计其中数字、字母、空格的个数是多少、4个字节无符号数的加法运算 最好能画出流程图,急求,十分感谢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9826936.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存