南邮《汇编语言程序设计》期末复习 CH3: 汇编语言指令集

本文转载自厉害的 孔姐姐博客

由一只孔姐姐的小迷弟负责排版和整理~

一、基本概念

1.指令:单个的 CPU 操作,通知 CPU 执行某种操作的 “命令”
  • 指令集:所有指令的集合

  • 机器指令:用二进制序列(0、1)代码书写。硬件只能识别、存储和运行机器指令

  • 符号指令:用字符串形式的序列(包含字符串形式的操作码、操作数)

2.指令的组成:操作码 + 操作数
  • 指令长度:机器指令长度为 1~16 字节

  • 指令地址:多字节指令会占用连续的内存单元,存放指令第一个字节的内存地址,称为 指令地址

  • 指令存放:

    • 多字节的操作数连续存放,规则遵循 小端法
    • 低字节存放在低地址单元,高字节存放在高地址单元。
  • 指令格式:
    在这里插入图片描述

3.操作数:指令的操作对象(输入数据、输出数据)----> 存放于 CPU 寄存器、计算机的存储器、接口电路中的端口

(1)寄存器操作数:存放于通用寄存器(8 个)中

(2)段寄存器和程序指针: CS:IP 决定取哪条指令

(3)标志存储器:分 状态标志控制标志

  • 状态标志

C:最高位产生 借位或进位标志。进位 C=1

O:溢出标志。溢出 O=1

Z:零标志。结果为 0 则 Z=1

S:符号标志。就是结果的符号位。

P:奇偶标志。低 8 位中 1 的个数为偶数 P=1

A:辅助进位标志。低半字节向高半字节有进位或借位,A=1

  • 控制标志

D:方向标志。D=1 时串操作时自动减量

I:中断标志。I=1 时允许 CPU 接收外部的中断请求

T:陷阱标志。T=1 时进入单步调试状态。
在这里插入图片描述

注意 O 标为 0,加数与被加数是 1,结果也是 1,相同。O 标为 0

但是,在讨论是否溢出的时候,就要分情况讨论了。(有 O,无 C)

二、寻址方式

1.操作数的存在方式(4 种)
  • 立即数:包含在指令中 ------------ 立即寻址

  • 寄存器操作数:存放于 CPU 的某个寄存器中 ---------------- 寄存器寻址

  • 内存操作数:存放于存储器中 ------------------ 存储器寻址

  • I/O 端口操作数:存放于 I/O 端口中

2.立即寻址:
MOV AL,OFFSET BUF ;(是不是可以理解成,取出了偏移量,就取得了操作数)
MOV CX,0A234H     ;( A~F 开头的数字,加上 0 作为前缀)
3.寄存器寻址:存放在寄存器中
MOV EAX,12345678H
INC  SI
4.存储器寻址(内存操作数寻址): 5 种

使用段页式管理部件,将指令中的逻辑地址转化为对应的物理地址,(对应第二章实模式下,存储地址空间)再通过总线系统访问实际的物理存储单元。

  • 段寄存器名称 : 偏移地址表达式

段寄存器名称,也称为段超越前缀,是存放操作数的存储单元所在的逻辑段:如 CS、DS、SS、ES。而这些段寄存器中存放逻辑段的段基址(逻辑段在存储空间中的位置)。 16 位

偏移地址表达式,给出偏移地址,也称偏移量,相对于逻辑段段首单元的地址偏移量。16 位

  • 操作数的物理地址 = 段基址 * 16 + 偏移地址

(1)直接寻址:偏移地址 用数值、变量名表示

ADD AL,DS:[45H]        ;这里段寄存器名称一定要加
MOV AX,ES:[1000H]
MOV AX,DS:BUF          ;也可以写成 MOV AX,BUF
INC BUF+2

用变量名代表偏移地址,变量名在汇编的时候,会给出实际的偏移地址,所以 BUF+2,BUF 都是直接寻址。

(2) 寄存器间接寻址:间接寻址、间址

注意,这里是要从内存中取操作数,但是通过寄存器找的而已,差不多这意思?

MOV AX,[BX]
MOV AX,[SI]

