0%

汇编常用脚本

通用启动模版

1
2
3
4
5
6
7
8
9
10
11
12
13
DATA SEGMENT
STR DB 'Hello world', '$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX

MOV AH, 4CH
INT 21H
CODE ENDS
END START

判断一个数的正负

使用指令TEST

TEST功能简介:将两个操作数进行逻辑与运算,并根据运算结果设置相关的标志位。但是,Test命令的两个操作数不会被改变。运算结果在设置过相关标记位后会被丢弃。

作用详细说明

将两个操作数进行按位AND,设结果是TEMP

  1. SF = 将结果的最高位赋给SF标志位,例如结果最高位是1,SF就是1
  2. 看TEMP是不是0,如果TEMP是0,ZF位置1;如果TEMP不是0,ZF位置0

指令书写

1
TEST AL 80H

解释:

根据补码表示,最高位是符号位,如果符号位是1,那么这个数就是负数。所以选择十六进制中8(二进制表示1000H)作为测试数据。如果寄存器中数据第一位不是1,那么SF=0,ZF = 1。反之SF=1,ZF = 0

上面这个例子体现的是TEST可以比较指定位(设置测试数据中指定位为1),但只能测试1位,多位目前没碰到


举例:


求一个数的相反数

所用指令:NEG

指令语句:

1
NEG AX

高精度数的运算

所用指令:ADD,ADC;SUB, SBB

总结

  1. 用DX、AX表示双精度数
  2. 低位用AX,高位用DX
  3. 先用非进位运算低位,再用进位运算高位

举例

题1:高精度加减

1
2
3
4
5
6
7
8
9
10
MOV   AX,X       ;用DX,AX来表示双精度数
MOV DX,X+2 ;低位用AX,高位用DX
ADD AX,Y ;先低位运算
ADC DX,Y+2 ;完成X+Y
ADD AX,24 ;低位运算
ADC DX,0 ;高位运算,该语句不能少
SUB AX,Z ;先低位减法
SBB DX,Z+2 ;完成运算
MOV W,AX ;存储结果
MOV W+2,DX

题2:高精度取反

1
2
3
NEG AX            ; Negate AX if negative
NEG DX ; Negate DX since DX is higher order word
SBB DX, 0 ; Subtract 1 from DX if borrow occurred from AX

注:最后一行很关键,因为取反的本质是用0减,所以存在借位,高精度计算就需要考虑这点


寻址

寻址没有什么特别的脚本,但是有一点需要注意

内存与[内存]没有区别

寄存器与[寄存器]有区别

寄存器表示取的是寄存器的地址值

[寄存器]表示取的是寄存器里面的值

寻找最值