x86汇编程序 加法例子

合集下载

x86汇编指令详解x86汇编指令详解

x86汇编指令详解x86汇编指令详解

x86汇编指令详解x86汇编指令详解指令包括三部分:数据传送指令、运算指令、跳转指令。

Intel寄存器包括:通用寄存器AX,BX,CX,DX;通用寄存器由分为8位、16位、32位,其中AL、AH是AX高、低8位寄存器,BL、BH是BX的高、低8位寄存器,CL、CH是CX的高、底8位寄存器,DL、DH是DX的高、低8位寄存器;段寄存器DS,ES,SS,CS,FS,GS;堆栈指针SP,程序计数器IP。

一、传送指令在存贮器和寄存器和输入输出端口之间传送数据。

1. 通用数据传送指令(R代表寄存器,M代表存储器,I代表立即数)MOV 第一操作数,第二操作数;功能:把第二操作数传给第一操作数,第一操作数必须是寄存器或存储单元,第二操作数可以是寄存器、存储器,也可以是立即数。

如:MOV AX,CX; CX——〉AXMOV BX,WORD;WORD——〉BXMOV AX, 10H;10H——〉AX第一操作数可以换成存储器,如word。

各种传送指令源操作数是寄存器MOV CH, ALMOV BP, SPMOV ECX, EBXMOV DS, AXMOV [BX], CH源操作数是存储单元MOV AL, [100H]MOV BX, ES:[DI]MOV EDX, [BX]MOV BX, VARW其中:VARW是字类型内存变量(下同)。

源操作数是立即数MOV AL, 89HMOV BX, -100HMOV EDX, 12345678HMOV VARW, 200HMOV [BX], 2345HPUSH 操作数;把操作数压入堆栈,堆栈指针SP+1;POP 操作数;把堆栈指针SP指定内容弹出到操作数指定位置。

如:PUSH AX;把AX内容送入堆栈POP AX;把堆栈内容弹出堆栈PUSHF 标志进栈格式为:PUSHF执行的操作:(SP)<-(SP)-2((SP)+1,(SP))<-(PSW)POPF 标志出栈格式为: POPF执行的操作:(PWS)<-((SP)+1,(SP))(SP)<-(SP+2)2. 输入输出端口传送指令IN AL,port;在IBM-PC机里,外部设备最多可有65536个I/O端口,端口(即外设的端口地址)为0000~FFFFH。

汇编加法和减法指令代替除法指令

汇编加法和减法指令代替除法指令

汇编加法和减法替代除法指令针对没有乘法和除法指令的MCU,且用汇编写写代码,又要用到除法的指令。

本例是用义隆单片机EM78P372单片机,此方法可用于任何一款单片机中。

方法取名为:逐步累加比较法概述:逐步增加除数的值,与被除数比较,直到除数的累加值等于被除数或者最接近被除数(此时存在余数)时,读取累加的次数,即为商,比如:20就是2经过10次累加得到的,所以20除于2等于10.代码:BEICHUSHU_D EQU 0X30;被除数低位BEICHUSHU_G EQU 0X31;被除数高位CHUSHU EQU 0X32;除数CHUSHU_D EQU 0X33;比较时的累加除数CHUSHU_G EQU 0X34;累加除数的高位SHANG EQU 0X35;所得的商,16进制YUSHU EQU 0X37;所得的余数ORG 0X00JMP MAINORG 0X22MAIN:CLR BEICHUSHU_DCLR BEICHUSHU_GCLR CHUSHUCLR SHANGCLR CHUSHU_DCLR CHUSHU_GSHEZHI:MOV A,@10;除于0AHMOV CHUSHU,A;****************被除数7FFH;由于这里只设置了一个存储商的寄存器;所以,被除数的值不可超过:除数*256;这里只介绍方法,设置存储寄;存器越多,则可计算可越大MOV A,@0XFFMOV BEICHUSHU_D,AMOV A,@0X07MOV BEICHUSHU_G,A;*****************求得均值,放一个寄存器中CALL CHUFAMOV A,SHANGMOV 0X16,A;将均值放于0X16JMP $;*******************************求均值过程CHUFA:MOV A,CHUSHU;将除数赋值到自定的除数比较累加器中MOV CHUSHU_D,AINC SHANGBIJIAO1:MOV A,BEICHUSHU_G;先比较被除数和除数累加器的高位XOR A,CHUSHU_GJBS 0X03,2JMP JIA_CHUSHU;若除数累加器高位与被除数不相等,则进行除数累加器加一个除数工作BIJIAO2:MOV A,CHUSHU_D;若高位相等,则比较低位SUB A,BEICHUSHU_D;A所得的是余数JBC 0X03,0JMP JIA_CHUSHU1;如果低位被除数大于或等于除数累加器的低位JMP FANHUIJIA_CHUSHU1:MOV YUSHU,A;先储存余数到余数寄存器MOV A,CHUSHU_DXOR A,BEICHUSHU_D;比较除数累加器低位与被除数低位是否相等JBC 0X03,2JMP FANHUI;相等则除法运算完成,返回MOV A,CHUSHU;不相等,则看余数是否大于除数SUB A,YUSHUJBS 0X03,0JMP FANHUI;余数小于除数,则运算完成JIA_CHUSHU:INC SHANG;商加1,除数累加器加一个除数MOV A,CHUSHUADD CHUSHU_D,AJBS 0X03,0JMP BIJIAO1INC CHUSHU_G;若有进位,则除数累加器高位加1JMP BIJIAO1FANHUI:RET;******************************。

