c语言sscanf函数的用法是什么
259
2022-09-23
Win-MASM64汇编语言-通用寄存器AX/BX/CX/DX/SI/DI/BP
(1)AX:
①用于数据中转:高级语言反汇编中CPU通常使用ax进行中转数据,比如要往ds寄存器中放数据的话,不可以mov ds,0001H这样写,而是应该先mov ax,0001H,然后再mov ds,ax ②作为MUL指令默认使用:当使用MUL指令两个数相乘的时候,其中一个数必定在AX寄存器中,详见MUL指令
(2)BX: 高级语言反汇编中CPU通常使用bx寄存器来存放偏移地址,注意,使用该寄存器存放偏移地址的时候,则CPU默认取DS寄存器的段地址,而不是SS的段地址 下面将666H这个值放到10000这个物理地址的内存中
mov ax,1000Hmov ds,axmov bx,0Hmov [bx],666H
下面的代码是利用BX寄存器来改变偏移地址,求一个长度为5的int类型数组的总和
int main() { int* pa = (int*)malloc(20); int sum = 1; if (pa != 0) { pa[0] = 1; pa[1] = 2; pa[2] = 3; pa[3] = 4; pa[4] = 5; std::cout << pa << std::endl; _asm { mov eax, 0 mov ebx, pa mov ecx,5 s:add eax, [ebx] mov sum, eax inc ebx inc ebx inc ebx inc ebx loop s } std::cout << sum << std::endl; } }
还有一种常用的,使用BX的,偏移方式,格式是[BX+常量],也可以写成常量[BX],也可以写成[BX].常量,例如下面都是正确且常用的
// 下面写法都表示bx里存的是一个内存地址,将这个地址+200个字节,得到一个新// 的地址,再将新的地址里面的值,赋到ax寄存器中mov ax,[200+bx]mov ax,200[bx]mov ax,[bx].200
(3)CX: 高级语言反汇编中CPU通常使用bx寄存器存放循环语句的循环次数,字符串操作中也常用,C++中类的成员函数的参数就是用ECX存放,如果见到ECX,基本可以认为这是一个函数参数,下面是loop指令自动读取cx中的值作为次数的代码
#include
(4)DX: 数据寄存器
①在乘法中,结果都是存放到AX中的,但是如果发生进位,则高位会存放到DX中,详见MUL指令 ②在整数除法中存放产生的余数 ③在IO中用于存放端口地址
(5)SI: 存放偏移地址,功能与BX相同,SI不能被拆分成两个小寄存器,BX就可以,BX有BL和BH(6)DI: 存放偏移地址,功能与BX相同,DI不能被拆分成两个小寄存器,BX就可以,BX有BL和BH(7)BP: 存放偏移地址,通常用于指向栈底,段寄存器使用SS(注意不是DS),可同SI或DI组合使用,不可以和BX一起使用,例如这种写法是错误的mov ax,[BP+BX]这种就是正确的mov ax,[BP+SI+DI],在高级语言中,EBP寄存器用来引用堆栈中的函数参数和局部变量(本质上还是与栈底有关)
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~