【汇编语言】考试必备骗分技巧+猜测考点+基础知识!!

汇编语言骗分技巧+个人猜测考点+基础知识

注:此处的基础知识摘选自之前的文章,并不是很全面,更多的还是要结合重点去看书或者ppt。

首先,更新一下一点!我发现有同学对这些点记不住

  • CMP A B

    • 无符号数条件转移指令

      转移指令转移条件含义
      JA/JNBE(A大/B不大且不等)CF = 0 and ZF = 0A大
      JAE/JNB(A大于等于B/B小于A)CF = 0A大于等于B
      JB/JNAECF = 1B大于A
      JBE/JNACF = 1 or ZF = 1B大于等于A
    • 这里ja就理解为a大,b理解为b大,e表示equals相等。jnbe就是b不大(n)也不相等,即a大。

    • 有符号数条件转移指令

转移指令转移条件含义
JG/JNLE (G代表A,L代表B)SF = OF and ZF = 0A大
JGE/JNL(A大于等于B/B小于A)SF = OFA大于等于B
JL/JNGESF != OF and ZF = 0B大于A
JLE/JNGSF != OF or ZF = 1B大于等于A

同样,g理解为greater than,l理解为less than,e理解为equals

lg就是左侧更大,jnle,右侧不大也不相等即等同lg。

转移条件不用记,只记转移指令。

好了,正式开始本篇内容:

首先总结一下汇编个人觉得的考点:

考法无非两种:读程序、写完整的程序

读程序个人猜想主要的考法

1. 代码段中变量的内容

涉及到段内每个字节的存储

重点需要掌握:org设置偏移地址;dw、dd在段内的存储方式变量在伪指令中的含义【dw偏移地址,dd低位偏移高位段地址】(当然在指令里面的也很重要)[]的作用【如Array[3] 即在Array的偏移地址上加3再访问】;$的含义

例题:

c126eeec97624a0691062aec740d52b9.png

 2. 程序执行中寄存器的内容

这个就和写完整的程序差不多了,需要对各个指令的掌握比较扎实,当然简单很多毕竟不用真正的掌握完整程序的编写。

贴几道例题,画画图分析一下

例一:

已知AX=0078H,BX=0408H

    SHR  BX,1
     AND  BX,0F0FH
     MOV  CX,4
LOP:XCHG   BH,BL
    DIV  BL
    SAL  AX,1
    LOOP  LOP

上述程序段执行后,AX= BX=
① 30和0402H ② 30和 0204H
③ 35和0400H ④ 35和 0400H


答案:2,
注意SAL示意图
XCHG交换指令

例二

VARY1   EQU  BYTE PTR VARY2 
VARY2   DW   0ABCDH
……
 SHL  VARY1,1
 SHR  VARY2,1

上述两条指令执行后,VARY2字存储单元内容是       

思考区

-----------


① 0ABCDH ② 0BCDEH ③ 55CDH ④ 0AB55H

答案:3
注意VARY1等价于VAR2的字节单元,也就是VARY1=CDH,在“SHL VARY1,1”进行的是字节为单元的移位(只对CDH进行操作),“SHR VARY2,1”是对上一步移位后的结果再次进行SHR操作。注意示意图需画对!

例三:

已知AX=0FFFFH,DX=0001H

MOV CX,2
LOP:SHL AX,1
RCL DX,1
LOOP LOP

上述程序段执行后DX= AX=
① DX=0006H AX=0FFFDH ② DX=0006H AX=0FFFCH
③ DX=0007H AX=0FFFDH ④ DX=0007H AX=0FFFCH

-------

思考区

-------

答案:4
 

例四

ARRAY DW 6,9,+ 4 , 10 H , +4,10H,+4,10H,+4
……
MOV AX,ARRAY+4
设变量ARRAY的偏移量是0084H,上述指令执行后AX中的内容是
① 0009H ② 008CH ③ 0090H ④ 0010H

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl81MzkzNzk4Mg==,size_16,color_FFFFFF,t_70