第2章 80X86汇编语言与汇编程序(3)—算术逻辑运算指令..

第2章 80X86汇编语言与汇编程序(3)—算术逻辑运算指令..

26 Glut _C 2013-08
如果一个正数调用NEG指令,实际上求出的是它 的机器负数。 例如 (AL)=14H, 执行
NEG AL
指令执行后 (AL) = 0 ECH -14H
如果一个负数,如果不先保存符号位,使用NEG指令 后,实际上变成了他的绝对值。 例如: MOV AL, 0ECH
80X86指令系统(续)
1 Glut _C 2013-08
算术运算指令包括加、减、乘、除基本运算指令,十进制运 算的调整指令。 可以进行带符号数的运算,也可以进行无符号数的运算。
2 Glut _C 2013-08
2.3.2 加减法运算 加减法运算结果可以存放在通用寄存器中,也可以存放在存 储器中。
Ο —按结果设置标志,Δ —不影响该标志位
Glut _C 2013-08 4
减法运算指令有
5 Glut _C 2013-08
乘法运算指令有
指令格式
操作功能 (AX) ←(src) × (AL) (DX:AX) ←(src) × (AX) (AX) ←(src) × (AL) (DX:AX) ←(src) × (AX)
NEG AL
Glut _C 2013-08
;(al)= -14h
;(al)= 14h
27
例:内存数据段存放了200个带符号数(字节),首 地址为TAB1,要求将各数取绝对值后存入以TAB2为 首址的内存区。 由于200个带符号数中可能既有正数,又有负数, 因此先要判断正负。如为正数,可以原封不动地传送 到另一内存区;如为负数,则需先求补即可得到负数 的绝对值,然后再传送。程序流程框图如下:
立即数IMM 通用寄存器 REG + 或 通用寄存器REG

X86汇编语言指令集