但是,只有一些指定的通用寄存器能够作为间址寄存器使用
在这里插入图片描述

(3)基址寻址:

MOV AX,[BX+2]

同样,只用一些特别指定的通用寄存器可以作为基址寄存器使用
在这里插入图片描述

(4)变址寻址:

MOV AL,[SI+2]

有比例因子的变址寄存器的寻址位数都是 32 位的(就是 E。。。)

无比例因子的变址寻址方式只能使用 SI、DI

MOV SI,BUF 单元的偏移地址
MOV AH,SS:[SI+3]

在这里插入图片描述

(5) 基址 + 变址寻址

MOV AL,[BX+SI+2]

总结一下寻址方式:

  • BX、SI、DI 对应的一定是数据段,BP 对应的一定是堆栈段

  • SI、DI 不能做基址寄存器。 [SI] 是间址, [SI+3] 是变址,[BX] 是间址,[BX+3] 是基址。

  • [BX]、[SI] 是间址

  • [DX] 是不对的,没有 DX 的寄存器

三、汇编语言语法(名字项、操作数项、操作项)

1.可执行文件的生成(考察后缀名,过程)

源程序 ------------ .asm ----------------------- .obj --------------------- .exe

​ EDIT 编辑 TASM 汇编 TLINK 链接

  • .exe

  • .com

2.语句类型:指令性语句 指示性语句

指令性语句: 符号指令(机器指令):CPU 执行

指示性语句:伪指令和宏指令

  • 伪指令:数据定义伪指令符号定义伪指令。汇编工具执行,为汇编工具提供信息,例如计算出某个逻辑段的段基址。有 DB/DW/DD、EQU、SEGMENT、END 等等。
3.名字项:有标号和变量 2 种类型。又称符号地址,都有段属性、偏移属性、类型属性三种。
JUMP 标号       ;这里的标号就是符号地址

标号:定义在代码段中。

变量:定义在 DS、SS、ES 中

4.操作项:操作码助记符(MOV SUB…)、伪指令助记符

数据定义伪指令: DB DW DD DF/DQ/DT

符号定义伪指令:EQU =

注意的点:

①DB 可以定义用单引号括起来的很长的字符串,但是都是按照从上往下,地址由低向高排的

但是 DW 只能存单引号括起来的一个或者两个字符

5.操作数项:包括数值表达式、地址表达式

(1)数值表达式:标号和变量、常量(立即数、字符串常数、符号常数)、数值运算符(算术运算符、逻辑运算符、关系运算符、数值回送运算符)

字符串常数是用单引号括起来的一个或多个字符,在汇编结束后,会转换成对应的 ASCII 码。'12’会转换为 3132H。

关系运算只能对两个数字,或者同一个逻辑段的两个存储单元中的数。如果为真,则结果为 0FFFF H,,假的结果为 0

数值回送运算符中:

  • SEG 取出数据段的段基址

  • OFFSET 取出,在逻辑段中相对于段首的偏移地址

  • $ 返回当前汇编地址计数器的值

MOV AX,SEG DATA  ;SEG 可省略
MOV AX,SEG DATA
MOV DS,AX
BUF DB 10H,20H,30H
MOV BX,OFFSET BUF
MOV AH,[BX+1]

执行后(AH)=20H

BUF DB 'HELLO NUPT'
COUNT EQU $-BUF

汇编结束后,COUNT 的值为 10

(2)地址表达式:汇编结束后,是变量或者标号所在逻辑段的偏移地址值

包括 方括号运算符 [] 和变量的地址表达式、属性操作符(PTR、LOW/HIGH、SHORT、THIS)

MOV AH,BUF[1]
;等效于
MOV AH,BUF+1

PTR 操作符:

属性不对,必须用 PTR

(源操作数是立即数),除了直接寻址的内存操作数,都必须加 PTR

(5)操作项:包括操作码助记符、伪指令助记符

伪指令:数据定义伪指令(DB DW DD)、数据定义伪指令(EQU = )

四、汇编语言指令集

传送指令、算术运算指令、转移和调用指令、逻辑运算和移位指令、串操作指令、处理机控制指令

