; 本程序在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个字节无符号数的加法运算 最好能画出流程图,急求,十分感谢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)