答案:2
$+4就是把当前地址的值加上4赋给该存储单元
该题要注意ARRAY是以字为单位的!不能看到6,,9想当然以为是字节

注:以上例题大多来自# 汇编期末考试复习【选择易错题】_喵小胡的博客-CSDN博客:可以参照上面的题算一算。这里仅总结作为参考。

写完整程序的方法

这一段最多只能针对完全没有学懂汇编,不知道怎么考试的人。这里写一个详细的模板,如果实在考试写不出来,基本框架至少能得分。

data segment
    ;这是注释,考试逻辑清楚的注释或许能加分
    ;定义题目上给的变量和你需要的变量
    ;如
    num1 db ?
data ends
;必须要的堆栈段
stack1 segment stack
   ;初始化堆栈段
    dd 20h dup(0);这一段随意
    ;dw 40h dup(0)都行,我也没看到固定写法
stack1 ends
code segment
    assume cs:code,ds:data,ss:stack1
    start:
 
    ;必须要有开头标记
    ;很重要的一点,作者差点忘记,双操作数中间要加逗号
    ;mov ax,bx要写,int 21h不写

    mov ax,data
    mov ds,ax ;初始化数据段,必须有

    ...
    ;其他需要的操作
    ;如果有要求重复n次的
    ;可以写 mov cx,n
    ;如果要求读入数字的
    ;可以写 mov ah,1
    ;int 21 h    
    ;要求显示的
    ;mov dl xx
    ;mov ah 2
    ;int 21h
    ...
    ;其他处理逻辑,这些就得自己会才行了

    ;调用子程序
    call subseg
    ;程序执行完
    mov ah 4ch
    int 21h;返回dos系统
;如果要求有子程序,可以写 
subseg proc
    push ax
    push bx
    ;如果不知道要保护哪些,push就完了
    ...
    ;反着来就完了
    pop bx
    pop ax    
    ret;必须有
subseg endp;必须有

code ends;写在最后
    end start;这里写开头的标记

在外面标注一下,需要写的代码部分

data segment
   
    num1 db ?
data ends
;必须要的堆栈段
stack1 segment stack

    dd 20h dup(0)   
stack1 ends
code segment
    assume cs:code,ds:data,ss:stack1
    start:

 

    mov ax,data
    mov ds,ax ;
初始化数据段,必须有


    mov ah 4ch
    int 21h;
返回dos系统
 

code ends;写在最后
    end start;这里写开头的标记

这里可以给出几个练手的题目

eec5941c33614d1885665491835d6b28.png

 (中等)7bc3dc783e474192a8ca18eb11a1bd07.png

STACK SEGMENT
DW 64 DUP(?)
STACK ENDS
DATA SEGMENT
BUFF DB 100 DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
XOR CX,CX
MOV CX,32H
MOV DI,OFFSET BUFF
Al:
MOV [DI],55H
MOV [DI+01H],0AAH
INC DI
INC DI
DEC CX
JNE Al
A2:XOR AX,AX
MOV AH,4CH
INT 21H
CODE ENDS
END START

(中等)分别统计下列20个数中大于5、小于零和大于零且小于等于5的数据个数,分别存入字节单元RES1、RES2和RES3中。

BUFF DB -1, 20, 3, 30, -5, 15, 100, -54, 0, 4, 78, 99, -12, 32, 3, 23, -7, 24, 60,-51

DATA SEGMENT
  BUF DB -1,20,3,30,-5,15,100,-54,0,4,78,99,-12,32,3,23,-7,24,60,-51
  RES1 DB ?
  RES2 DB ?
  RES3 DB ?
DATA ENDS
STACK1 SEGMENT PARA STACK
  DW 20H DUP(0)
STACK1 ENDS
CODE SEGMENT
  ASSUME CS:CODE,SS:STACK1,DS:DATA
START:MOV AX,DATA
      MOV DS,AX
      MOV CX,20
      LEA SI,BUF
AGAIN:MOV AL,[SI]
      CMP AL,5
      JLE NEXT1
      INC RES1
      INC SI
      DEC CX
      JNZ AGAIN
