The Long Walk1.4.1

Assembly language 汇编语言整数算数指令

移位和循环移位指令
逻辑移位和算数移位
逻辑移位:以0填充最后移出的位
算数移位:以符号位填充最后移出的数字

SHL指令,进行逻辑左移的操作,以0填充最后移出的位,移出的最高位送入进位标志
SHL 目的操作数, 移动位数 ;CF是进位标志
快速乘法:使用SHL可以进行2的次幂高速乘法操作。任何操作数左移n位就相当于乘以2^n
SHR…无符号的快速除法

SAL和SAR指令
SAL指令等价于SHL指令
有符号的除法…

ROL指令,在向左移动一位之后,把最高位同时复制到进位标志和最低位中
可以交换一个字节的最高四位和第四位
ROR指令

RCL和RCR指令
RCL指令在每位左移一位后,把进位标志复制到最低有效位中,把最高有效位复制到进位标志中
CLC指令清除进位标志

SHLD/SHRD指令
SHLD把目的操作数左移指定位数,左移空出来的位用原操作数的高位来填充,对原操作数没有影响。
.data
wval WORD 9BA6H
.code
mov ax, 0AC36h
shld wval, ax, 4 ;ax == AC36, wval == ba6a

MUL无符号乘法指令 乘数和被乘数大小必须相同,乘积的尺寸是乘数的两倍
MUL r/m8//r/m16//r/m16
被乘数AL,AX,EAX
乘积AX,DX:AX,EDX:EAX

DIV指令格式
DIV r/num
被除数:AX,DX:AX,EDX:EAX
商:AL,AX,EAX
余数:AH,DX,EDX

有符号整数除法
有符号除法指令中的被除数在除法操作前要进行有符号扩展:
CBW(扩展AL符号至AH中,保留数字的符号),CDW(扩展双字),CDQ(EAX扩展至EDX:EAX)
IDIV指令有符号除法

Assembly language 汇编语言字符串和数组

REP 当ECX>0时重复
REPZ, REPE 零标志置位并且ECX>0时重复
REPNZ, REPNE 零标志清零并且ECX>0时重复

方向标志:
CLD ;清除方向标志 使ESI或EDI增加
STD ;设置方向标志

MOVSB, MOVSW, MOVSD指令
从ESI指向的内存位置复制数据到EDI指向的内存位置
MOVSB 移动字节
MOVSW 移动字
MOVSD 移动双字

CMPSB, CMPSW, CMPSD指令
将ESI指向的内存操作数通EDI指向的内存操作数相比较
CMP 目的, 源 ;从目的减掉源
CMPS 源, 目的 ;从源减掉目的
REPE 相等则重复 REPNE 不相等则重复
mov esi, OFFSET source
mov edi, OFFSET target
cld
mov ecx count
repe cmpsd ;相等则重复

SCASB, SCASW, SCASD指令
把AL/AX/EAX中的值同由EDI寻址的目标内存中的…进行比较

STOSB, STOSW, STOSD
把AL/AX/EAX的内容存储在EDI指向的内存单元中

LODSB, LODSW, LODSD
从ESI指向的内存位置向AL/AX/EAX中装入一个值,虽说看上去像是STOS的反向,但一般不会用REP前缀和LODS命令使用,因为装入到累加器中的每个新值都会将旧值覆盖

Str_compare 过程调用格式
INVOKE Str_compare, ADDR string1, ADDR string2
从第一个字节开始向前开始比较两个字符串,

二维数组
基址变址(Base-index)操作数把两个寄存器的值相加,得到一个偏移地址。两个寄存器分别为基址(base)和变址(index),格式如下:
[base + index]

冒泡排序法/二分查找

发布了47 篇原创文章 · 获赞 10 · 访问量 1725

猜你喜欢

转载自blog.csdn.net/Antonio_Salieri/article/details/102297780