1.传送类指令

通用传送:MOV MOVSX MOVZX LEA 指针传送指令 LAHF/SAHF XCHG

​ MOV XCHG 源目操作数不能同时为内存操作数,不能将立即数直接传送到段寄存器

堆栈操作指令 PUSH POP , 栈底是高地址单元。

PUSH 之后,(SP) - 2 -> (SP) ; POP 之后,(SP) + 2 -> (SP)

这里有些例题,挺有意思的

2.算术运算类指令
  • ADD SUB 不能同时为内存操作数,不能同时为段寄存器 ADC SBB 为二进制数带进位

  • INC DEC: INC [BX], 单操作数,直接寻址必须加 PTR

  • NEG:求补指令,但是不是求补码! 0 - 目标操作数

  • MUL 乘数

字节乘法: AL ---->AX AL×乘数 = AX

字乘法:AX—>DXAX 高位 DX, 低位 AX AX×乘数 = DXAX

双字乘法:EAX---->EDXEAX

  • DIV 除数

字节除法:被除数 AX,商 AL, 余数 AH AX÷除数 = AL···AH

字除法:DXAX÷除数 = AX···DX 与字节除法的存储方式类似,余数覆盖高位的被除数,商覆盖低位的被除数。

(里面 2 个,外面 2 个,成对覆盖,方便记忆。。。)

  • CMP 比较指令 (CMP X,Y X-Y)
CMP BYTE PTR [BX],45H
JC NEXT
  • BCD 码调整指令

我认为考试应该只考组合 BCD 码(比如 8421 码),希望不要打脸,我要复习不完了。。。

记得第一章有 BCD 码的结果调整方法:

低四位有进位,+06H

低四位非法,+66H

高四位非法,+60H

我们在给计算机在存储数值的时候,都是用的 XXH,如果直接 ADD AX,BX, 那么进行的是真实的, 16 进制的加法。09H+06H=0FH

如果需要进行 BCD 码运算,就得用到 BCD 码的调整指令。09H +06H =15H

(这里为什么有 H 啊,H 不是十六进制数吗?其实可以这样理解,BCD 码中的 H 是没有实际意义的,只是为了方便 BCD 码的简写)

;用算术运算指令实现十进制的计算1234+5678
N1 DW 1234H
N2 DW 5678H
SUM DW ?
 
 
;-----字加----
MOV AX,N1
ADD AX,N2
DAA 
MOV SUM,AX
 
;-----字节加----
 
MOV AL,BYTE PTR N1
ADD AL,BYTE PTR N2
DAA
MOV BYTE PTR SUM,AL
 
MOV AL,BYTE PTR N1+1
ADD AL,BYTE PTR N2+1
DAA
MOV BYTE PTR SUM+1,AL
3.转移和调用指令

包括:无条件转移 JMP 、条件转移指令、子程序调用与返回指令、软件中断与返回指令

JMP 标号 只考察段内直接转移(只修改 IP,CS 值不变) 标号是符号指令的地址

条件转移指令有 3 个表格要记(根据状态位的,无符号数的,有符号数的)

这三个表里,JC(C=1)、 JZ(Z=1)、 JNC、 JNZ

JA(jump above) JC(C=1)

JG(jump greater,x>y) JGE(x>=y) 常用

LOOP:

    MOV CX,5
AGAIN:
 
 ....
 
    LOOP AGAIN

子程序 XYZ 调用: CALL XYZ

掌握段内直接调用,其原理是,首先将 CALL 指令的下一条指令的地址,即断点的偏移地址压入堆栈中保存,然后将子程序的入口偏移地址 ->(IP),(SP-2)->SP,程序由主程序转到子程序

;主函数中
CALL XYZ
 
;子程序
XYZ PROC
 ....
 ....
 ....
 RET
XYZ ENDP

软件中断与返回指令:

INT n

在第四章中,会疯狂地用到

4.逻辑运算和移位指令
  • 取反 NOT

  • 与运算 AND:使特定位为 0

  • 或运算 OR:使特定位为 1

  • XOR:使特定位取反,,,用 1 异或 x, 对 x 取反

  • TEST:测试, 运算,影响标志位