NEXT1:CMP AL,0
      JL NEXT2
      INC RES2
      INC SI
      DEC CX
      JNZ AGAIN
NEXT2:INC RES3
      INC SI
      DEC CX
      JNZ AGAIN
      MOV AH,2
      MOV BL,RES3
      ADD BL,30H
      MOV DL,BL
      INT 21H
      MOV AH,2
      MOV BL,RES2
      ADD BL,30H
      MOV DL,BL
      INT 21H
      MOV AL,RES1
      XOR AH,AH
      MOV BL,10     
      MOV DL,AL
      OR  DL,30H     ;转换为ASCII码
      MOV AL,AH
      MOV AH,02H     ;显示十位数
      INT 21H
      MOV DL,AL
      OR  DL,30H
      MOV AH,02H     ;显示个位数
      INT 21H
      MOV AH,4CH
      INT 21H
CODE ENDS
      END START

(简单)计算表达式: Z=(5X+2Y-7)/2

设X、Y的值放在字节变量VARX、VARY中,结果存放在字节单元VARZ。

DATA SEGMENT
	VARX DB 10
	VARY DB 20
	VARZ DB ?
DATA ENDS
SSEG SEGMENT STACK
	DB 100H DUP(0)
SSEG ENDS
CODE SEGMENT
	ASSUME CS:CODE,DS:DATA,SS:SSEG
START:
	MOV AX, DATA
	MOV DS, AX
	XOR AH, AH
	MOV AL, VARX
	MOV BL, AL
	MOV CL, 2
	SAL BL, CL
	ADD AL, BL
	XOR BH, BH
	MOV BL, VARY
	SAL BL, 1
	ADD AL, BL
	SUB AL, 7
	SAR AL, 1
	MOV VARZ, AL
	MOV AH, 4CH
	INT 21H
CODE ENDS
	END START

(复杂)从键盘输入两个2位十进制正数转换成十六进制数后,对这两个数相加,结果以十六进制数形式显示在屏幕上。

     例如:

     输入:12 34

     屏幕上显示:2E

DSEG SEGMENT
	NUM1 DB 0	;第一个十进制数的二进制存储变量
	NUM2 DB 0	;第二个十进制数的二进制存储变量
DSEG ENDS

SSEG SEGMENT PARA STACK
	DB 20H DUP(0)
SSEG	ENDS

CSEG SEGMENT
	ASSUME CS:CSEG, DS:DSEG, SS:SSEG
MAIN	PROC FAR
START:
	MOV AX, DSEG
	MOV DS, AX
	CALL TOBIN	;第一个十进制数输入并转换为二进制,结果存放在DL中
	MOV NUM1, DL

	PUSH AX	;保护AX内容
	MOV AH, 1
	INT 21H	;输入空格过滤掉
	POP AX	;还原AX内容

	CALL TOBIN ;第二个十进制数输入并转换为二进制,结果存放在DL中
	MOV NUM2, DL
	
	MOV BL, NUM1
	ADD BL, NUM2	;两个二进制数相加,结果送BL

	CALL TOHEX	;转化为16进制数输出
	MOV AH, 4CH	;返回DOS系统
	INT 21H
MAIN	ENDP

TOBIN PROC	;结果放入DL寄存器
	PUSH AX	;保护寄存器内容
	PUSH BX

	MOV DL, 0
	MOV AH, 1	;输入十位ASCLL码
	INT 21H
	MOV AH, 0
	SUB AL, 30H	; 转换为数字
	MOV BL, 10	;X10
	MUL BL
	MOV DL, AL

	MOV AH, 1	;输入个位ASCLL码
	INT 21H
	SUB AL, 30H	; 转换为数字
	ADD DL, AL	;求和放入DL
	
	POP BX	;还原寄存器内容
	POP AX
	RET
TOBIN ENDP

TOHEX PROC	;取BL寄存器操作数进行转化,因为两位数相加99+99<255故最多八位二进制数
	PUSH AX
	PUSH CX
	PUSH DX
