.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
myWord WORD 1000h
.code
main PROC
inc myWord ;inc指令直接可以操作内存元素以及寄存器
invoke ExitProcess,0
main ENDP
END main
11.dec指令
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
myWord WORD 100h
.code
main PROC
dec myWord
invoke ExitProcess,0
main ENDP
END main
12.add
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
var1 DWORD 10000h
var2 DWORD 20000h
.code
main PROC
mov eax,var1
add eax,var2
invoke ExitProcess,0
main ENDP
END main
13.sub
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
var1 DWORD 30000h
var2 DWORD 10000h
.code
main PROC
mov eax,var1 ;EAX=30000
sub eax,var2 ;EAX=20000
invoke ExitProcess,0
main ENDP
END main
14.NEG指令
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
.code
main PROC
mov eax,11111h
NEG eax ;neg指令的本质是求补运算
invoke ExitProcess,0
main ENDP
END main
15.执行算术表达式的例子
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
Rval SDWORD ?
Xval SDWORD 26
Yval SDWORD 30
Zval SDWORD 40.code
main PROC
;first term -Xval
mov eax,Xval ;EAX=26
neg eax ;EAX=-26;second term(Yval-Zval)
mov ebx,Yval
sub ebx,Zval ;EBX=-10;add the terms and store
add eax,ebx ;-36
mov Rval,eax
invoke ExitProcess,0
main ENDP
END main
16.AddSubTest
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
Rval SDWORD ?
XVal SDWORD 26
YVal SDWORD 30
ZVal SDWORD 40.code
main PROC
;INC和DEC
mov ax,1000h
inc ax ;1001h
dec ax ;1000h
;表达式 Rval=-Xval+(Yval-Zval)
mov eax,Xval
neg eax ;-26 neg指令用来将一个数字取反加一 相当于求解这个数的相反数
mov ebx,Yval
sub ebx,Zval ;-10
add eax,ebx
mov Rval,eax ;-36;零标志位实例
mov cx,1
sub cx,1;ZF=1
mov ax,0ffffh
inc ax ;ZF=1;符号标志位实例
mov cx,0
sub cx,1;SF=1
mov ax,0ffh
add ax,2;SF=1;进位标志位实例
mov al,0ffh
add al,1;CF=1,AL=00h
;溢出标志位实例
mov al,+127;AL=11111111
add al,1;OF=1
mov al,-128
sub al,1;OF=1
invoke ExitProcess,0
main ENDP
END main
17.OFFSET运算符
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
bVal BYTE ?
wVal WORD ?
dVal DWORD ?
dVal2 DWORD ?.code
main PROC
;一种可能的内存地址分布情况
mov esi,OFFSET bVal ;esi=0x00654000
mov esi,OFFSET wVal ;esi=0x00654001
mov esi,OFFSET dVal ;esi=0x00654003
mov esi,OFFSET dVal2 ;esi=0x00654007
invoke ExitProcess,0
main ENDP
END main
18.offset在直接-偏移量操作数上的应用
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
myArray DWORD 1,2,3,4,5.code
main PROC
mov esi,myArray+4;esi的值为24指的是字节数
invoke ExitProcess,0
main ENDP
END main
19.使用一个双字变量初始化另外一个双字变量充当指针
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
bigArray DWORD 500DUP(0);生成一个连续的数组 这个数组的大小为500 初始值全部为0
pArray DWORD bigArray ;注意pArray里面保存的实际上是bigArray的内存地址
.code
main PROC
mov esi,pArray ;直接将bigArray的首地址赋值给esi寄存器
invoke ExitProcess,0
main ENDP
END main
20.ALIGN伪指令对其字节边界
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data ;一种可能的地址分布
bVal BYTE ?;0x00AD4000
ALIGN 2;下一个变量的地址为2的倍数
wVal WORD ?;0x00AD4002
bVal2 BYTE ?;0x00AD4004
ALIGN 4;下一个变量的地址为4的倍数
dVal DWORD ?;0x00AD4008
dVal2 DWORD ?;0x00AD400C.code
main PROC
invoke ExitProcess,0
main ENDP
END main
21.PTR运算符
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
myDouble DWORD 12345678h
.code
main PROC
;mov ax,myDouble ;错误操作 instruction operands must be the same size
mov ax,word ptr myDouble ;位数不匹配的时候如果是将大字节赋值给小字节那么小字节被赋予的值是大字节的低位
;ax=5678h
;如果需要获得该变量的其他位置的字那么就需要手动修改ptr所指向的位置
mov ax,word ptr [myDouble+2];ax=1234h
invoke ExitProcess,0
main ENDP
END main
22.将较小的值送入较大的值中
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
wordList WORD 5678h,1234h
.code
main PROC
mov eax,DWORD ptr wordList ;按相对于DWORD的小端方式组合 结果是12345678h
invoke ExitProcess,0
main ENDP
END main
23.TYPE运算符
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
var1 BYTE ?
var2 WORD ?
var3 DWORD ?
var4 QWORD ?.code
main PROC
;TYPE运算符返回变量单个元素的大小 单位是字节
mov eax,TYPE var1
mov eax,TYPE var2
mov eax,TYPE var3
mov eax,TYPE var4
invoke ExitProcess,0
main ENDP
END main
24.LENGTHOF运算符
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
;LENGTHOF运算符计算一个数组里面的数组元素个数
byte1 BYTE 10,20,30,40
array1 WORD 30DUP(?),0,0;定义了一个32个WORD大小的数组
array2 WORD 5DUP(3DUP(?));定义了一个5X3的二维数组
array3 DWORD 1,2,3,4
digitStr BYTE "12345678",0;字符串的长度是8byte 字符串的结尾标志有一个0.code
main PROC
mov eax,LENGTHOF byte1
mov eax,LENGTHOF array1
mov eax,LENGTHOF array2
mov eax,LENGTHOF array3
mov eax,LENGTHOF digitStr
invoke ExitProcess,0
main ENDP
END main
25.LENGTHOF运算符在多行定义的数组中的使用
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
myArray BYTE 10,20,30,40,50,;如果需要换行编写,那么就需要在换行的位置加上,
60,70,80,90,00.code
main PROC
mov eax,LENGTHOF myArray
invoke ExitProcess,0
main ENDP
END main
26.SIZEOF运算符
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
;SIZEOF运算符的大小是LENGTHOF*TYPE
intArray WORD 32DUP(0).code
main PROC
mov eax,SIZEOF intArray ;EAX中的内容是 2*32=64
invoke ExitProcess,0
main ENDP
END main
27.LABEL伪指令
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
val16 LABEL WORD ;LABEL仅仅是说明val16存在于val32之前但是并没有为它分配地址空间
val32 DWORD 12345678h
longValue LABEL DWORD ;LABEL有的时候也可以用来组合内存中的数据
value1 WORD 5678h
value2 WORD 1234h ;这个时候longValue指代的数据就是12345678h
.code
main PROC
mov ax,val16 ;ax=5678h
mov dx,[val16+2];dx=1234h
mov eax,longValue ;EAX=12345678h
invoke ExitProcess,0
main ENDP
END main
28.步进遍历数组
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
arrayB BYTE 10h,20h,30h,40h
arrayW WORD 1000h,2000h,3000h
.code
main PROC
mov esi,OFFSET arrayB
mov al,[esi];AL=10
inc esi ;esi增加一个字节
mov al,[esi];AL=20
inc esi ;esi增加一个字节
mov al,[esi];AL=30
inc esi ;esi增加一个字节
mov al,[esi];AL=40
inc esi ;esi增加一个字节
mov esi,OFFSET arrayW
mov ax,[esi];AL=1000
add esi,2;esi增加两个字节
mov ax,[esi];AL=2000
add esi,2;esi增加两个字节
mov ax,[esi];AL=3000
add esi,2;esi增加两个字节
invoke ExitProcess,0
main ENDP
END main
29.32bit整数相加
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
arrayD DWORD 10000h,20000h,30000h
.code
main PROC
mov esi,OFFSET arrayD
mov eax,[esi];第一个数
add esi,4
add eax,[esi];第二个数
add esi,4
add eax,[esi];第三个数
invoke ExitProcess,0
main ENDP
END main
30 变址操作数
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
arrayB BYTE 10h,20h,30h
arrayW WORD 1000h,2000h,3000h
arrayD DWORD 100h,200h,300h,400h
arrayE DWORD 1,2,3,4.code
main PROC
mov esi,0
mov al,arrayB[esi];AL=10h 这里实际上就相当于C语言中的数组 arrayB表示的就是数组的首地址
mov esi,OFFSET arrayW
mov ax,[esi];AX=1000h
mov ax,[esi+2];AX=2000h WORD一共有两个字节
mov ax,[esi+4];AX=3000h WORD一共有两个字节
;使用十六位寄存器 SI DI BX BP
;略
;变址操作数中的比例因子
mov esi,OFFSET arrayD
add esi,3*TYPE arrayD ;400h的偏移量
mov eax,[esi];注意这里不要写成arrayD[esi]
invoke ExitProcess,0
main ENDP
END main
31.变址操作中的比例因子
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
arrayD DWORD 100h,200h,300h,400h
.code
main PROC
mov esi,3
mov eax,arrayD[esi*4];4是arrayD里面每一个元素所占的字节数
mov esi,3
mov eax,arrayD[esi*TYPE arrayD];eax最终的值是400h
invoke ExitProcess,0
main ENDP
END main
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
three DWORD 11112222h
.code
main PROC
mov ax,word ptr three
mov bx,word ptr [three+2]
mov word ptr [three+2],ax
mov word ptr three,bx
invoke ExitProcess,0
main ENDP
END main
4.9.2 02
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
.code
main PROC
mov al,1
mov bl,2
mov cl,3
mov dl,4
xchg bl,al
xchg al,cl
xchg al,dl
xchg al,cl
xchg bl,dl
invoke ExitProcess,0
main ENDP
END main
4.9.2 04
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
.code
main PROC
mov al,-127
mov bl,-2
add al,bl
invoke ExitProcess,0
main ENDP
END main
4.9.2 05
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
.code
main PROC
mov al,255
sub al,2
add al,3
invoke ExitProcess,0
main ENDP
END main
4.9.2 06
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
.code
main PROC
mov al,0
sub al,1
invoke ExitProcess,0
main ENDP
END main
4.9.2 07
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
val1 DWORD 1
val2 DWORD 2
val3 DWORD 3.code
main PROC
mov eax,7
sub eax,val2
sub eax,val3
add eax,val1
invoke ExitProcess,0
main ENDP
END main
4.9.2 08
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
array DWORD 1,2,3,4
sum DWORD 0.code
main PROC
mov ecx,LENGTHOF array
mov eax,0
mov esi,0
L:
add eax,array[esi*TYPE array]
inc esi
loop L
mov sum,eax
invoke ExitProcess,0
main ENDP
END main
4.9.2 09
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
val2 WORD 1
val4 WORD 2
res WORD 0.code
main PROC
mov bx,3
add bx,val2
sub bx,val4
mov ax,val2
mov res,ax
invoke ExitProcess,0
main ENDP
END main
4.9.2 10
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
.code
main PROC
mov al,127
add al,2
invoke ExitProcess,0
main ENDP
END main
.686p
.model flat,stdcall
.stack 4096
ExitProcess PROTO,dwExitCode:DWORD
.data
words LABEL DWORD
myBytes BYTE 10h,20h,30h,40h
myWords WORD 4000h,3000h,2000h
myString BYTE "ABCDE".code
main PROC
mov eax,words
invoke ExitProcess,0
main ENDP
END main