汇编语言课件十进制调整指令
- 格式:ppt
- 大小:276.50 KB
- 文档页数:24
基于汇编语言的32位二进制、十进制转换及应用随着计算机技术的不断发展,汇编语言作为一种低级语言仍然具有其重要地位,因为它可以直接操作计算机硬件,实现更高效的程序运行。
在汇编语言中,数字通常以二进制表示。
但是在实际应用中,我们更常用的是十进制数字。
因此,将二进制数字转换为十进制数字是一项非常实用的技能。
在本文中,我们将介绍如何将32位二进制数字转换为对应的十进制数字,并给出实际应用示例。
首先,将32位二进制数字分为4个8位二进制数字,分别转换为对应的十进制数字。
例如,对于二进制数字11001100110011001100110011001100,可以分为4个8位二进制数字,分别为11001100、11001100、11001100、11001100,分别转换为对应的十进制数字204、204、204、204。
然后,将这4个十进制数字按照从高位到低位的顺序排列并相加,得到最终的十进制数字:204×2^24 + 204×2^16 + 204×2^8 + 204×2^0 = 3,419,496,704。
除了将二进制数字转换为十进制数字外,我们还可以将十进制数字转换为二进制数字并应用到实际问题中。
例如,我们要将十进制数字123456789转换为32位二进制数字,可以采用以下步骤:1. 将十进制数字123456789转换为二进制数字,得到111010110111100110100010101。
2. 在二进制数字前面补0,使其长度为32位,得到000000000000111010110111100110100010101。
3. 将32位二进制数字分为4个8位二进制数字,分别为00000000、00000000、11101011、01111001、10100010、101。
4. 分别将这4个8位二进制数字转换为十进制数字,得到0、0、235、121、162、101。
5. 最后将这4个十进制数字按照从高位到低位的顺序排列并相加,得到最终的32位二进制数字:0×2^24 + 0×2^16 + 235×2^8 + 121×2^0 + 162×2^-8 + 101×2^-16 = 0111010111100110100010101000001。
汇编语言指令集一、数据传输指令1. 通用数据传送指令.MOV(MOVe) 传送字或字节.MOVS(MOVe String) 串传送指令MOVSX先符号扩展,再传送.MOVZX先零扩展,再传送.PUSH把字压入堆栈.POP把字弹出堆栈.PUSHA把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.POPA把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.PUSHAD把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.POPAD把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.BSWAP 交换32位寄存器里字节的顺序XCHG (eXCHanG)交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数) CMPXCHG比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )XADD先交换再累加.( 结果在第一个操作数里)XLAT(TRANSLATE) 字节查表转换.── BX 指向一张256 字节的表的起点, AL 为表的索引值(0-255,即0-FFH); 返回AL 为查表结果. ( [BX+AL]->AL )2. 输入输出端口传送指令.IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器)输入输出端口由立即方式指定时, 其范围是0-255; 由寄存器DX 指定时,其范围是0-65535.3. 目的地址传送指令.LEA (Load Effective Address)装入有效地址.例: LEA DX,string ;把偏移地址存到DX.LDS (Load DS with pointer)传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.LES (Load ES with pointer)传送目标指针,把指针内容装入ES.例: LES DI,string ;把段地址:偏移地址存到ES:DI.LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.4. 标志传送指令.LAHF (Load AH with Flags)标志寄存器传送,把标志装入AH.SAHF (Store AH into Flgs)标志寄存器传送,把AH内容装入标志寄存器.PUSHF (PUSH the Flags)标志入栈.POPF (POP the Flags)标志出栈.PUSHD 32位标志入栈.POPD 32位标志出栈.二、算术运算指令───────────────────────────────────────ADD 加法.ADC 带进位加法.INC 加1.AAA 加法的ASCII码调整.非压缩的BCD码加法十进制调整指令DAA 加法的十进制调整.压缩的BCD码加法十进制调整指令SUB (SUBtract)减法.SBB (SuVtrach with borrow)带借位减法.DEC (DECrement)减1.NEC (NEGate)求反(以0 减之).CMP (CoMPare)比较.(两操作数作减法,仅修改标志位,不回送结果).AAS 减法的ASCII码调整.非压缩的BCD码加法十进制调整指令DAS 减法的十进制调整.压缩的BCD码减法十进制调整指令MUL (unsinged MULtiple)无符号乘法.IMUL (sIgned MUL tiple)整数乘法.以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算),AAM 乘法的ASCII码调整.DIV (unsigned DIVide)无符号除法.IDIV (sIgned DIVide)整数除法.以上两条,结果回送:商回送AL,余数回送AH, (字节运算);或商回送AX,余数回送DX, (字运算).AAD 除法的ASCII码调整.CBW (Count Byte to Word)字节转换为字. (把AL中字节的符号扩展到AH中去)CWD (Count Word to Doble word)字转换为双字. (把AX中的字的符号扩展到DX中去) CWDE 字转换为双字. (把AX中的字符号扩展到EAX中去)CDQ 双字扩展. (把EAX中的字的符号扩展到EDX中去)三、逻辑运算指令───────────────────────────────────────AND 与运算.or 或运算.XOR 异或运算.NOT 取反.TEST 测试.(两操作数作与运算,仅修改标志位,不回送结果).SHL (SHift logical Letf)逻辑左移.SAL 算术左移.(=SHL)SHR (SHift logical Right)逻辑右移.SAR 算术右移.(=SHR)ROL (Rotate Left )循环左移.ROR (Rotate Right)循环右移.RCL (Rotate Left through Carry)通过进位的循环左移.RCR (Rotate Right through Carry)通过进位的循环右移.以上八种移位指令,其移位次数可达255次.移位一次时, 可直接用操作码. 如SHL AX,1.移位>1次时, 则由寄存器CL给出移位次数.如MOV CL,04SHL AX,CL四、串指令───────────────────────────────────────DS:SI 源串段寄存器:源串变址.ES:DI 目标串段寄存器:目标串变址.CX 重复次数计数器.AL/AX 扫描值.D标志0表示重复操作中SI和DI应自动增量; 1表示应自动减量.Z标志用来控制扫描或比较操作的结束.MOVS 串传送.( MOVSB 传送字符. MOVSW 传送字. MOVSD 传送双字. )CMPS (CoMPare String)串比较.( CMPSB 比较字符. CMPSW 比较字. )SCAS (SCAn String)串扫描指令.把AL或AX的内容与目标串作比较,比较结果反映在标志位.LODS 装入串.把源串中的元素(字或字节)逐一装入AL或AX中.( LODSB 传送字符. LODSW 传送字. LODSD 传送双字. )STOS (STOre into String)保存串.是LODS的逆过程.REP (REPeat)当CX/ECX<>0时重复.REPE/REPZ (REPeat while Equal/Zero)当ZF=1或比较结果相等,且CX/ECX<>0时重复. REPNE/REPNZ (REPeat while Not Equal/Zero)当ZF=0或比较结果不相等,CX/ECX<>0时重复. REPC 当CF=1且CX/ECX<>0时重复.REPNC 当CF=0且CX/ECX<>0时重复.五、程序转移指令───────────────────────────────────────1>无条件转移指令(长转移)JMP 无条件转移指令CALL 过程调用RET/RETF过程返回.2>条件转移指令(短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1<OP2 )JA/JNBE 不小于或不等于时转移.JAE/JNB 大于或等于转移.JB/JNAE 小于转移.JBE/JNA 小于或等于转移.以上四条,测试无符号整数运算的结果(标志C和Z).JG/JNLE 大于转移.JGE/JNL 大于或等于转移.JL/JNGE 小于转移.JLE/JNG 小于或等于转移.以上四条,测试带符号整数运算的结果(标志S,O和Z).JE/JZ 等于转移.JNE/JNZ 不等于时转移.JC 有进位时转移.JNC 无进位时转移.JNO 不溢出时转移.JNP/JPO 奇偶性为奇数时转移.JNS 符号位为"0" 时转移.JO 溢出转移.JP/JPE 奇偶性为偶数时转移.JS 符号位为"1" 时转移.3>循环控制指令(短转移)LOOP CX不为零时循环.LOOPE/LOOPZ CX不为零且标志Z=1时循环.LOOPNE/LOOPNZ CX不为零且标志Z=0时循环.JCXZ CX为零时转移.JECXZ ECX为零时转移.4>中断指令INT 中断指令INTO 溢出中断IRET 中断返回5>处理器控制指令HLT 处理器暂停, 直到出现中断或复位信号才继续.WAIT 当芯片引线TEST为高电平时使CPU进入等待状态. ESC 转换到外处理器.LOCK 封锁总线.NOP 空操作.STC 置进位标志位.CLC 清进位标志位.CMC 进位标志取反.STD (SeT Direction flag)置方向标志位.CLD (CLear Direction flag)清方向标志位.STI 置中断允许位.CLI 清中断允许位.六、伪指令───────────────────────────────────────DW 定义字(2字节).PROC 定义过程.ENDP 过程结束.SEGMENT 定义段.ASSUME 建立段寄存器寻址.ENDS 段结束.END 程序结束.8088 汇编跳转cmp a,b 比较a与bmov a,b 把b的值送给aret 返回主程序nop 无作用,英文“no operation”的简写,意思是“do nothing” call 调用子程序je 或jz 若相等则跳jne或jnz 若不相等则跳jmp 无条件跳jb 若小于则跳ja 若大于则跳jg 若大于则跳jge 若大于等于则跳jl 若小于则跳jle 若小于等于则跳pop 出栈push 压栈MOV功能: 把源操作数送给目的操作数语法: MOV 目的操作数,源操作数格式: MOV r1,r2MOV r,mMOV m,rMOV r,dataXCHG功能: 交换两个操作数的数据语法: XCHG格式: XCHG r1,r2 XCHG m,r XCHG r,mPUSH,POP功能: 把操作数压入或取出堆栈语法: PUSH 操作数POP 操作数格式: PUSH r PUSH M PUSH data POP r POP mPUSHF,POPF,PUSHA,POPA功能: 堆栈指令群格式: PUSHF POPF PUSHA POPALEA,LDS,LES功能: 取地址至寄存器语法: LEA r,m LDS r,m LES r,mXLAT(XLATB)功能: 查表指令语法: XLAT XLAT m算数运算指令ADD,ADC功能: 加法指令语法: ADD OP1,OP2 ADC OP1,OP2格式: ADD r1,r2 ADD r,m ADD m,r ADD r,data影响标志: C,P,A,Z,S,OSUB,SBB功能:减法指令语法: SUB OP1,OP2 SBB OP1,OP2格式: SUB r1,r2 SUB r,m SUB m,r SUB r,data SUB m,data影响标志: C,P,A,Z,S,OINC,DEC功能: 把OP的值加一或减一语法: INC OP DEC OP格式: INC r/m DEC r/m影响标志: P,A,Z,S,ONEG功能: 将OP的符号反相(取二进制补码)语法: NEG OP格式: NEG r/m影响标志: C,P,A,Z,S,OMUL,IMUL功能: 乘法指令语法: MUL OP IMUL OP格式: MUL r/m IMUL r/m影响标志: C,P,A,Z,S,O(仅IMUL会影响S标志)DIV,IDIV功能:除法指令语法: DIV OP IDIV OP格式: DIV r/m IDIV r/mCBW,CWD功能: 有符号数扩展指令语法: CBW CWDAAA,AAS,AAM,AAD功能: 非压BCD码运算调整指令语法: AAA AAS AAM AAD影响标志: A,C(AAA,AAS) S,Z,P(AAM,AAD)DAA,DAS功能: 压缩BCD码调整指令语法: DAA DAS影响标志: C,P,A,Z,S位运算指令集AND,OR,XOR,NOT,TEST功能: 执行BIT与BIT之间的逻辑运算语法: AND r/m,r/m/data OR r/m,r/m/data XOR r/m,r/m/data TEST r/m,r/m/data NOT r/m 影响标志: C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位SHR,SHL,SAR,SAL功能: 移位指令语法: SHR r/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL 影响标志: C,P,Z,S,OROR,ROL,RCR,RCL功能: 循环移位指令语法: ROR r/m,data/CL ROL r/m,data/CL RCR r/m,data/CL RCL r/m,data/CL 影响标志: C,P,Z,S,O程序流程控制指令集CLC,STC,CMC功能: 设定进位标志语法: CLC STC CMC标志位: CCLD,STD功能: 设定方向标志语法: CLD STD标志位: DCLI,STI功能: 设定中断标志语法: CLI STI标志位: ICMP功能: 比较OP1与OP2的值语法: CMP r/m,r/m/data标志位: C,P,A,Z,OJMP功能: 跳往指定地址执行语法: JMP 地址JXX功能: 当特定条件成立则跳往指定地址执行语法: JXX 地址注:A: ABOVE,当C=0,Z=0时成立B: BELOW,当C=1时成立C: CARRY,当弁时成立CXZ: CX寄存器的值为0(ZERO)时成立E: EQUAL,当Z=1时成立G: GREATER(大于),当Z=0且S=0时成立L: LESS(小于),当S不为零时成立N: NOT(相反条件),需和其它符号配合使用O: OVERFLOW,O=1时成立P: PARITY,P=1时成立PE: PARITY EVEN,P=1时成立PO: PARITY ODD,P=0时成立S: SIGN,S=1时成立Z: ZERO,Z=1时成立LOOP功能: 循环指令集语法: LOOP 地址LOOPE(Z)地址LOOPNE(Z) 地址标志位: 无CALL,RET功能: 子程序调用,返回指令语法: CALL 地址RET RET n标志位: 无INT,IRET功能: 中断调用及返回指令语法: INT n IRET标志位: 在执行INT时,CPU会自动将标志寄存器的值入栈,在执行IRET时则会将堆栈中的标志值弹回寄存器字符串操作指令集MOVSB,MOVSW,MOVSD功能: 字符串传送指令语法: MOVSB MOVSW MOVSD标志位: 无CMPSB,CMPSW,CMPSD功能: 字符串比较指令语法: CMPSB CMPSW CMPSD标志位: C,P,Z,S,OSCASB,SCASW功能: 字符串搜索指令语法: SCASB SCASW标志位: C,P,Z,S,OLODSB,LODSW,STOSB,STOSW功能: 字符串载入或存贮指令语法: LODSB LODSW STOSB STOSW标志位: 无REP,REPE,REPNE功能: 重复前缀指令集语法: REP 指令S REPE 指令S REPNE 指令S标志位: 依指令S而定。
课程设计题目十进制数加减计算器学院计算机科学与技术专业计算机科学与技术班级计算机0808班姓名何爽指导教师袁小玲2010 年12 月31 日课程设计任务书学生姓名:何爽专业班级:计算机0808班指导教师:袁小玲工作单位:计算机科学与技术学院题目: 十进制数加减计算器的设计初始条件:理论:学完“汇编语言程序设计”、“课程计算机概论”、“高级语言程序设计”和“数字逻辑”。
实践:计算机学院科学系实验中心提供计算机和软件平台。
如果自己有计算机可以在其上进行设计。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)十进制数加减计算器的设计。
(2)程序应有操作提示、输入和输出,界面追求友好,最好是菜单式的界面。
(3)设计若干用例(测试数据),上机测试程序并分析(评价)所设计的程序。
(4)设计报告格式按附件要求书写。
课程设计报告书正文的内容应包括:在正文第一行写课程设计题目;1.需求说明(要求、功能简述)或问题描述;2.设计说明(简要的分析与概要设计);3.详细的算法描述;4.源程序与执行结果(含测试方法和测试结果);5.使用说明;6.总结,包括设计心得(设计的特点、不足、收获与体会)和展望(该程序进一步改进扩展的设想)。
时间安排:设计时间一周:周1:查阅相关资料。
周2:系统分析,设计。
周3~4:编程并上机调试。
周5:撰写课程设计报告。
设计验收安排:20周星期五8:00起到计算机学院科学系实验中心进行上机验收。
设计报告书收取时间:20周的星期五下午5:00之前。
指导教师签名: 2010年12月31日系主任(或责任教师)签名: 2010年12月31日目录1.需求说明 (4)2.设计说明 (4)2.1 简要分析 (4)2.2 概要设计 (4)2.2.1 主要模块 (4)2.2.2 主函数结构 (5)3.详细的算法描述 (6)3.1 详细的算法描述 (6)3.2 算法流程图 (11)3.2.1 程序流程图 (11)3.2.2 输入函数(inputdec)流程图 (12)3.2.3 输出函数(outputdec)流程图 (12)3.2.4 输出算术表达式函数(show)流程图 (13)4.源程序与执行结果 (13)4.1 源程序 (13)4.2 执行结果 (19)4.2.1 测试方法 (19)4.2.2 测试结果 (19)5.使用说明 (20)6.总结 (21)十进制数加减计算器的设计1.需求说明十进制数加减计算器的设计,要求完成:(1)用汇编语言正确编写程序,完成简单的十进制数的加减运算,(2)求能正确进行输入和输出操作,界面追求友好,尽量实现菜单操作(3)用若干测试用例来测试程序的正确性2.设计说明2.1 简要分析要正确、友好地完成用汇编语言设计十进制数的加减计算器,我们应该完成以下几个功能:(1)相关菜单及字符输出的设计(2)十进制数的输入(3)十进制数的输出(4)加法运算(5)减法运算(6)输出运算表达式(7)回车换行功能(因为为了控制格式,经常要用到)2.2 概要设计2.2.1 主要模块(1)菜单及字符menu db ‘|--------------------------------------|’0dh,0ahdb ‘| 1.Add |’0dh,0ahdb ‘| 2.Sub |’0dh,0ahdb ‘| 0.Exit |’0dh,0ahdb ‘|--------------------------------------|’0dh,0ahdb ‘Please input your choice:$’mess1 db 'Please input the first number: $'mess2 db 'Please input the second number: $'mess3 db 'The result is : $'mess4 db '-$'mess5 db '+$'mess6 db '=$'(2)十进制数的输入inputdec proc实现代码retinputdec endp(3)十进制数的输出outputdec proc实现代码retoutputdec endp(4)加法运算addfun proc显示mess1 ;提示输入第一个数call inputdec ;输入第一个数显示 mess2 ;提示输入第二个数call inputdec ;输入第二个数做加法运算显示mess3 ;提示输入第一个数call show ;输出运算表达式retaddfun endp(5)减法运算subtract proc显示mess1 ;提示输入第一个数call inputdec ;输入第一个数显示 mess2 ;提示输入第二个数call inputdec ;输入第二个数做减法运算显示mess3 ;提示输入第一个数call show ;输出运算表达式retsubtract endp(6)输出运表达算式函数show proccall outputdec ;输出第一个数输出运算符号call outputdec ;输出第二个数输出等号call outputdec ;输出运算结果retshow endp(7)回车换行crlf proc实现代码retcrlf endp2.2.2 主函数结构main proc显示menu ;供选择输入选项判断选项Case 1: call addfunCase 2: call subtractCase 3: 退出程序main endp3.详细的算法描述3.1详细的算法描述(1)main函数main procpush dsxor ax,axpush axmov ax,datamov ds,axks:lea dx,menu ;输出菜单项mov ah,09hint 21hmov al,0mov ah,01h ;输入选择项int 21hsub al,30hcmp al,2 ;判断选择项jz l2 ;如果输入为2 ,则跳转到l2cmp al,1jz l1 ;如果输入为1,则跳转到l1mov ah,4ch ;这两句为正常返回dos界面int 21hl1:call addfun ;调用加法函数jmp ks ;返回到菜单l2: call subtract;调用减法操作jmp ks ;返回到菜单main endp(2)addfun函数(加法运算函数)addfun proccall crlfmov bp,1 ;给下面的show输出中间的运算符做标记,1为加号 lea dx,mess1 ;给出输入第一个数的提示信息mov ah,09hint 21hcall inputdec;调用输入函数,输入第一个数mov si,bx ;第一个数保存在si中lea dx,mess2 ;给出输入第二个数的提示信息mov ah,09hint 21hcall inputdec;调用输入函数,输入第二个数mov di,bx ;第二个数保存在di中mov bx,si ;将第一个数保存到bx中,再进行操作,以免影响到的输出 add bx,di ;第一个数和第二个数相加,结果保存在bx中lea dx,mess3 ;给出输出结果的提示信息mov ah,09hint 21hcall show ;调用show函数,输出算术表达式ret ;返回函数调用处addfun endp(3)subtract函数(减法运算函数)subtract proccall crlfmov bp,2 ;给下面的show输出中间的运算符做标记,2为减号lea dx,mess1;给出输入第一个数的提示信息mov ah,09hint 21hcall inputdec;调用输入函数,输入第一个数mov si,bx ;第一个数保存在si中lea dx,mess2 ;给出输入第一个数的提示信息mov ah,09hint 21hcall inputdec;调用输入函数,输入第一个数mov di,bx ;第二个数保存在di中mov bx,sicmp bx,di ;比较第一个数和第二人数的大小js subl1 ;如果为负(第一个数小一些)则跳转sub bx,di ;否则直接进行计算,结果保存在bx中jmp subl2subl1:mov bp,3 ;为show里面是否输出负号作准备,3的时候要输出负号push di ;先将第二个操作数进栈,否则下面的减法操作会将其值改变 sub di,bxmov bx,dipop di ;第二个操作数出栈,再赋给di寄存器subl2:lea dx,mess3 ;输出运算表达式的提示mov ah,09hint 21hcall show ;调用show函数,输出运算表达式retsubtract endp(4)inputdec函数(十进制输入函数)inputdec procmov bx,0il0:mov ah,01h ;输入数字int 21hcmp al,0dh ;判断是否为回车jz iexit ;如果是回车,则返回到函数调用处sub al,30h ;得到输入数字的真实大小mov ah,0xchg bx,ax ;将bx值与ax值交换,因为下面乘以10是将ax中的值乘10 mov cx,10 ;注意,这里不能用CL,否则数较大时就会出现问题mul cx ;将ax中的值乘以10,也就是将bx中原来的值乘以10add bx,axjmp il0 ;进行输入下一数值位iexit:call crlfretinputdec endp(5)outputdec函数(十进制输出函数)outputdec procpush bpmov bp,0 ;前导0输出与否的标志,0时不输出,1时输出mov ax,bxmov dx,0 ;在进行除法之前,要对dx赋0,否则结果出错mov cx,10000div cx ;除法,字操作,商在ax中,余数在dx中mov bx,dx ;保存余数,作为下一次裤除数mov dl,alcmp dl,0 ;将万位同0比较jz ol0 ;如果万位为0则不输出万位mov bp,1 ;如果万位不为0,则应将bp设为1,以后的0都要输出or dl,30hmov ah,02hint 21h ;输出万位ol0:mov ax,bx ;输出千位的方法与万位相同mov dx,0mov cx,1000div cx ;字操作,商在ax中,余数在dx中mov bx,dx ;保存余数,作为下一次裤除数mov dl,alcmp bp,0jz ol1or dl,30hmov ah,02hint 21h ;输出千位jmp ol2ol1:cmp dl,0jz ol2mov bp,1or dl,30hmov ah,02hint 21h ;输出千位ol2:mov ax,bx ;输出百位与千位、万位方法相同mov dx,0mov cx,100div cx ;字操作,商在ax中,余数在dx中mov bx,dx ;保存余数,作为下一次裤除数mov dl,alcmp bp,0jz ol3mov bp,1or dl,30hmov ah,02hint 21h ;输出百位jmp ol4ol3:cmp dl,0jz ol4or dl,30hmov ah,02hint 21h ;输出百位ol4:mov ax,bx ;输出十位的方法与前面几位方法相同mov cl,10div cl ;字节操作,商在al中,余数在ah中mov bl,ah ;保存余数,作为下一次裤除数,也就是个位数mov dl,alcmp bp,0jz ol5mov bp,1or dl,30hmov ah,02hint 21h ;输出十位jmp ol6ol5:cmp dl,0jz ol6or dl,30hmov ah,02hint 21h ;输出十位ol6:mov dl,bl ;在上面,bl中的数直接就应该为个位,所以直接输出or dl,30hmov ah,02hint 21hpop bp ;恢复bpretoutputdec endp(6)show函数(输出运算表达式函数)show procpush bx ;把运算结果保存起来mov bx,si ;第一个数放在si中call outputdec;输出第一个数cmp bp,3 ;是否为减号jz sl0cmp bp,2 ;判断是否为减号jz sl0lea dx,mess5 ;输出加号mov ah,09hint 21hjmp sl1sl0:lea dx,mess4 ;输出减号mov ah,09hint 21hsl1:mov bx,di ;第二个数放在di中call outputdec ;输出第二个数lea dx,mess6 ;输出等号mov ah,09hint 21hcmp bp,3 ;判断是否需要输出负号 jnz sl2lea dx,mess4 ;输出负号mov ah,09hint 21hsl2:pop bx ;得到运算结果call outputdec;输出运算结果call crlfretshow endp(7)crlf函数(输出回车换行函数)crlf procpush axpush dxmov ah,02hmov dl,0dh ;输出回车int 21hmov dl,0ah ;输出换行int 21h ;ah值被改变 pop dxpop axretcrlf endp3.2 算法流程图3.2.2 十进制输入(inputdec)流程图3.2.3 十进制输出3.2.4 输出算术表达式(show)流程图4.4.1 源程序assume cs:code,ds:datadata segment ;定义数据段menu db ‘|--------------------------------------|’0dh,0ah db ‘| 1.Add |’0dh,0ah db ‘| 2.Sub |’0dh,0ah db ‘| 0.Exit |’0dh,0ahdb ‘|--------------------------------------|’0dh,0ahdb ‘Please input your choice:$’mess1 db 'Please input the first number: $'mess2 db 'Please input the second number: $'mess3 db 'The result is : $'mess4 db '-$'mess5 db '+$'mess6 db '=$'data ends ;数据段结束code segment ;定义代码段main proc ;主函数push dsxor ax,axpush axmov ax,datamov ds,axks:lea dx,menumov ah,09hint 21hmov al,0mov ah,01hint 21hsub al,30hcmp al,2jz l2cmp al,1jz l1mov ah,4chint 21hl1:call addfunjmp ksl2: call subtractjmp ksmain endp ;主函数结束addfun proc ;加法运算函数call crlfmov bp,1 ;给下面的show输出中间的运算符做标记 lea dx,mess1mov ah,09hint 21hcall inputdecmov si,bx ;第一个数保存在si中lea dx,mess2int 21hcall inputdecmov di,bx ;第二个数保存在di中mov bx,siadd bx,dilea dx,mess3mov ah,09hint 21hcall show ;输出结果retaddfun endp ;加法运算函数结束subtract proc ;减法运算函数call crlfmov bp,2 ;给下面的show输出中间的运算符做标记 lea dx,mess1mov ah,09hint 21hcall inputdecmov si,bx ;第一个数保存在si中lea dx,mess2mov ah,09hint 21hcall inputdecmov di,bx ;第二个数保存在di中mov bx,sicmp bx,dijs subl1 ;如果为负则跳转sub bx,dijmp subl2subl1:mov bp,3 ;为show里面是否输出负号作准备push disub di,bxmov bx,dipop disubl2:lea dx,mess3mov ah,09hint 21hcall showretsubtract endp ;减法运算函数结束inputdec proc ;十进制输入函数il0:mov ah,01hint 21hcmp al,0dh ;判断是否为回车jz iexitsub al,30hmov ah,0xchg bx,axmov cl,10mul cladd bx,axjmp il0iexit:call crlfretinputdec endp ;十进制输入函数结束outputdec proc ;十进制输出函数push bp ;用来做前导0的标记mov bp,0mov ax,bxmov dx,0 ;在进行除法之前,要对dx赋0,否则结果over devide mov cx,10000div cx ;字操作,商在ax中,余数在dx中mov bx,dx ;保存余数,作为下一次裤除数mov dl,alcmp dl,0jz ol0mov bp,1or dl,30hmov ah,02hint 21h ;输出万位ol0:mov ax,bxmov dx,0mov cx,1000div cx ;字操作,商在ax中,余数在dx中mov bx,dx ;保存余数,作为下一次裤除数mov dl,alcmp bp,0jz ol1or dl,30hmov ah,02hint 21h ;输出千位jmp ol2ol1:cmp dl,0jz ol2mov bp,1or dl,30hmov ah,02hint 21h ;输出千位ol2:mov ax,bxmov dx,0mov cx,100div cx ;字操作,商在ax中,余数在dx中 mov bx,dx ;保存余数,作为下一次裤除数mov dl,alcmp bp,0jz ol3or dl,30hmov ah,02hint 21h ;输出百位jmp ol4ol3:cmp dl,0jz ol4mov bp,1or dl,30hmov ah,02hint 21h ;输出百位ol4:mov ax,bxmov cl,10div cl ;字节操作,商在al中,余数在ah中 mov bl,ah ;保存余数,作为下一次裤除数mov dl,alcmp bp,0jz ol5or dl,30hmov ah,02hint 21h ;输出十位jmp ol6ol5:cmp dl,0jz ol6mov bp,1or dl,30hmov ah,02hint 21h ;输出十位ol6:mov dl,blor dl,30hmov ah,02hint 21hpop bp ;恢复bpretoutputdec endp ;十进制输出函数结show proc ;输出运算式函数push bx ;把运算结果保存起来 mov bx,si ;第一个数放在si中 call outputdeccmp bp,3 ;是否为减号jz sl0cmp bp,2jz sl0lea dx,mess5mov ah,09hint 21hjmp sl1sl0:lea dx,mess4mov ah,09hint 21hsl1:mov bx,di ;第二个数放在di中 call outputdeclea dx,mess6mov ah,09hint 21hcmp bp,3jnz sl2lea dx,mess4mov ah,09hint 21hsl2:pop bx ;得到运算结果call outputdeccall crlfretshow endp ;输出运算式函数结束crlf proc ;回车换行函数push axpush dxmov ah,02hmov dl,0dhint 21hmov dl,0ahint 21h ;ah值被改变pop dxpop axretcrlf endp ;回车换行函数结束code ends ;代码段结束end main ;程序结束4.2 执行结果4.2.1 测试方法本次测试我们采用的是通过菜单形式,输出选择项,然后根据提示信息,输入相关数字,进行举例测试。
基于汇编语言的32位二进制、十进制转换及应用汇编语言是一种底层的编程语言,它可以直接操作计算机硬件,具有高效性和灵活性。
在计算机系统中,二进制和十进制是两种常见的数值表示方式。
本文将介绍如何使用汇编语言实现32位二进制和十进制之间的转换,并讨论其在实际应用中的作用。
首先,我们需要了解32位二进制和十进制的表示方法。
32位二进制是由32个二进制位组成的数值,每个位上可以是0或1,可以表示的数值范围是0到2的32次方减1。
而十进制是由0到9这10个数字组成的数值,每个数字的权值是10的某次方,例如123表示1*10^2+2*10^1+3*10^0=123。
在汇编语言中,我们可以使用位运算符和乘除法运算符来进行二进制和十进制的转换。
下面是一个将32位二进制转换为十进制的简单例子:```assemblymov eax, 10101010101010101010101010101010b ; 将二进制数赋值给eax寄存器mov ebx, 0 ; 初始化十进制数为0mov ecx, 1 ; 初始化权值为1loop:shr eax, 1 ; 右移一位,相当于除以2jnc skip ; 如果最低位是0,跳过加法add ebx, ecx ; 加上当前权值skip:add ecx, ecx ; 权值乘以2 cmp ecx, 100000000h ; 判断是否超出32位jnc done ; 如果超出32位,跳出循环jmp loop ; 继续循环done:; 十进制数已经存储在ebx寄存器中```以上代码使用了循环和条件判断语句,每次将二进制数右移一位,判断最低位是否为1,如果是则加上当前权值,否则跳过加法。
最后判断权值是否超出32位,如果是,则跳出循环,十进制数已经存储在ebx寄存器中。
除了将二进制转换为十进制,我们还可以将十进制转换为二进制。
下面是一个将十进制转换为32位二进制的简单例子:```assemblymov eax, 123 ; 将十进制数赋值给eax寄存器mov ebx, 0 ; 初始化二进制数为0mov ecx, 1 ; 初始化权值为1loop:cmp ecx, 100000000h ; 判断是否超出32位jnc done ; 如果超出32位,跳出循环cmp eax, ecx ; 判断是否小于当前权值jb skip ; 如果小于,跳过or ebx, ecx ; 将当前权值设置为1sub eax, ecx ; 减去当前权值skip:add ecx, ecx ; 权值乘以2 jmp loop ; 继续循环done:; 二进制数已经存储在ebx寄存器中```以上代码使用了循环和条件判断语句,每次将当前权值与十进制数进行比较,如果小于当前权值,则跳过,否则将当前权值设置为1,并从十进制数中减去当前权值。
伪指令•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时,顺序执行。
汇编语言命令大全MOV(MOVE)传送指令P28PUSH 入栈指令P32POP 出栈指令P33XCHG(eXCHanG)交换指令P34XLAT(TRANSLATE)换码指令P34LEA (Load Effective Address)有效地址送寄存器指令P35 LDS(Load DS with pointer)指针送寄存器和DS指令P35 LES(Load ES with pointer)指针送寄存器和ES指令P35 LAHF(Load AH with Flags)标志位送AH指令P36 SAHF(Store AH into Flgs)AH送标志寄存器指令P36 PUSHF(PUSH the Flags)标志进栈指令P36POPF(POP the Flags)标志出栈指令P37ADD 加法指令P38ADC 带进位加法指令P39INC 加1指令P39SUB(SUBtract)不带借位的减法指令P40SBB(SuVtrach with borrow)带借位的减法指令P40DEC(DECrement)减1指领P41NEG(NEGate)求补指令P41CMP(CoMPare)比较指令P42MUL(unsinged MULtiple)无符号数乘法指令P46IMUL(sIgned MUL tiple)有符号数乘法指令P46DIV(unsigned DIVide)无符号数除法指令P48IDIV(sIgned DIVide)有符号数除法指令P48CBW(Count Byte to Word)字节转换为字指令P50CWD(Count Word to Doble word)字转换为双字指令P50 DAA 压缩的BCD码加法十进制调整指令P53DAS 压缩的BCD码减法十进制调整指令P53AAA 非压缩的BCD码加法十进制调整指令P54AAS 非压缩的BCD码加法十进制调整指令P54AND 逻辑与指令P54OR 逻辑或指令P55XOR 逻辑异或指令P56NOT 逻辑非指令P56TEST 测试指令P57SHL(SHift logical Letf)逻辑左移指令P57SHR(SHift logical Right)逻辑右移指令P57ROL(Rotate Left )循环左移指令P58ROR(Rotate Right)循环右移指令P58RCL(Rotate Left through Carry)带进位循环左移P58 RCR(Rotate Right through Carry)带进位循环左移P58 MOVS(MOVe String)串传送指令P58STOS(STOre into String)存入串指令P60LODS(LOad from string)从串取指令P60REP(REPeat)重复操作前缀P61CLD(CLear Direction flag)清除方向标志指令P61STD(SeT Direction flag)设置方向标志指令P61CMPS(CoMPare String)串比较指令P62SCAS(SCAn String)串扫描指令P63REPE/REPZ(REPeat while Equal/Zero)相等/为零时重复操作前缀P63REPNE/REPNZ(REPeat while Not Equal/Zero)不相等/不为零进重复前缀IN(INput)输入指令P65OUT(OUTput)输出指令P65JMP(JuMP)无条件转移指令P66JZ,JNZ,JS,JNS,JO,JNO,JP,JNP,JB,JNB,JBE,JNBE,JL,JNL,JLE,JNLE,JCXZ 条件转移指令P67LOOP 循环指令P70LOOPZ/LOOPE 为零/相等时循环指令P70LOOPNZ/LOOPNE 不为零/不相等时循环指令P70CALL 子程序调用指令P71RET(RETun)子程序返回指令P72CLC(CLear Carry)进位位置0指令P77CMC(CoMplement Carry)进位位求反指令P77SRC(SeT Carry)进位位置1指令P77NOP(No OPeretion)无操作指令P77HLT(HaLT)停机指令P77OFFSET 返回偏移地址P85SEG 返回段地址P85EQU(=) 等值语句P90PURGE 解除语句P91DUP 操作数字段用复制操作符P93 SEGMENT,ENDS 段定义指令P95 ASSUME 段地址分配指令P95ORG 起始偏移地址设置指令P96$ 地址计数器的当前值P97PROC,ENDP 过程定义语句P97NAME,TITLE,END 程序开始结束语句P98。