TENS:
	MOV CL, 4	;存取移位次数
	MOV DL, 0F0H	
	AND DL, BL	;取BL的高四位到DL寄存器高四位
	SHR DL, CL	;DL操作数除以16
	CMP DL, 0AH	;与10比较大小判断是否为字母
	JAE LETTER1	;若是则跳转到字母输出
	ADD DL, 30H	;转化为对应ASCLL码
	MOV AH, 2	;输出显示
	INT 21H
	JMP UNITS	
LETTER1:
	ADD DL, 37H	;若为字母转换为ASCLL码要加37H
	MOV AH, 2	;输出显示
	INT 21H
UNITS:
	XOR DL, DL	;寄存器清零
	MOV DL, 0FH
	AND DL, BL	;取BL第四位到DL寄存器低四位
	CMP DL, 0AH	;与10比较大小判断是否为字母
	JAE LETTER2
	ADD DL, 30H
	MOV AH, 2
	INT 21H
	JMP OVER
LETTER2:
	ADD DL, 37H
	MOV AH, 2
	INT 21H
OVER:
	POP DX
	POP CX
	POP AX
	RET
TOHEX ENDP
	
CSEG ENDS
	END START

总结 

除了最后一个之外,其余的代码能手写出来我觉得就差不多了,毕竟也不是专业学这个的。

实在不会的,就记住我写的模板,至少套点分数上。

如果你能看到这,希望你对汇编的语句能有足够的掌握,不够的话还有时间继续复习,考试一定顺利通过!!

以下是汇编指令的知识点,建议可见我的博客,下面这篇是详细版本。【计算机组成原理】期末复习汇总最全版本!!-电子科技大学2023期末考试_Trae1ounG的博客-CSDN博客

以及我的Github仓库https://github.com/Trae1ounG/jisuanjizuchengyuanli

欢迎star或收藏本文!!!



六大类指令

1.数据传送:

1)通用数据传送:MOV、堆栈操作指令push/pop、

交换指令XCHG:将源地址和,目标地址中的内容进行互换。

要求:操作数中至少有一个是通用寄存器;段寄存器不能为操作数

查表转换指令XLAT:[BX+AL]->AL

(字位扩展指令不要求)

2)输入输出IN、OUT

IN AL/AX port

OUT port AL/AX

根据端口地址码的长度,指令具有两种不同的寻址方式

  • 直接寻址

    • 端口地址为8位,指令中直接给

  • 间接寻址

    • 端口地址为16位,指令中的端口地址必须由DX指定

3)地址传送LEA:取偏移地址指令,将存储器操作数的16位偏移地址送到指定的通用寄存器

LEA Reg16 Mem

、LDS、LES:装入地址指针指令

LDS Reg16 Mem32

作用:把Mem32存储单元开始的四个字节单元的内容送入通用寄存器和段寄存器DS(LDS指令)或ES(LES)

低字单元作为偏移量送通用寄存器,高字单元为段基值送DS或ES

4)标志位操作PUSHF、POPF、LAHF、SAHF

LAHF、SAHF:隐含操作数AH和FLAGS

PUSHF、POPF:隐含操作数FLAGS和堆栈单元

LAHF:将FLAGS的低八位内容装入AH

SAHF:将AH的内容送入到FLAGS的低八位

PUSHF,将FLAGS的内容压栈保存

POPF:将当前栈顶的内容送到FLAGS

2.算术运算类指令:

1)加法运算指令ADD、ADC、INC

  • 普通加法ADD:ADD的执行对全部6个状态标志位都产生影响

  • 带进位位的加法ADC:主要用于多字节加法运算,高16位(高八位)相加时,必须考虑低16位(低8位)产生的进位

    • ADC的执行对全部6个状态标志位都产生影响

  • 加1指令INC:操作数可以是通用寄存器也可以是存储单元

    • 设置PF、AF、OF、ZF、SF,但不影响CF