移位指令

开环:SAL SAR SHL SHR

闭环:RCL RCR ROL ROR

左移、右移看最后一个字母 left or right

逻辑、算术运算看中间 algorithm

带 R 的是有循环 recycle?

有符号数 – 算术右移补符号位

开环的左移一定都补 0,因为毕竟左移是要乘 2 的

闭环带 C 的,那就是含进位的,左移出来的那一位,不仅给了 C,也循环到了第 0 位

5.串操作指令

这里,应该是只要掌握

①源串定义在数据段,用 SI 间址访问

②目标串定义在附加段,用 EI 访问

③D=1(STD 使得 D=1),减址传送 D=0(CLD 使得 D=0),增址传送

  • 3
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
一、单项选择题(本大题共20小题,每小题1分,共20分)在每小题列出的四个备选项中只有一个是符合题目要求的,请将其代码填写在题后的括号内。错选、多选或未选均无分。 1.CPU要访问的某一存储单元的实际地址称(   )   A.段地址         B.偏移地址   C.物理地址        D.逻辑地址 2.某存储单元的物理地址是12345H,可以作为它的段地址有(   )   A.2345H        B.12345H   C.12340H       D.1234H 3.执行后使BX=0的同时也使CF=0,OF=0的指令是(   )   A.XOR BX,BX    B.OR BX,BX   C.AND BX,BX    D.CMP BX,BX 4.循环控制指令LoopNZ/LoopNE控制循环继续执行的条件是(   )   A.CX≠0且ZF=1    B.CX≠0且ZF=0   C.CX≠0或ZF=1    D.CX≠0或ZF=0 5.在执行DAA指令,当高四位BCD码校正时产生进位,如要把此进位值送入AH中,对这进位值的操作应是(   )   A.DAA校正指令的功能已自动加在AH中   B.进位值在AF中,校正后根据AF内容再加在AH中   C.进位值在CF中,校正后根据CF内容再加在AH中   D.进位值在AL最高位上,校正后根据AL最高位内容再加在AH中 6.AND,OR,XOR,NOT为四条逻辑运算指令,下面的解释正确的是(   )   A.指令XOR AX,AX执行后,AX内容不变,但设置了标志位   B.指令OR DX,1000H执行后,将DX最高位置1,其余各位置0   C.指令AND AX,OFH执行后,分离出AL低四位   D.NOT AX,执行后,将AX清0 7.在执行下列指令时,需要使用段寄存器DS的指令是(   )   A.STOSW        B.ADD AL,CL   C.NEG BX       D.INC DA[BX] 8.无论BH中原有的数是奇数或偶数,若要使BH中的数一定为奇数,应执行的指令是(   )   A.ADD BH,01H     B.OR BH,01H   C.XOR BH,01H     D.TEST BH,01H 9.完成对CL寄存器的内容乘以4的正确操作是(   )   A.ROL CL,1        B.MUL 4     ROL CL,1   C.SHL CL,1        D.MOV CL,2    SHL CL,1             SHL CL,CL 10.下面各传送指令中,正确的是(   )   A.MOV [DI],[SI]            B.MOV[DX+DI],AL   C.MOV WORD PTR [BX],0100H       D.MOV AL,BX 11.汇编语言语句格式中对名字项的规定如下,请找出其中错误的说法(   )   A.名字的第一个字符可以是大写英文字母及小写英文字母   B.名字的第一个字符可以是字母、数字及、@、_   C.名字的有效长度≤31个字符   D.在名字中不允许出现$ 12.要实现使BETA的值为56,应采用语句为(   )   A.BETA DB 56      B.BETA DB 56H   C.BETA EQU 56      D.BETA EQU 56H 13.REPZ CMPSW指令,重复执行的终止条件是(   )   A.CX=0或ZF=0      B.CX=0且ZF=0   C.CX=0或ZF=1      D.CX=0且ZF=1 14.下面程序段执行后,AL中的内容是(   )   MOV AX,8833H   ADD AL,AH   DAA   A.21       B.21H   C.0C1H      D.0DDH 15.比较两个带符号的数A、B,当A=B时程序转移,测试的条件为(   )   A.ZF=1      B.ZF=0   C.SF=1      D.SF=0 16.检查二个无符号数的关系,若要实现AL≥BL时分支去LOP1处,那么在“CMP AL,BL”指令后应跟的分支指令是(   )   A.JNC LOP1      B.JA  LOP1   C.JC LOP1      D.JGE  LOP1 17.在下列串操作指令中,同时使用源串和目的串地址指针的指令是(   )   A.STOSW      B.LODSW   C.SCASW      D.CMPSW 18.设AL=0AH,下列指令执行后能使AL=05H的是(   )   A.NOT AL         B.AND AL,0FH   C.XOR AL,0FH      D.OR AL,0FH19.DA1  DW‘AB’,‘CD’,‘EF’,‘GH’(   )     ┇    MOV AX,DA1+3  指令执行后AX中的内容是  A.‘EF’   B.‘CD’  C.‘BC’   D.‘FC’20.使用DOS系统功能调用时,使用的软中断指令是(   )  A.INT 21      B.INT 10H  C.INT 16H     D.INT 21H二、填空题(本大题共12空,每空0.5分,共6分)请在每小题的空格中填上正确答案。错填、不填均无分。21.十六进制数0FFF8H表示的十进制正数为________,表示的十进制负数为________。22.若DS=0F3EH,SI=2000H,COUNT=0A8H,指令MOV AX,(SI+COUNT)中,源操作数的有效地址EA为________,其物理地址为________。23.CPU的标志寄存器中标志位,可以分为两大类,其中一类称为________标志位,另一类称为________标志位。24.当标志位________=1时表示无符号数运算产生溢出,而当标志位________=1是表示带符号数运算产生溢出。25.如JMP指令采用段间间接寻址,那么由4个相邻字节单元中存放有转移地址,其中前两个字节存放的是________,而后两个字节存放的是________。26.在串操作程序中,通常在重复前缀指令REPZ或REPNZ后,选用的串操作指令是________或________才有实际意义。三、简答题(本大题共4小题,每小题2分,共8分)27.已知:BX=1357H,DI=2000H,DS=2000H,CS=4000H,分别指出下面各指令中存储器操作数的物理地址。(1)MOV AL,[BX](2)MOV CS:[BX+DI],AH28.0P1 DB 1,2 0P2 DW 3412H,5678H┇ MOV AX,OP1+1;字单元(OP1+1) AX MOV BL,OP2+1;字节单元(OP2+1) BL 上述二条传送语句有语法错误,请根据注释字段的说明,将其改正。29.下列语句在存储器中分别为变量分配多少字节? (1)AD2 DW 10 DUP(?),10 (2)AD3 DD 100 DUP(?)30.简述下面两条指令分别是什么语法错误? MOV [BX],[SI] MOV AX,DL四、程序分析题(本大题共6小题,每小题6分,共36分)31. MOV DL,AL   NOT DL   TEST DL,04H   JE NEXT        ┇ NEXT:…   若上述程序段执行时产生分支,说明AL中的数第几位一定为1?程序段执行后CF是多少?32.DA1  DB‘ABCDEFGHI’  DA2  DB  9 DUP(0)    ┇    LEA SI,DA1    LEA DI,DA2    MOV CX,9    CLD  LOP: LODSB    SUB AL,10H    STOSB    LOOP LOP    . . . 试问:①写出程序执行后DA2各字节中的数据。   ②保持程序功能情况下,程序中 可否改写为 33.已知:BX=4567H   NEG BX   INC BX   NEG BX   DEC BX 程序段执行后,BX=________,CF=________。34.   MOV BL,64H     MOV CL,03H     XOR AX,AX AGAIN:ADD AL,BL    ADC AH,0    DEC CL    JNZ AGAIN 问:(1)该程序段完成的功能是:   (2)AX=________。35.已知数据段中定义 DAT1 DB  12H,34H,56H,78H    MOV CX,0    MOV AX,WORD PTR DAT1    MOV CL,DAT1+3 当程序段执行完后AX=________,CX=________。36.DA1  DB 83H,72H,61H,94H,5AH    ┇     MOV CX,WORD PTR DA1     AND CX,0FH     MOV AL,DA1+3     SHL AL,CL  上述指令序列执行后,AL=_______,CL=_______。五、程序填空题(本大题共2小题,每小题6分,共12分)37.在NUMW单元存放有一个0-65535范围内的整数,将该数除以500,商和余数分别存入QU1和REM单元,请在空行处各填上一条指令完善该程序。   ┇ MOV AX,NUMW _____________ XOR DX,DX DIV BX MOV QUI,AX  _____________38.某程序欲用单个字符显示的2号功能调用去显示STRING中的字符串‘COMPUTER’(不显示字符‘$’!).试在空白处填上适当的一条指令。 STRING DB‘COMPUTER’,‘$’ ┇ MOV BX,0FFSET STRING LOP:MOV DL,[BX]    MOV AH,02H    INT 21H    ____________________    ____________________    JNE LOP六、编程序题(本大题共2小题,第39小题6分,第40小题12分,共18分)39.试编制一程序段,用串操作指令实现以DA_BY为首址的20H个字节单元中存放相同字符‘Y’(设DA_BY存储区已有ES指向)。40.试编制一源程序,统计DA1字单元中含0的个数,如统计的个数为奇数,则将进位位置1,否则进位位清0。    DATA  SEGMENT    DA1  DW  XXXX    DATA ENDS2006年10月汇编语言程序设计试题答案  来源: http://www.csai.cn 2006年10月汇编语言程序设计试题答案一、1、C;2、D;3、A;4、B;5、C;6、C;7、D;8、B;9、C;10、C;11、B;12、C;13、A;14、B;15、A16、C;17、D;18、C;19、D;20、B二、21、+65528;-3276022、20A8H;11488H23、状态;控制24、CF;OF25、IP;CS26、STOS;CMP三、27、(1)21357H;(2)43357H28、MOV AX,WORD PTR(OP1+1)    MOV BL,BYTE PTR(OP2+1)29、(1)22;(2)40030、MOV指令不能在两个存储器操作数之间进行;    操作数类型不匹配四、31、第2位;CF=032、123456789;不能更改33、BX=4565H;CF=134、AX=012CH,将AX内容乘3送BX中35、AX=3412H,CX=0078H36、AL=0A0H,CL=03H五、37、MOV BX,500    MOV REM,DX38、INC BX    CMP [BX],24H六、39、LEA DI,DA_BY        MOV CX,32        MOV AL,‘Y’        CLD        REP STOSB40、CODE SEGMENT          ASSUME CS:CODE,DS:DATA       START: MOV  AX,DATA              MOV  DS,AX              LEA  SI,DA1              MOV  CX,16              XOR BL,BL       AGAIN: MOV  AL,[SI]              HL AL,1              JC NEXT              INC BL        NEXT:INC SI              LOOP AGAIN              TEST BL,01H              JNE  L1              CLC              JMP DONE           L1: STC         DONE: MOV AH,4CH               INT 21H         CODE ENDS              END START  
1. 用汇编语言编写程序,求1~10的和。 代码如下: ``` .model small .stack 100h .data sum dw 0 .code main proc mov ax, 0 mov cx, 10 mov bx, 1 add_loop: add ax, bx inc bx loop add_loop mov sum, ax mov ah, 09h mov dx, offset msg1 int 21h mov ax, sum call disp_num mov ah, 4ch int 21h disp_num proc ; 将数字转换为字符串并输出 push ax push bx push cx mov bx, 10 mov cx, 0 num_loop: xor dx, dx div bx push dx inc cx test ax, ax jnz num_loop ; 输出字符串 mov ah, 02h pop ax out_loop: pop dx add dl, 30h mov ah, 02h int 21h loop out_loop ; 换行 mov ah, 02h mov dl, 0dh int 21h mov dl, 0ah int 21h ; 恢复寄存器 pop cx pop bx pop ax ret msg1 db '1 + 2 + 3 + ... + 10 = $' end main ``` 2. 用汇编语言编写程序,输入三个数,输出其中最大的一个数。 代码如下: ``` .model small .stack 100h .data a dw ? b dw ? c dw ? max dw ? msg1 db '请输入三个整数,用空格隔开:$' msg2 db '最大的数是:$' .code main proc mov ax, @data mov ds, ax ; 输入三个数 mov ah, 09h mov dx, offset msg1 int 21h mov ah, 0ah lea dx, a int 21h lea dx, b int 21h lea dx, c int 21h ; 比较三个数 mov ax, a cmp ax, b jg a_b mov ax, b a_b: cmp ax, c jg a_c mov ax, c a_c: mov max, ax ; 输出最大的数 mov ah, 09h mov dx, offset msg2 int 21h mov ax, max call disp_num ; 退出程序 mov ah, 4ch int 21h disp_num proc ; 将数字转换为字符串并输出 push ax push bx push cx mov bx, 10 mov cx, 0 num_loop: xor dx, dx div bx push dx inc cx test ax, ax jnz num_loop ; 输出字符串 mov ah, 02h pop ax out_loop: pop dx add dl, 30h mov ah, 02h int 21h loop out_loop ; 换行 mov ah, 02h mov dl, 0dh int 21h mov dl, 0ah int 21h ; 恢复寄存器 pop cx pop bx pop ax ret end main ``` 3. 用汇编语言编写程序,输入一个正整数n,输出1~n之间的所有素数。 代码如下: ``` .model small .stack 100h .data n dw ? msg1 db '请输入一个正整数:$' msg2 db '1 到 ' msg3 db ' 之间的素数有:$' .code main proc mov ax, @data mov ds, ax ; 输入一个正整数 mov ah, 09h mov dx, offset msg1 int 21h mov ah, 01h int 21h sub al, 30h mov n, ax ; 输出1到n之间的素数 mov ah, 09h mov dx, offset msg2 int 21h mov ax, 1 call disp_num mov dx, offset msg3 int 21h mov cx, n mov bx, 2 cmp cx, bx jl end_loop mov ax, 2 prime_loop: mov dx, ax div bx cmp dx, 0 jz not_prime call disp_num mov ah, 02h mov dl, ',' int 21h not_prime: inc ax cmp ax, cx jle prime_loop end_loop: ; 退出程序 mov ah, 4ch int 21h disp_num proc ; 将数字转换为字符串并输出 push ax push bx push cx mov bx, 10 mov cx, 0 num_loop: xor dx, dx div bx push dx inc cx test ax, ax jnz num_loop ; 输出字符串 mov ah, 02h pop ax out_loop: pop dx add dl, 30h mov ah, 02h int 21h loop out_loop ; 恢复寄存器 pop cx pop bx pop ax ret end main ``` 4. 用汇编语言编写程序,输入一个正整数n,计算1~n之间所有奇数的和。 代码如下: ``` .model small .stack 100h .data n dw ? sum dw 0 msg1 db '请输入一个正整数:$' msg2 db '1 到 ' msg3 db ' 之间所有奇数的和为:$' .code main proc mov ax, @data mov ds, ax ; 输入一个正整数 mov ah, 09h mov dx, offset msg1 int 21h mov ah, 01h int 21h sub al, 30h mov n, ax ; 计算1到n之间所有奇数的和 mov ah, 09h mov dx, offset msg2 int 21h mov ax, 1 call disp_num mov dx, offset msg3 int 21h mov ax, 1 mov cx, n sum_loop: add sum, ax add ax, 2 cmp ax, cx jle sum_loop mov ax, sum call disp_num ; 退出程序 mov ah, 4ch int 21h disp_num proc ; 将数字转换为字符串并输出 push ax push bx push cx mov bx, 10 mov cx, 0 num_loop: xor dx, dx div bx push dx inc cx test ax, ax jnz num_loop ; 输出字符串 mov ah, 02h pop ax out_loop: pop dx add dl, 30h mov ah, 02h int 21h loop out_loop ; 换行 mov ah, 02h mov dl, 0dh int 21h mov dl, 0ah int 21h ; 恢复寄存器 pop cx pop bx pop ax ret end main ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值