汇编语言1加到n

合集下载

用汇编语言实现从1加到100的方法(1+2+...+100)

用汇编语言实现从1加到100的方法(1+2+...+100)

⽤汇编语⾔实现从1加到100的⽅法(1+2+ (100)⽤汇编语⾔实现1+2+...+100;课堂作业;计算1+2+...+100DATA SEGMENTCOUNT DW 0 ;计数DATA ENDSSTACK SEGMENT PARA STACKBUF DW 20H DUP (0)LEN EQU $-BUFSTACK ENDSCODESEG SEGMENTASSUME CS:CODESEG,SS:STACK,DS:DATASTART:;初始化堆栈段ss和数据段dsMOV AX,STACKMOV SS,AXMOV SP,LENMOV AX,DATAMOV DS,AXMOV CX,64H ;循环100次MOV AX,0S:ADD COUNT,01HADD AX,COUNTLOOP SMOV DL,ALMOV AL,AHCALL DISP_2_HEXMOV AL,DLCALL DISP_2_HEXCALL DISP_CREFMOV AH,4CHINT 21H;将AL的⾼四位与低四位分别输出DISP_2_HEX:PUSH AXPUSH BXPUSHFMOV AH,0 ;清零MOV BL,10H ;作除法DIV BL ;AL :商⾼位 AH 余数低位CALL DISP_1_HEX ;输出AL的结果MOV AL,AHCALL DISP_1_HEXPOPFPOP BXPOP AXRET;输出AL的数字和字母DISP_1_HEX:PUSH AXPUSH DXPUSHFMOV DL,ALCMP DL,09JBE L_1 ;⼩于等于9则跳过下⼀条语句ADD DL,27H ;⼤于10则转换为⼩写字母并执⾏到下⾯的L_1的RET结束;数字10与字符a差为39(27H);数字输出(1的ascii码为31H)L_1:ADD DL,30H ;数字转换为字符MOV AH,02HINT 21HPOPFPOP DXPOP AXRET;输出回车换⾏DISP_CREF:PUSH DXPUSH AXMOV AH,02HMOV DL,0DHINT 21HMOV DL,0AHINT 21HPOP AXPOP DXRETCODESEG ENDSEND START输出结果为13ba(5050的⼗六进制)以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

x86汇编程序 加法例子

x86汇编程序 加法例子

x86汇编程序加法例子x86汇编语言是一种低级程序设计语言,用于编写计算机程序的一种机器语言。

在x86汇编语言中,加法是最基本的算术运算之一。

下面将列举10个符合要求的x86汇编程序加法例子,并对每个例子进行详细解释。

1. 例子一:```assemblysection .datanumber1 dd 10number2 dd 20result dd 0section .textglobal _start_start:mov eax, [number1] ; 将number1的值加载到寄存器eax 中add eax, [number2] ; 将number2的值加到eax寄存器中 mov [result], eax ; 将eax寄存器中的值保存到result 中; 输出结果mov eax, 4 ; 系统调用编号为4,表示输出mov ebx, 1 ; 文件描述符为1,表示标准输出mov ecx, result ; 输出的字符串地址mov edx, 4 ; 输出的字符串长度int 0x80 ; 系统调用; 退出程序mov eax, 1 ; 系统调用编号为1,表示退出程序 xor ebx, ebx ; 退出码设置为0int 0x80 ; 系统调用```此程序通过使用`mov`和`add`指令来实现加法运算。

首先,将`number1`和`number2`的值加载到寄存器`eax`中,然后使用`add`指令将两个值相加,将结果保存在`eax`中,最后将结果输出到标准输出。

2. 例子二:```assemblysection .datanumber1 db 10number2 db 20result db 0section .textglobal _start_start:mov al, [number1] ; 将number1的值加载到寄存器al中 add al, [number2] ; 将number2的值加到al寄存器中mov [result], al ; 将al寄存器中的值保存到result 中; 输出结果mov eax, 4 ; 系统调用编号为4,表示输出mov ebx, 1 ; 文件描述符为1,表示标准输出mov ecx, result ; 输出的字符串地址mov edx, 1 ; 输出的字符串长度int 0x80 ; 系统调用; 退出程序mov eax, 1 ; 系统调用编号为1,表示退出程序 xor ebx, ebx ; 退出码设置为0int 0x80 ; 系统调用```此程序使用的是8位寄存器`al`进行加法运算。

汇编语言系列之汇编实现简单数学运算

汇编语言系列之汇编实现简单数学运算

汇编语⾔系列之汇编实现简单数学运算⽬录1.计算S=1+2×3+3×4+4×5+···+N(N+1)1.1设计要求:1.2设计思路:1.3程序清单:1.4程序运⾏结果及分析:2.计算N!2.1设计要求:2.2设计思路:2.3程序清单:2.4程序运⾏结果及分析:软件:emu8086语⾔:汇编语⾔(Assembly)注意:本⽂列出了两种算术运算的代码,全部代码为博主独⾃⼀⼈编写,会有瑕疵,谨慎使⽤。

1.计算S=1+2×3+3×4+4×5+···+N(N+1)1.1设计要求:设计程序,实现数学公式S=1+2×3+3×4+4×5+···+N(N+1)的算法。

数值N由加键盘输⼊,计算结果在显⽰终端输出。

设计要求:计算结果不超过⼗六位寄存器的存储能⼒,如有溢出提⽰错误。

1.2设计思路:输⼊N值然后把N给BH作为循环次数,通过循环实现乘和累加计算,结果为⼗六进制,通过除以10得到⼗进制,存⼊堆栈再依次输出。

1.3程序清单:DATA SEGMENTpkey DB 0dh,0ah,"pleas input N end by ';' :$"over DB 0AH,0DH,"overflow!",0dh,0ah,'$'result DB 0dh,0ah,'result is:','$'DAT1 DB 8 DUP(0)DATA ENDSSTACK SEGMENTSSTACK DB 100 DUP(0)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTATE:MOV AX,DATAMOV DS,AXLEA SI,DAT1 ;开辟缓冲区LEA DX,pkeyMOV AH,9INT 21H ;DOS功能调⽤,输出字符串LLP:MOV AH,1INT 21H ;DOS功能调⽤,输⼊N值SUB AL,2FHINC DX ;DX计数MOV [SI],AL ;将输⼊的数据存在SI缓冲区INC SICMP AL,0CH ;输⼊为封号结束输⼊JNZ LLPSUB SI,2CMP DX,02H ;DX不为2表⽰输⼊为两位数JNZ LLLPLLP1:MOV CX,1MOV BL,2 ;赋初始值JMP LPLLLP:MOV DI,SISUB DI,1SUB [DI],1MOV AL,10MUL [DI]ADD [SI],AX ;输⼊是两位数时⼗位乘10加个位SUB AH,AHJMP LLP1LP: MOV BH,[SI] ;把循环次数给BHMOV AL,BLINC BLMUL BL ;BL(加1)和AL(原值)相乘给AXADD CX,AX ;AX和CX相加给CX,通过循环实现累加JO OOF ;如果溢出重新输⼊CMP BH,BL ;判断是否达到N值JNZ LPMOV AX,CXMOV CX,0AHMOV BX,0LOP:MOV DX,0DIV CX ;AX表⽰的32位数除以10,商放在AX,余数放在DX INC BXADD DX,30HPUSH DX ;将余数依次压⼊栈CMP AX,0JNZ LOP ;商不为0继续除10LEA DX,resultMOV AH,9INT 21H ;DOS功能调⽤,输出字符串OUTPUT:POP DXMOV AH,2INT 21H ;DX中数据依次出栈并显⽰DEC BXJNZ OUTPUT ;出栈完成后停⽌JMP STATEOOF:LEA DX,overMOV AH,09HINT 21H ;DOS功能调⽤,溢出显⽰JMP STATECODE ENDSEND STATE1.4程序运⾏结果及分析:乘法和累加计算根据流程图⼀步步赋值即可得到,在输⼊两位数和结果转⼗进制输出时遇到了⿇烦,通过查找资料不断尝试,最终找到了简单的解决办法,即输⼊两位时移位累加,输出除以10存⼊堆栈并依次输出显⽰。

汇编语言指令大全.

汇编语言指令大全.
CWD
字扩展指令 CWD(Convert Word to Double Word)
格式: CWD
功能: 将字扩展为双字长,即把AX寄存器的符号位扩展到DX中.
说明:
1. 两个字或字节相除时,先用本指令形成一个双字长的的被除数.
2. 本指令不影响标志位.
3. 示例: 在B1、B2、B3字节类型变量中,分别存有8们带符号数a、b、c,实现(a*b+c)/a运算。
2. AAA的调整操作
若(AL) and 0FH>9 或 AF=1,则调整如下:
(AL)<--(AL)+6,(AH)<--(AH)+1,AF=1,CF<--AF,(AL)<--(AL) and 0FH
AAD
未组合十进制数除法调整指令 AAD(ASCII Adjust for Division)
格式: AAD
在除法指令前对ax合十进制数进行调整以便能用div指令实现两个未组合的十进制数的除法运算其结果为未组合的十进制数商在al中和余数在ahaad指令是在执行除法div之前使用的以便得到二进制结果存于al然后除以oprd得到的商在al中余数在ah示例
AAA
未组合的十进制加法调整指令 AAA(ASCII Adgust for Addition)
3. 加法指令运算的结果对CF、SF、OF、PF、ZF、AF都会有影响.以上标志也称为结果标志.
4. 该指令对标志位的影响同ADD指令.
ADD
加法指令 ADD(Addition)
格式: ADD OPRD1,OPRD2
功能: 两数相加
说明:
1. OPRD1为任一通用寄存器或存储器操作数,可以是任意一个通用寄存器,而且还可以是任意一个存储器操作数.

汇编语言典型例子详解汇编语言例子

汇编语言典型例子详解汇编语言例子

汇编语言典型例子详解汇编语言例子汇编语言典型例子详解汇编语言是一种底层的编程语言,用于与计算机硬件进行交互和控制。

在计算机科学领域,学习汇编语言例子可以帮助我们深入了解计算机的工作原理和底层运行机制。

本文将详细解析几个典型的汇编语言例子,帮助读者更好地理解和掌握汇编语言编程。

1.加法运算的例子假设我们需要编写一个汇编语言程序来实现两个数字的加法运算。

以下是一个典型的汇编语言例子:```assemblysection .datanum1 db 5num2 db 3result db 0section .textglobal _start_start:mov al, [num1] ; 将num1的值加载到寄存器al中add al, [num2] ; 将num2的值与al中的值相加mov [result], al ; 将结果保存到result中; 输出结果到屏幕mov ah, 0x0E ; 设置打印字符的功能码mov al, [result] ; 将结果加载到al寄存器中add al, 30h ; 将结果加上字符'0'的ASCII码,使其变为可打印字符 int 10h ; 调用BIOS中断打印结果; 退出程序mov eax, 1 ; 设置退出系统调用号int 0x80 ; 调用系统调用中断退出程序```上述例子使用了汇编语言的指令和寄存器来完成加法运算,并将结果保存到result变量中。

最后,通过BIOS中断调用将结果打印到屏幕上,并使用系统调用中断退出程序。

2.循环控制的例子下面是一个使用汇编语言编写的简单循环控制的例子:```assemblysection .datacount db 10 ; 循环次数sum db 0 ; 计数器section .textglobal _start_start:xor rcx, rcx ; 清零计数寄存器rcxloop_start:cmp cl, [count] ; 比较计数寄存器和循环次数je loop_end ; 若相等,跳转到循环结束add cl, 1 ; 计数器自增1add [sum], cl ; 将计数器的值加到sum中jmp loop_start ; 无条件跳转到循环开始loop_end:; 输出结果到屏幕mov ah, 0x0E ; 设置打印字符的功能码mov al, [sum] ; 将sum加载到al寄存器中add al, 30h ; 将结果加上字符'0'的ASCII码,使其变为可打印字符 int 10h ; 调用BIOS中断打印结果; 退出程序mov eax, 1 ; 设置退出系统调用号int 0x80 ; 调用系统调用中断退出程序```上述例子使用了循环控制指令来实现对计数器和循环次数的操作。

用汇编语言编写的程序

用汇编语言编写的程序

用汇编语言编写的程序汇编语言是一种低级的编程语言,直接操作计算机硬件。

通过使用汇编语言,程序员可以更加精确地控制计算机的功能和执行过程。

下面将介绍一个用汇编语言编写的程序的例子,以帮助读者更好地理解汇编语言的特点和用途。

一、程序概述这个用汇编语言编写的程序的功能是计算从1到100的所有整数的和。

通过使用汇编语言的特性,我们可以实现高效的计算过程,以最小的资源消耗完成任务。

二、程序设计程序的设计思路是使用循环结构,从1开始累加到100,并将结果保存在寄存器中。

具体的程序设计如下:1. 初始化寄存器:将累加结果的寄存器置零,准备开始累加过程;2. 设定循环起始值:将循环计数器设为1,作为累加的起始值;3. 累加过程:将当前的累加结果与循环计数器相加,将结果保存在累加结果的寄存器中;4. 判断循环结束条件:如果循环计数器小于等于100,则继续循环,否则跳转到结束;5. 循环迭代:将循环计数器加1,准备下一次循环;6. 结束:输出最终的累加结果。

三、程序实现下面是具体的汇编代码实现:```assemblysection .datasum db 0 ; 累加结果count db 1 ; 循环计数器section .textglobal _start_start:mov al, 0 ; 初始化累加结果寄存器 mov bl, 1 ; 初始化循环计数器add al, bl ; 累加过程inc bl ; 循环迭代cmp bl, 101 ; 判断循环结束条件 jle _start ; 继续循环; 输出最终累加结果mov ah, 0x0emov al, 'T'int 0x10mov ah, 0x0e mov al, 'h' int 0x10mov ah, 0x0e mov al, 'e'int 0x10mov ah, 0x0e mov al, ' 'int 0x10mov ah, 0x0e mov al, 's'int 0x10mov ah, 0x0e mov al, 'u'int 0x10mov ah, 0x0e mov al, 'm' int 0x10mov ah, 0x0e mov al, ' 'int 0x10mov ah, 0x0e mov al, 'i'int 0x10mov ah, 0x0e mov al, 's'int 0x10mov ah, 0x0e mov al, ':'int 0x10mov ah, 0x0e mov al, ' 'int 0x10mov ah, 0x0e mov al, '5'int 0x10mov ah, 0x0emov al, '0'int 0x10mov ah, 0x0e mov al, '5'int 0x10mov ah, 0x0e mov al, '0'int 0x10mov ah, 0x0e mov al, '0'int 0x10mov ah, 0x0e mov al, '0'int 0x10mov ah, 0x0e mov al, 0x0d int 0x10mov ah, 0x0e mov al, 0x0aint 0x10; 程序结束mov eax, 1xor ebx, ebxint 0x80```四、程序运行结果以上的程序经过编译、链接后可以在计算机上运行。

汇编语言最全指令表

汇编语言最全指令表

伪指令•1、定位伪指令ORG m•2、定义字节伪指令DB X1,X2,X3, (X)•3、字定义伪指令DW Y1,Y2,Y3,…,Yn4、汇编结束伪指令END寻址方式MCS-51单片机有五种寻址方式:1、寄存器寻址2、寄存器间接寻址3、直接寻址4、立即数寻址5、基寄存器加变址寄存器间接寻址6、相对寻址7、位寻址数据传送指令一、以累加器A为目的操作数的指令(4条)•MOV A,Rn ;(Rn)→A n=0~7•MOV A,direct ;(direct )→A•MOV A,@Ri ;((Ri))→A i=0~1•MOV A,#data ;data →A二、以Rn为目的操作数的指令(3条)MOV Rn ,A;(A)→ RnMOV Rn ,direct;(direct )→ RnMOV Rn ,#data;data → Rn•三、以直接寻址的单元为目的操作数的指令(5条)MOV direct,A;(A)→directMOV direct,Rn;(Rn)→directMOV direct,direct ;(源direct)→目的directMOV direct,@Ri;((Ri))→directMOV direct,#data;data→direct四、以寄存器间接寻址的单元为目的操作数的指令(3条)MOV @Ri,A;(A)→(Ri)MOV @Ri,direct;(direct)→(Ri)MOV @Ri,#data;data→(Ri)五、十六位数据传送指令(1条)MOV DPTR,#data16;dataH→DPH,dataL →DPL六、堆栈操作指令进栈指令PUSH direct ;(SP)+1 →SP ,(direct)→ SP 退栈指令POP direct七、字节交换指令(5条)•XCH A,Rn ;(A)→ß(Rn)•XCH A,direct ;(A)→ß(direct)•XCH A,@Ri ;(A)→ß((Ri))•八、半字节交换指令•XCHD A,@Ri ;(A)0~3→ß((Ri))0~3九、加器A与外部数据存贮器传送指令(4条)•MOVX A,@DPTR ;((DPTR))→A•MOVX A,@ Ri ;((Ri))→A i=0,1•MOVX @ DPTR ,A ;(A)→(DPTR)•MOVX @ Ri , A ;(A)→(Ri)i=0,1 十、查表指令(i)MOVC A ,@ A+PC ;((A)+(PC))→A•(ii)MOVC A ,@A+ DPTR ;((A)+(DPTR))算术运算指令一、不带进位的加法指令(4条)ADD A,Rn ;(A)+(Rn)→AADD A,direct ;(A)+(direct)→AADD A,@Ri ;(A)+((Ri))→AADD A,#data ;(A)+#data→A二、带进位加法指令(4条)ADDC A,Rn ;(A)+(Rn)+CY→AADDC A,direct ;(A)+(direct)+CY →AADDC A,@Ri ;(A)+((Ri))+CY →AADDC A,#data ;(A)+ #data +CY →A三、增量指令(5条)INC A ;(A)+1 →A•INC Rn ;(Rn)+1 → Rn•INC direct ;(direct)+1 → direct•INC @Ri ;((Ri))+1 →(Ri)•INC DPTR ;(DPTR)+1 →DPTR四、十进制调整指令(1条)DA A减法指令一、带进位减法指令SUBB A,RnSUBB A,directSUBB A,@RiSUBB A,#data二、减1指令(4条)DEC ADEC RnDEC directDEC @Ri乘法指令MUL AB除法指令DIV AB逻辑运算指令累加器A的逻辑操作指令一、累加器A清0CLR A二、累加器A取反CPL A三、左环移指令RL A四、带进位左环移指令RLC A五、右环移指令RR A六、带进位右环移指令RRC A七、累加器ACC半字节交换指令SWAP A两个操作数的逻辑操作指令逻辑与指令ANL A,RnANL A,direct ANL A,@Ri ANL A,#data ANL direct ,A ANL direct,#data逻辑或指令ORL A,RnORL A,directORL A,@RiORL A,#dataORL direct,AORL direct,#data逻辑异或指令XRL A,RnXRL A,directXRL A,@RiXRL A,#dataXRL direct,AXRL direct,#data 位操作指令位变量传送指令MOV C,bitMOV bit,C 位变量修改指令CLR CCLR bitCPL CCPL bitSETB CSETB bit位变量逻辑与指令ANL C,bitANL C,/bit位变量逻辑或指令ORL C,bitORL C,/bit控制转移指令无条件转移指令(4条)1、短跳转指令AJMP addr11 ;先(PC)+2→PC ;addr11→PC10~0 ,(PC15~11)2、跳转指令LJMP addr16 ;Addr16→PC3、转移指令4、SJMP rel ;先(PC)+2→PC;后(PC)+rel→PC4、寄存器加变址存器间接转移指令(散转指令)JMP @A+DPTR ;(A)+(DPTR)→PC条件转移指令(8条)一、测试条件符合转移指令JZ rel ;当A=0 时,(PC)+rel→(PC)转移;当A≠0时,顺序执行。

汇编语言设计-算术运算指令

汇编语言设计-算术运算指令

NEG指令是对指令中的操作数取补,再将结果送回。因 对一个操作数求2的补码,相当于0减去此操作数,所以NEG 指令执行的也是减法操作。
说明:0 – OPRD 又相当于: ①、FFH-OPRD+1 (字节操作)或
②、FFFFH-OPRD+1(字操作)。即将OPRD内容变反加1
例:若(AL)=13H 0000 0000 执行 NEG AL – 0001 0011
0000 0110 + 1111 1100 1← 0000 0010
6 + 252
258>255
+6 + (–4)
+2
CF=1 溢出
OF=0 不溢出
ⅲ、无符号数不溢出,带符号数溢出:
二进制加法 认作无符号 认作带符号数
0000 1000 + 0111 1011
1000 0011
8 + 123
131 CF=0 无溢出
2、带进位位的加法指令ADC ADC dest , src ; dest←dest+src+CF
ADC主要用于多字节运算,ADC对标志位的影响同ADD。 例:计算 1234FEDCH+33128765H 分别存于数据段指
定的区域中,低位在前,高位在后,相加后其和存入前一个双 字所在的区域中。 (SI)→1000H DCH (41H)
+ 39H 0011 1001
0110 1110
则(AL)=6EH,低4位为非法码,故需调整。
4、组合十进制加法调整指令DAA
(BCD码的加法十进制调整指令)
格式:DAA
功能:对组合BCD码相加的结果进行调整,使结果仍为 组合的BCD码。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验名称——累加
实验人:班级:
学号:课程:汇编语言
目的:掌握循环程序设计与过程的设计方法
内容:求出1到n的累加
设计思想:这个程序的设计从结构上来看主要分为三部分——1,键盘输入的数字字符串(十进制数值)如何变为具有数值意义的二进制数2,利用一个循环结构将1到n的和求出3,将一个就有数值意义的二进制数转化为ASCII码并以字符串(十进制)显示出来(与计算结果的二进制数相等)。

Array

.MODEL SMALL
.STACK 1024
.DATA
f1 db 'INPUT N:','$'
f3 db 0dh,0ah,'error','$'
p dw 0
sum dw 0
.CODE
.STARTUP
mov dx,offset f1
mov ah,9h ;显示字符input n:
int 21h
input:mov ah,1
int 21h ;显示输入字符并将字符的ascii值放入al cmp al,0dh
jz next
cmp al,'0'
jb next1
cmp al,'9' ;判断字符的合法性
ja next1
sub al,'0' ;将ascii码转化为每一位的数值mov ah,0
push ax ;通过堆栈保护数据
mov ax,p ;
shl ax,1
push ax
mov cl,2
shl ax,cl ;ax的值乘以4
xor bx,bx
pop bx
add ax,bx
xor bx,bx
pop bx
add ax,bx
mov p,ax ;将n的二进制数值存入p中
jmp input
next:mov bx,0 ;bx清零
xor ax,ax ;ax清零
mov cx,p ;循环次数存入cx中
again:inc bx
add ax,bx
loop again ;将n的累加求出并放入ax中
mov sum,ax ;将n的累加存入变量sum
loop1:mov dx,0 ;
mov bx,10
div bx
add dx,'0' 将要显示的数转化为ascii码
push dx ;通过堆栈保护数据
inc cx ;记录要显示字符的个数
cmp ax,0h ;判断商是否为零
jnz loop1
mov dx,offset info2
mov ah,9
int 21h ;这三步换行显示字符
loop2:pop dx ;将要显示的字符的ascii码放入dx mov ah,2
int 21h ;dos的2号调用显示字符
loop loop2 ;通过循环显示字符串
jmp next2 ;
next1:mov dx,offset info3
mov ah,9
int 21h
next2:
.EXIT
END
在这个程序的编写过程中收获了很多,如:如何将数值ascii 码转化为二进制数,循环结构的应用,将二进制数如何以十进制数值ascii码显示。

在此过程也了解到了堆栈的重要性,而且还有关于dos的调用。

这个程序的编写使我受益匪浅。

但是在调试的过程中也走了不少弯路,一开始就拿课件上的程序组合在一起,自以为还可以,在调试的过程中不时就出现乱码,还有那个换行显示,一开始显示的字符不在同一行。

反正就是显示错位,一看这情况真的很烦,但是到最后成功的时候真的很开心,前面的付出都是值得的。

一开始对汇编真的不太感兴趣,但是通过这个程序的编写后,发现自己真的爱上汇编了。

相关文档
最新文档