2)减法运算指令SUB、SBB、DEC、CMP(求补指令NEG不要求)

  • 普通减法SUB:全部影响

  • 带借位的减法SBB:全部

  • 减1指令DEC:不影响CF

  • 求补NEG:全部影响

    • 当操作数位0时,CF置0,其他均1

    • 字节操作数为-128或字操作数为-32768时,结果无变化,OF置1

  • 比较CMP

    • CMP OPRD1,OPRD2 ,对六个标志位全部产生影响,用于比较两个数的大小,可作为条件转移指令的转移条件

  • 简单条件转移指令

    标志位指令转移条件含义
    CFJCCF=1有进位/借位转移
    CFJNCCF=0无进位/借位转移
    ZFJZ/JEZF=1等于0/相等转移
    ZFJNE/JNEZF=0不等于0/不等转移
    OFJOOF=1溢出转移
    OFJNOOF=0非溢出转移
    SFJSSF=1负数转移
    SFJNSSF=0正数转移
    PFJP/JPEPF=1偶数转移
    PFJNP/JPOPF=0奇数转移
  • CMP A B

    • 无符号数条件转移指令

      转移指令转移条件含义
      JA/JNBE(A大/B不大且不等)CF = 0 and ZF = 0A大
      JAE/JNB(A大于等于B/B小于A)CF = 0A大于等于B
      JB/JNAECF = 1B大于A
      JBE/JNACF = 1 or ZF = 1B大于等于A
    • 有符号数条件转移指令

转移指令转移条件含义
JG/JNLE (G代表A,L代表B)SF = OF and ZF = 0A大
JGE/JNL(A大于等于B/B小于A)SF = OFA大于等于B
JL/JNGESF != OF and ZF = 0B大于A
JLE/JNGSF != OF or ZF = 1B大于等于A

3)乘法指令(不要求)

4)除法指令(不要求)

3.逻辑运算和移位指令:AND、OR、NOT、XOR

and:CF = OF = 0

OR : CF = OF = 0

NOT:取反,对符号位无影响

XOR:CF = 0 = OF

Test:两操作数相与但结果不送回目的操作数,只改变状态标志位CF=OF=0

TEST、

SHL、SHR、SAL、SAR、ROL、ROR、RCR、RCL

  • 移位指令

    • 源操作数为移位次数(1或CL)

    • 目的操作数为通用寄存器或存储单元

    • 非循环移位

      • 算术左移:SAL : SAL OPDR ,1 / SAL OPDR CL

      • 逻辑左移:SHL:

        • 若一次移位后操作数的最高位与CF不相同,则OF = 1。OF = 1对SAL表示溢出,对SHL不表示溢出

      • 算术右移:SAR:右移最低位给CF,最高位不变

      • 逻辑右移:SHR:最高位补0

      • 指令SAL和SAR当移位次数为n时,在不产生溢出的情况下,等于×2n和÷2n

    • 循环移位

      • 不带CF循环左移:ROL

        • 首位给末尾和CF

      • 不带CF循环右移:ROR

        • 末位给首位和CF

      • 带CF循环左移:RCL

        • 首位给CF,CF给末尾

      • 带CF循环右移:RCR

        • 末尾给CF,CF给首位

4.串操作指令:MOVS、CMPS、SCAS、LODS、STOS

存储器中地址连续的若干单元的字符或数据称为字符串或数据串