X86汇编语言指令集
汇编语言指令大全(南邮)
AAA 未组合的十进制加法调整指令 AAA(ASCII Adgust for Addition) 格式: AAA 功能: 对两个组合的十进制数相加运 算(存在 AL 中)的结果进行调整,产生 一个未组合的十进制数放在 AX 中.
10006025
说明: 1. 组合的十进制数和未组合的十进 制数:在计算中,十进制数可用四位 二进制数编码,称为 BCD 码. 当一个节(8 位)中存放一位 BCD 码, 且放在字节的低 4 位, 高 4 位为时称 为未组合的 BCD 码. 2. AAA 的调整操作 若(AL) and 0FH>9 或 AF=1,则调整 如下: (AL)<--(AL)+6,(AH)<--(AH)+1,AF= 1,CF<--AF,(AL)<--(AL) and 0FH 说明: 1. AAD 指令是在执行除法 DIV 之前使 用的,以便得到二进制结果存于 AL 中,然后除以 OPRD,得到的商在 AL 中,余数在 AH 中. 2. 示例: MOV BL,5 MOV AX,0308H AAD ;(AL)<--1EH+08H=26H,(AH)<--0 DIV BL ;商=07H-->(AL),余数= 03H-->(AH). 说明: 1. 实际上是两个未组合的十进制数 字节相乘,一个 0~9 的数与另一个 0~9 的数相乘其积最大为 81.为了得 到正确的结果,应进行如下调整: 乘积: (AH)<--(AL)/10 (AL)<--(AL)MOD10 2. 本指令应跟在 MUL 指令后使用,乘 积的两位十进制结果,高位放在 AH 中,低位放在 AL 中.AH 内容是 MUL 指 令的结果被 10 除的商,即(AL)/10,而 最后的 AL 内容是乘积被 10 整除的余 数(即个位数). 说明: 1. 本指令影响标志位 CF 及 AF. 2. 调整操作 若(AL) and 0FH > 9 或 AF=1 则 (AL)<--(AL)-6,(AH)<--(AH)-1,CF< --AF,(AL)<--(AL) and 0FH, 否则(AL)<--(AL) and 0FH 说明:

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

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

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

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

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

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 ; 调用系统调用中断退出程序```上述例子使用了循环控制指令来实现对计数器和循环次数的操作。

汇编addss指令

汇编addss指令

汇编addss指令
ADDSS 是x86 架构下的SIMD (单指令多数据) 指令,属于SSE (Streaming SIMD Extensions) 指令集的一部分。

它主要用于浮点数计算。

ADDSS 指令执行单精度浮点数(32位)的加法操作。

它操作两个源操作数,并将结果存储在目标操作数中。

指令格式如下:
css
ADDSS xmm1, xmm2/m32
xmm1:目标操作数,一个128 位的XMM 寄存器,用于存储加法结果。

xmm2:第一个源操作数,也是一个128 位的XMM 寄存器。

m32:第二个源操作数,一个32 位的内存地址。

操作:
xmm2 的低32 位与m32 的内容进行加法操作。

结果存储在xmm1 的低32 位中,而xmm1 的高96 位保持不变。

注意:ADDSS 只操作低32 位的单精度浮点数,而忽略其他位。

在实际应用中,这种指令通常用于图形处理、物理模拟、科学计算等需要高速浮点运算的场景。

例如,下面的汇编代码展示了如何使用ADDSS 指令:
assembly
; 假设xmm0 中存储了一个单精度浮点数a
; 假设内存地址[address] 中也存储了一个单精度浮点数b
addss xmm0, [address] ; 将a 和b 相加,结果存储在xmm0 中
需要注意的是,为了充分发挥SSE 指令集的性能,通常需要结合其他指令和数据对齐技术来使用。

同时,现代的处理器和编译器也提供了更高级别的SIMD 指令集,如AVX、AVX2、AVX-512 等,这些指令集提供了更宽的数据路径和更多的操作功能。

用汇编实现大数的加减运算

用汇编实现大数的加减运算

⽤汇编实现⼤数的加减运算1.⼤数加法DATAS SEGMENTA db 100 dup(?);第⼀个数B db 100 dup(?) ;第⼆个数count db ?;记录最⼤位数temp db ?;进位标志位len1 db 0;记录A的位数len2 db 0;B的位数DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:DATASSTART:MOV AX,DATASMOV DS,AXmov es,axxor ax,axin1:;A数组的输⼊mov ah,1int 21hsub al,'0'cmp al,0;判定输⼊的字符是否是0-9jl @Fcmp al,9jg @Fpush axinc len1jmp in1@@:mov dl,10mov ah,2int 21hmov dl,13mov ah,2int 21hlea di,Amov cl,len1inc diloop @Bxor ax,axin2:;输⼊B数组mov ah,1int 21hsub al,'0';判定输⼊的字符是否是0-9cmp al,0jl @Fcmp al,9jg @Fpush axinc len2jmp in2@@:mov dl,10mov ah,2int 21hmov dl,13mov ah,2int 21hlea si,Bmov cl,len2@@:;将数组A倒置pop axmov [si],alinc siloop @Bmov bl,len1mov al,len2mov count,bl ;⽐较出最⼤位数,并将位数⼩的数组在⾼位补0,直到位数相等cmp bl,aljz sajg xymov count,alsub al,blmov cl,al@@:mov [di],0xy:sub bl,almov cl,bl@@:mov [si],0inc siloop @Bsa:mov cl,countlea di,Alea si,Bmov temp,0;设置进位标志clcfg:;2个数组addmov bl,[si]cmp temp,1clcjnz p3stcp3:mov temp,0adc bl,[di]cmp bl,10jl p2sub bl,10mov temp,1p2:push bxinc diinc siloop fgcmp temp,1jnz p1mov bl,1;最⾼位有进位,加1位并置1 push bxinc countp1:mov cl,0@@:;清除前⾯多余的0cmp al,0jz @B@@:push axdec clsub count,clmov cl,count@@:;结果输出pop dxadd dl,'0'mov ah,2int 21hloop @BMOV AH,4CHINT 21HCODES ENDSEND STARTView Code结果:4986746546546879879849867553453442.⼤数减法DATAS SEGMENTA db 100 dup(?);第⼀个数B db 100 dup(?) ;第⼆个数count db ?;记录最⼤位数temp db ?;标志位len1 db 0;记录A的位数len2 db 0;BDATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:DATASSTART:in1:;A数组的输⼊mov ah,1int 21hsub al,'0'cmp al,0;判定输⼊的字符是否是0-9 jl @Fcmp al,9jg @Fpush axinc len1jmp in1@@:mov dl,10mov ah,2int 21hmov dl,13mov ah,2int 21hlea di,Amov cl,len1@@:;将数组A倒置pop axmov [di],alinc diloop @Bxor ax,axin2:;输⼊B数组mov ah,1int 21hsub al,'0';判定输⼊的字符是否是0-9 cmp al,0jl @Fcmp al,9jg @Fpush axinc len2jmp in2@@:lea si,Bmov cl,len2@@:;将数组A倒置pop axmov [si],alinc siloop @Bmov bl,len1mov al,len2mov count,bl ;⽐较出最⼤位数,并将位数⼩的数组在⾼位补0,直到位数相等cmp bl,aljz comjg xymov count,alsub al,blmov cl,al@@:mov [di],0inc diloop @Bjmp sbaxy:sub bl,almov cl,bl@@:mov [si],0inc siloop @Bjmp sabmov cl,countlea di,Alea si,B;⽐较a/b⼤⼩com:mov bl,[di]cmp bl,[si]sab:mov cl,countlea di,Alea si,Bmov temp,0;设置进位标志fg1:mov bl,[di]sub bl,tempmov temp,0cmp bl,[si]jge p3add bl,10mov temp,1p3:sub bl,[si]push bxinc diinc siloop fg1jmp p1;;a<b是让b-asba:mov cl,countlea di,Alea si,Bmov temp,0;设置进位标志fg2:;2个数组submov bl,[si]sub bl,tempmov temp,0cmp bl,[di]jge p32add bl,10mov temp,1p32:mov dl,2DH ;输⼊‘-’mov ah,2int 21h;p1:mov cl,0@@:;清除前⾯多余的0 pop axinc clcmp cl,countjz @Fcmp al,0jz @B@@:push axdec clsub count,clmov cl,count@@:;结果输出pop dxadd dl,'0'mov ah,2int 21hloop @BMOV AH,4CHINT 21HCODES ENDSEND STARTView Code结果:416546546 87987987979-87571441433。

X86平台下用汇编写HelloWorld

X86平台下用汇编写HelloWorld

X86平台下⽤汇编写HelloWorld⾸先需要安装⼀个汇编器,我⽤的是Nasm,这个汇编器在Linux下安装还是很简单的。

Nasm下载地址在下载之后对其进⾏解压,然后进⼊到其⽬录下,会发现有configure⽂件,接下来相信对于熟悉Linux的同学就知道该怎么办了。

输⼊./configure然会待其执⾏完成后,会发现在⽬录下⽣成了⼀个Makefile⽂件,这是输⼊make命令,就可以完成对Nasm的编译了然后进⼊root,输⼊make install对Nasm进⾏安装即可了。

然后如果你的机器上没有gcc的话可以安装下gcc这⾥⾃⼰去搜索引擎找就⾏了,因为我这⾥已经安装了gcc所以这⾥不再多说。

接下来就可以编写helloworld的汇编代码了,我这⾥参考的是维基百科上的代码⽰例section .datamsg db 'Hello, world!',0xAlen equ $-msgsection .textglobal _start_start:mov edx,lenmov ecx,msgmov ebx,1mov eax,4int 0x80mov ebx,0mov eax,1int 0x80然后将编辑的⽂件保存,起始后缀名没什么关系,后缀名在Linux下只是给⼈看的罢了,保存之后,输⼊nasm -f elf32 ⽂件名,然后会发现在该命令执⾏完成后⽣成了⼀个⽂件名.o的⽂件,然后输⼊ld ⽂件名.o -o ⽂件名执⾏完成后,就⽣成了我们平时使⽤的可以执⾏⽂件。

此时输⼊./⽂件名就会出现Hello World了。

⾃⼰在看了下汇编的东西后,⾃⼰⽤AT&T的汇编格式写出了⼀个Hello World,虽然很简单,但是对于⼀直想⾃学下汇编,但是⼀直也没学的我来说,还是觉得⾃⼰能独⽴写出⼀个⼩⼩的汇编程序感到很兴奋。

.equ SYS_WRITE, 4.equ SYS_EXIT, 1.equ SYSCALL, 0x80.equ STDOUT, 1.equ STR_LEN 12.section .datastr:.ascii "hello world\n\0".section .text.globl _start_start:movl %esp, %ebpsubl $4, %espmovl $str, -4(%ebp)movl $SYS_WRITE, %eaxmovl $STDOUT, %ebxmovl -4(%ebp), %ecxmovl $STR_LEN, %edxint $SYSCALLmovl $SYS_EXIT, %eaxmovl $0, %ebxint $SYSCALL调⽤动态链接库实现HelloWorld.section .datastr:,ascii "hello world\n\0".section .text.globl _start_start:pushl $strcall printfpushl $0call exit这样,该程序在汇编时仍然和之前⼀样使⽤ as helloworld.s -o helloworld.o,但是在进⾏链接时却需要做⼀些改变应该使⽤如下的⽅式进⾏: ld -dynamic-linker /lib/ld-linux.so.2 -o helloworld helloworld.o -lc这样编译就可以完成了。

第8章 加法减法指令(X86汇编教程)

第8章 加法减法指令(X86汇编教程)

第8 章加法减法指令(X86 汇编教程)
本章主要是加强学习对DEBUG 的使用.所以真正学习新知识的部分可能少点.大部分是在复习.. 之前的一些东西.另外...上一章居然没人交作业!包括学习我的教程一向很努力的殇星君也因为迷上了某某游戏而只是转载下,没有仔细看......不过, 经过了几天,回复数量也勉强让我满意了(和空间里其它文章比起来).这次,新教4 条指令:指令名:ADD 操作数数量:2 操作数名:目标操作数,源操作数指令用途:把2 个操作数相加,和保存在目标操作数指令名:SUB 其余大多同ADD 指令一样,有一点不同:此指令是减法指令指令名:INC 操作数
数量:1(注意,只有1 个操作数!)操作数名:目标操作数指令用途:把目标操作数+1, 结果保存回目标操作数.指令名:DEC 其余大多同INC 指令一样,有一点不同: 此指令是把目标操作数减1INC 和DEC 指令虽然只做加1 和减1 的操作,但是只有1 个操作数,并且计算过程变化不多,占用的内存少点,所以执行速度比ADD 和SUB 指令快很多,当然,这所谓的很多,连万分之一秒都没有...只有在每秒钟计算几亿次的情况下才能体验到.恩,对于高手来说,能快一点点都是很重要的.好了, 编写代码调试吧!我的代码:ORG 0100HMOV AX,5MOV BX,3ADD AX,BXSUB AX,BXINC AXDEC AX 至于怎么编译,第7 章已经说过了.这里就不解释了...编译完成后,用DeBug 导入调试吧!~R 指令查看状态,此时第一条指令还没执行,AX 寄存器什么都没有,第一条指令是MOV AX,0005 ,也就是往AX 寄存器写入数值5(见下图):
T 指令执行一行代码,执行第一行代码,看,AX 寄存器写入成功,接着是BX 寄
存器:
再次T 指令,执行一行,好了,现在。

80X86汇编语言程序设计第二章⑤.80868088指令.

80X86汇编语言程序设计第二章⑤.80868088指令.

80X86汇编语言程序设计第二章 8086/8088寻址方式和指令系统(二加减运算指令1. 加法指令 ADD格式:ADD OPRD1,OPRD2执行的操作:(OPRD1 ← (OPRD1 +(OPRD2例如 :MOV AX,7896H ; (AX =7896H即(AH =78H (AL =96H ; 各标志位保持不变ADD AL,AH ;AL=AL+AH=96H+78H(=10EH=0EH 前面的 1给了进位标志CF 。

即(AH =78H (AX =780EHCF=1PF=0AF=0ZF=0SF=0OF=0例如 :ADD DX,0F0F0H执行前(DX =4652H执行后(DX =4652H+F0F0H(=13742H=3742H 前面的 1给了进位标志 CF 。

ZF=0 SF=0 CF=1 OF=0这里 4的二进制码是 0100, F 是 1111, 一个正数一个负数相加肯定 OF 是 0。

例如 :ADD AX,4321执行前(AX =62A0H执行后(AX =62A0+4321=A5C1H 这里要注意, A 的二进制数是 1010,最高有效位为 1, 所以 SF 为 1。

两个正数相加,结果为负的就溢出;两个负数相加,结果为正的就溢出。

SF=1 ZF=0 CF=0 OF=1这里 6的二进制码是 0110,而 4的二进制码是 0100,两个正数相加,结果 A 为1010为负,所以 OF 为 1。

从上面例子可看出:加法指令影响标志位。

OF 位根据操作数的符号及其变化情况来设置:若两个操作数的符号相同而结果的符号与之相反时 OF=1,否则 OF=0。

CF 位可以用来表示无符号数的溢出。

由于无符号数的最高有效位只有数值意义而无符号意义, 所以从该位产生的进位应该是结果的实际进位值,但在有限数的范围内就说明了结果。

2. 带进位加指令 ADC (Add with Carry格式:ADC OPRD1,OPRD2执行的操作:(OPRD1 ← (OPRD1 +(OPRD2 +(CF例如 :下列指令序列执行两个双精度(32位的加法。

80X86常用汇编指令集

80X86常用汇编指令集

80X86常用汇编指令集ZZ作者 : 赵振东ZZD学习汇编语言,最关键的就在于汇编指令集的掌握以及计算机工作方式的理解,以下是80X86汇编过程中经常用到的一些汇编指令。

从功能分类上来说,一共可分为一、数据传送指令:MOV、XCHG、LEA、LDS、LES、PUSH、POP、PUSHF、POPF、CBW、CWD、CWDE。

二、算术指令:ADD、ADC、INC、SUB、SBB、DEC、CMP、MUL、DIV、DAA、DAS、AAA、AAS。

三、逻辑指令:AND、OR、XOR、NOT、TEST、SHL、SAL、SHR、SAR、RCL、RCR、ROL、ROR。

四、控制转移指令:JMP、Jcc、JCXZ、LOOP、LOOPZ、LOOPNZ、LOOPNE、CALL、RET、INT。

五、串操作指令:MOVS、LODS、STOS、CMPS、SCAS。

六、标志处理指令:CLC、STC、CLD、STD。

七、32位CPU新增指令(后续补充并完善)除上述的一些指令外,还有许多32位80X86CPU新增指令,这些指令有时会简化程序设计,不过由于我也是刚刚学习汇编,这些都是从书上看到的,所以很多还不是十分了解,我写这些的目的仅仅是想让自己能更好的去记住这些指令的作用和用法,同事也希望和我一样刚入门的朋友能够多了解一些,并没有其他目的,所有的示例也并没有经过实际的代码测试,所以希望各位朋友,不管你喜欢不喜欢,反对不反对,请文明发言,谢谢!------------------------------------------------数据传送指令开始-------------------------------------------------------1、MOV(传送)指令写法:MOV target,source功能描述:将源操作数source的值复制到target中去,source值不变注意事项:1)target不能是CS(代码段寄存器),我的理解是代码段不可写,只可读,所以相应这地方也不能对CS执行复制操作。

汇编中的加法指令

汇编中的加法指令
用途:在循环程序中修改地址 指令和循环次数等。INC指令 执行的结果不影响CF位,而对 其他5个标志位AF、OF、PF、 SF和ZF有影响。
标志 位的 变化 规则
有进位时CF=1,无进位时CF =0。OF位则根据操作数的符 号及其变化情况来设置;若两 个操作数的符号相同,而结果 的符号与之相反时,OF=1;否 则OF=0。溢出位OF既然是根据 数的符号及其变化来设置的, 当然它是用来表示带符号数的 溢出的。
加法指令ADD 加进位的加法指令ADC 加1指令INC
加法 指令
ADD
格式:ADD OPRD1,OPRD2
功能:OPRD1=OPRD1+OPRD2
ADD所影响的标志位有:CF、 DF、PF、SF、ZF和AF。
目的操作数可以是累加器、通 用寄存器及存储器操作数。
ADC
格式:ADC OPRD1,OPRD2
OF位可以用来表示带符号数的溢出,CF 位可以用来表示无符号数的溢出。
说明:因为OF表示的只是有符号数 即只 有两个操作数符号相同,而结果的符号与 之相反时,OF=1,即表示有符号数溢出。
CF是进位标志,如果不是上述的地位字的 进位加到高位,即在有限的数位内如果无 符号数相加结构进位了,则说明相加结构 溢出。
关于 CF的 使用:
ห้องสมุดไป่ตู้
CF位可以用来表示无符号数的溢出。由于 无符号数的最高有效位只是数字意义,而 无符号怠义,所以从该位产生的进位应该 是结果的实际进位值,但是在有限数位的 范围内就说明了结果的溢出情况,另一方 面,它所保存的进位值有时是有用的。例 如,双字长数运算时,可以利用进位值把 低位字的进位计入高位字中等。这可以根 据不同情况在程序中加以处理。

指令语句和伪指令语句的格式-详细解释说明

指令语句和伪指令语句的格式-详细解释说明

指令语句和伪指令语句的格式-范文模板及概述示例1:标题:指令语句与伪指令语句的格式解析及其在编程中的应用指令语句和伪指令语句是程序设计语言中两种关键的构成元素,它们在编程过程中发挥着不同的作用,并具有特定的格式规范。

一、指令语句指令语句,也称机器指令,是计算机硬件可以直接执行的命令。

其格式通常包括操作码(opcode)和操作数(operand)。

操作码代表要执行的操作类型,如加法、减法、移动等;操作数则是该操作的对象,可以是寄存器、内存地址或立即数。

例如,在x86汇编语言中,"ADD AX, BX"是一个指令语句,其中"ADD"是操作码,指示进行加法操作,"AX"和"BX"是操作数。

二、伪指令语句相比之下,伪指令语句并非由计算机硬件直接执行,而是由汇编程序在汇编阶段处理并转化为实际的机器指令。

伪指令主要用于定义数据、分配存储空间、设置程序流程控制以及提供程序说明等。

例如,在汇编语言中,".DATA"、".WORD"、"EQU"、"ORG"等都是常见的伪指令。

".DATA"用于定义数据段,".WORD"用于分配指定大小的存储空间,"EQU"用于定义符号常量,"ORG"则用于设定程序的起始地址。

具体而言,一个伪指令语句的格式可能如下所示:assemblyLABEL EQU 100 ; 定义符号常量LABEL为100在这个例子中,“LABEL”是符号名,“EQU”是伪指令关键字,而“100”则是赋给该符号的值。

总结来说,指令语句和伪指令语句虽然都属于编程语句,但前者直接影响程序的运行过程,后者则主要参与程序的构建和组织,对源代码进行预处理,共同构建出可被计算机理解和执行的程序结构。

X86汇编语言数据处理基础PPT课件

X86汇编语言数据处理基础PPT课件
编制一汇编语言源程序实现下列运算
s=(a+b)/(a-b)*c
title example 5-1 ;给程序模块命名,可以用name代替title
data segment ;data为数据段标号,数据段定义伪操作开始
a db 6 ;a为变量名,db为字节型数据定义伪操作,123为赋
值量
b db 3 注意:其中赋值量的部分可以使用汇编语言表达式
12
宏汇编
sort macro x,y,z
mov al,x
add al,y
mov z,al
endm
data segment
sector db 3,4,?
data ends
code segment
assume cs:code,ds:data
start:mov ax,data
mov ds,ax
5
汇编语言的运算符和表达式
七、属性操作符 :操作符:改变有效地址的默认段属性(144 页上) Ptr 操作符:重新定义变量或者表达式的类型 (144页下,lds7.asm),也可以改变标号的 类型(near和 far) This 操作符(教材145,lds7.asm)
6
title lds2 data segment count db 2+1,3,? data ends code segment
c db 5
s db 0
data ends
;数据段定义伪操作结束
stack1 segment para stack
dw 20h dup(0)
stack1 ends
code segment
assume cs:code,ds:data;ss:stack1 ;指定段寄存器伪操作

用汇编语言实现从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的⼗六进制)以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

用汇编编写的两个十进制数相加程序

用汇编编写的两个十进制数相加程序

用汇编编写的两个十进制数相加程序一、设计目的:对两个用ASCII码表示的十进制数直接相加,以得到它们的和.设被加数放在以SBCD1为首地址的单元中,加数放在以SBCD2为首地址的单元中。

二、实验设备:安装汇编软件的可操控计算机一台三、实验分析:需要注意的是如何用ASCII码表示十进制数,并且如何将一个数放入一个地址单元的首地址,而两个数的相加不是本设计的要点,着重在于解决以上两个问题。

在这里还有一个结果显示为两位数的问题,设计出的源程序在计算时其能显示的结果的最大值只能到9,无法显示十位数。

在随后改进的程序中加入了一个进位的子程序,首先对计算结果进行判断是否大于9,如果大于9则进入子程序。

从而使计算结果得以显示出一个十位数。

四、程序流程图:五、实验源程序六、实验程序:SSEG SEGMENT PARA STACK 'stack'dw 100h dup(0) ;初始化堆栈大小为100SSEG ENDSDSEG SEGMENTSBCD1 DB ?SBCD2 DB ?SBCD3 DB ?;数据段:在此处添加程序所需的数据DSEG ENDSESEG SEGMENT;附加段:在此处添加程序所需的数据ESEG ENDSCSEG SEGMENTassume cs:CSEG, ds:DSEG, es:ESEG, ss:SSEGMAIN PROC FAR ;主程序入口mov ax, dsegmov ds, axmov ax,esegmov es, axmov ah,1int 21hmov [SBCD1],almov bl,almov dl,'+'mov ah,2int 21hmov ah,1int 21hmov [SBCD2],aladd bl,alsub dl,dlmov dl,'='mov ah,2int 21hmov dl,blsub dl,48cmp dl,57mov bl,dljnz jinweimov dl,blmov ah,2int 21hjmp exitjinwei: mov dl,'1'mov ah,2int 21hsub bl,10mov dl,blmov ah,2int 21hjmp exitexit: mov ah,1int 21hmov ax, 4c00h ;程序结束,返回到操作系统系统int 21hMAIN ENDPCSEG ENDSEND MAIN。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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

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

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

1. 例子一:
```assembly
section .data
number1 dd 10
number2 dd 20
result dd 0
section .text
global _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 ; 退出码设置为0
int 0x80 ; 系统调用
```
此程序通过使用`mov`和`add`指令来实现加法运算。

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

2. 例子二:
```assembly
section .data
number1 db 10
number2 db 20
result db 0
section .text
global _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 ; 退出码设置为0
int 0x80 ; 系统调用
```
此程序使用的是8位寄存器`al`进行加法运算。

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

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

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

4. 例子四:
```assembly
section .data
number1 dd 10
number2 dd 20
section .text
global _start
_start:
fld dword [number1] ; 将number1的值加载到浮点寄存器栈中
fadd dword [number2] ; 将number2的值加到浮点寄存器栈中的值上
; 输出结果
sub esp, 4 ; 为输出结果分配4字节的栈空间
fstp dword [esp] ; 将浮点寄存器栈中的值弹出并保存到栈中
push dword format ; 将格式化字符串地址压入栈中
call printf ; 调用printf函数
add esp, 8 ; 清理栈空间
; 退出程序
mov eax, 1 ; 系统调用编号为1,表示退出程序 xor ebx, ebx ; 退出码设置为0
int 0x80 ; 系统调用
section .data
format db "%d", 10, 0 ; 格式化输出的字符串
section .text
extern printf ; 引入printf函数
```
此程序使用浮点寄存器栈进行加法运算。

首先,将`number1`和
`number2`的值加载到浮点寄存器栈中,然后使用`fadd`指令将两个值相加,将结果保存在栈中。

接下来,使用`printf`函数将结果输出到标准输出。

5. 例子五:
```assembly
section .data
number1 db 10
number2 db 20
result db 0
section .text
global _start
_start:
xor eax, eax ; 清空eax寄存器
mov al, [number1] ; 将number1的值加载到寄存器al中 xor ebx, ebx ; 清空ebx寄存器
mov bl, [number2] ; 将number2的值加载到寄存器bl中 add al, bl ; 将al寄存器中的值与bl寄存器中的值相加
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 ; 退出码设置为0
int 0x80 ; 系统调用
```
此程序使用的是8位寄存器`al`和`bl`进行加法运算。

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

6. 例子六:
```assembly
section .data
number1 db 10
number2 db 20
result db 0 section .text
global _start _start:。

相关文档
最新文档