串操作指令就是对串中的每个字符或数据做相同操作的指令。每执行一次操作后能够自动修改指针,再执行下一次操作。

  • 特点

    • 源串默认为数据段,允许段重设,偏移地址用SI寄存器指定即DS:SI

    • 目的串默认为附加段,不允许段重设,ES:DI

    • 串长度值放在CX寄存器中

    • 在对每个字节或字操作后,SI和DI寄存器的内容自动修改,修改方向和标志位DF有关,若DF=0,SIDI按照地址增量方向修改,(对字节操作加1对字操作加2),否则按地址减量方向修改

    • 可以在串操作指令前使用重复前缀,在每次串操作后CX的内容自动减1,直至CX=0,或不满足指定的条件

  • 重复前缀

    • REP:无条件重复前缀,重复执行规定的操作,直至CX = 0

    • REPE / PEPZ : 重复条件:ZF = 1 且 CX !=0

    • REPNE/REPNZ:重复条件:ZX = 0 且 CX != 0

    • 重复前缀操作不影响标志位

    • 先执行串操作指令,串操作指令可能会影响标志位。然后CX - 1,并判断条件

  • 串操作指令时8086指令系统中唯一能直接处理源和目标操作数都在存储单元的指令

  • 串传送指令:MOVS OPRD1 OPRD2

    • MOVSB:一次完成一个字节的传送

    • MOVSW:一次完成一个字的传送

      • 实现的操作:DS:[SI] -> ES :[DI] , SI + n -> SI DI + n -> DI

      • 常与无条件重复前缀联合使用,不影响标志位

  • 串比较指令

    • CMPS OPRD1 OPRD2

      • CMPSB:按字节比较

      • CMPSW:按字比较

    • 常和重复前缀REPZ/REPE或RPENZ/REPNE联合使用,检查两个字符串是否相等

    • 串比较指令影响标志位,CX是否为0不影响标志位

    • 如比较字符串是否相同时使用。注意可能存在需要DEC DI的操作

      • 因为串操作的执行顺序为

        • DS:[SI]-ES:[DI]

        • DI+n->DI,Si+n->SI

        • CX-1->CX

        • 判断CX(和ZX)

      • 所以在重复前缀退出时已经指向了下一个单元

  • 串扫描指令:SCAS:

    • SCASB:按照AL内容对目的串进行扫描

    • SCASW:按照AX内容对目的串进行扫描

    • 不会改变操作数及SI,自动改变DI以及影响标志位

  • 串装入指令:LOAD

    • LOADS:将源串按字节装入AL

    • LOADW:将源串按字装入AX

    • 自动改变SI寄存器的内容,不影响标志位,同时一般不带重复前缀指令

    • LOADSB = MOV AL[SI] INC SI

    • LOADSW = MOV AX [SI] INC SI INC SI

  • 串存储指令:STOS

    • STOSB:将AL装入目的串

    • STOSW:将AX装入目的穿

    • 自动改变DI寄存器的内容,不影响标志位,利用重复前缀REP可对连续存储单元存入相同的值

    • STOSB:MOV ES:[DI] AL INC DI

    • STOSW: MOV ES:[DI] AX INC DI INC DI

5.程序控制指令:

1)转移指令:JMP、条件转移指令

JMP:无条件的使程序转移到指定的目标地址,并从该地址执行新的程序段

段内转移:CS不变,仅改变IP

段间转移:CS和IP都改变

条件转移指令

简单条件转移指令

标志位指令转移条件含义
CFJCCF=1有进位/借位转移
CFJNCCF=0无进位/借位转移
ZFJZ/JEZF=1等于0/相等转移
ZFJNE/JNEZF=0不等于0/不等转移
OFJOOF=1溢出转移
OFJNOOF=0非溢出转移
SFJSSF=1负数转移
SFJNSSF=0正数转移
PFJP/JPEPF=1偶数转移
PFJNP/JPOPF=0奇数转移

2)循环控制指令:LOOP、LOOPZ/LOOPE、LOOPNZ/LOOPNE

循环次数必须先送入CX

循环控制指令不影响状态标志位,标志位主要由之前指令改变

3)过程调用指令:CALL

程序执行过程中,主程序可以根据需要随时调用子程序,子程序执行完后再回到主程序继续

CALL:

  • 保存主程序断点地址(返回地址)

  • 子程序入口地址-> IP (CS IP)

RET:

  • 主程序返回地址->IP

4)中断控制指令:INT

产生软中断

INT n

n ; 中断类型码,中断向量地址 = n * 4

6.处理器控制指令:常用的CLD 、STD、CLI、STI、HLT、CLC、STC

CLC:CF置0

STC:CF置1

CLD:DF置0

STD:DF置1

CLI:IF置0,关中断

STI:IF置1

HLT:CPU暂停

  • 9
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值