x86汇编
● 实模式下32bit处理器,与8086兼容,例如loop 指令结束标志,只判断cx,而不是ecx
● IO端口
实际上是一些寄存器,在IO接口当中。向外设读写数据,要通过读写IO端口来实现。
有些计算机系统中,端口会映射到内存地址空间。
有些计算机系统,端口独立编址,处理器的地址线连接到IO接口
独立编址的端口不能用mov指令访问,要用in/out
in al, dx ;只能用al/ax, dx
in ax, dx
in al, 0xf0; 如果源操作数使用立即数,只能是一个字节
in ax, 0xf0;
out 与in类似
● intel 处理器段地址必须最少16字节对齐
● 8086寻址方式
1. 寄存器寻址,数据在寄存器里:mov ax, bx
2. 立即寻址:mov ax, 0x02; mov bx, label1
3. 内存寻址,确定偏移地址(因为段地址由段寄存器确定),即有效地址EA。物理地址=段寄存器地址左移4位+EA
3.1 直接寻址,用中括号括起
mov ax, [0x7c00]
add word [0xef05], 0x1234
xor byte [es:label1], 0x51
3.2 基址寻址和变址寻址
两者几乎一样,只是基址寻址用基址寄存器bx,bp作为有效地址,变址寻址用变址寄存器si,di作为有效地址
用bp时,默认段寄存器为ss,其他默认为ds
string dw 'abcdefgh'
mov bx, string
mov ax, [bx] ;基址寻址
mov [si], dx ;变址寻址
3.3 基址变址寻址
用基址寄存器和变址寄存器同时确定EA
mov word [bx+si], 0x1234;
add ax, [bx+di]
● 栈的实质是一段内存空间,由ss:sp确定,当使用push,pop指令的时候,处理器自动将sp+2,或-2。实际上,可以用这样的指令来代替push、pop:
sub sp, 2
mov bx, sp
mov [ss:bx], 10
如果用寄存器来提供偏移地址,只能用bx,si,di,bp,其他不行,例如,mov [ax], dl;错误。mov [bx], dl;正确
cbw ;将字节扩展到字,操作数在al中
cwd ;将字扩展到双字,ax->dx:ax
neg al; 求相反数,相当于0-al
jcxz; cx为0时跳转
loop指令依赖于cx的值,每执行一次,cx减一,当cx=0时,跳出循环
movsb,movsw,movsd ;ds:si->es:di
rep指令依赖于cx的值
x86汇编的更多相关文章
- C# inline-asm / 嵌入x86汇编
C#可不可以嵌入汇编 可以 在我眼中C#作为一个介于中上层语言是不可能不可以 置入汇编代码的 为什么会被我认为中上层语言呢 从C#保留指针就可以看出 我知 道有很多人一定不会相信C#可以使用汇编代码 ...
- 为什么X86汇编中的mov指令不支持内存到内存的寻址?
在X86汇编中,MOV [0012H], [0016H]这种指令是不允许的,至少得有一个操作数是寄存器.当然,这种问题在用高级语言的时候看不到,感觉好像基本上都是从内存到内存啊,为毛到了汇编就不行了? ...
- 对X86汇编的理解与入门
本文描述基本的32位X86汇编语言的一个子集,其中涉及汇编语言的最核心部分,包括寄存器结构,数据表示,基本的操作指令(包括数据传送指令.逻辑计算指令.算数运算指令),以及函数的调用规则.个人认为:在理 ...
- 寄存器理解 及 X86汇编入门
本文整理自多材料源,感谢原址分享,请查看末尾Url I, 汇编语言分类: 汇编语言和CPU息息相关,但是不能把汇编语言完全等同于CPU的机器指令.不同架构的CPU指令并不相同,如x86,powerpc ...
- X86汇编概要
来自:https://www.cnblogs.com/jiftle/p/8453106.html 本文翻译自:http://www.cs.virginia.edu/~evans/cs216/guide ...
- x86汇编之十(使用字符串)
x86汇编之十(使用字符串) 转自网络,出处不详 一.传送字符串 Intel提供了完整的字符串传送指令,就像是MOV指令一样. 1.MOVS指令 1)movs指令格式 把字符串从一个位内存位置传送到另 ...
- x86汇编指令脚本虚拟机
简介 这是一个可以直接解释执行从ida pro里面提取出来的x86汇编代码的虚拟机. 非常精简,整体架构上不能跟那些成熟的虚拟机相比,主要目标是够用.能用.轻量就行,如果觉得代码架构设计的不是很好的话 ...
- x64汇编第二讲,复习x86汇编指令格式,学习x64指令格式
目录 x64汇编第二讲,复习x86汇编指令格式,学习x64指令格式 一丶x86指令复习. 1.1什么是x86指令. 1.2 x86与x64下的通用寄存器 1.3 OpCode 1.4 7种寻址方式 二 ...
- x86汇编利用int 16h中断实现伪多线程输入
x86汇编利用int 16h中断实现伪多线程输入 我们都知道,如果想让一个程序,同时又干这个,又干那个,最好的办法就是多线程.这个在高级语言里面已经用烂了. 但是,DOS是只有单线程的.我如果想让程序 ...
- X86汇编——计算斐波那契数列程序(详细注释和流程图说明)
X86汇编实现斐波那契数列 程序说明: 输入斐波那契数列的项数, 然后依次输出斐波那契数列, 输入的项数小于256且为数字, 计算的项数不能超过2^16次方, 输入失败是 不会回显数字 因为存结果是A ...
随机推荐
- wait-for
Use a tool such as wait-for-it, dockerize, or sh-compatible wait-for. These are small wrapper script ...
- 对Rethinking ImageNet Pre-training的理解
Kaiming He的这篇论文提出了一个新问题,在目标检测.实例分割和人体关键点检测等领域,预训练的模型是否真的起了作用?通过实验,得出结论:迭代次数较少时,使用预训练模型效果更好:但是只要迭代次数充 ...
- Hierarchical softmax(分层softmax)简单描述.
最近在做分布式模型实现时,使用到了这个函数. 可以说非常体验非常的好. 速度非常快,效果和softmax差不多. 我们知道softmax在求解的时候,它的时间复杂度和我们的词表总量V一样O(V),是性 ...
- SQL SERVER 批量生成编号
开始: 在testing中,为了模拟orders,有个要求给数据库dba,如何通过后台数据库脚本快速批量生成orders. 分析 站在数据库角度,批量生成orders,也就是批量生成表中的行数据. s ...
- 爬虫对自己服务器 CPU,内存和网速的影响
今天无事写一遍关于爬虫对计算机的影响,主要是给小白同学普及一下爬虫的基础知识. 在我们写爬虫的时候,首先会想到开多线程,如果使用的语言是Python,很不幸,因为Python存在 GIL,在任何时候 ...
- vue 实站技巧总结
多个页面都使用的到方法,放在 vue.prototype上会很方便 刚接触 vue的时候做过一件傻事,因为封装了一个异步请求接口post,放在 post.js文件里面,然后在每个需要使用异步请求的页面 ...
- 设置GRUB密码以防止单用户模式下root密码被恶意更改
在使用LInux系统的时候可能会发生忘记root密码的情况,通常管理员会进入单用户模式下进行重置root密码.那么问题来了,既然管理员可以进入单用户模式,如果恶意用户可以接触的到计算机的话毫无疑问也是 ...
- Open Cygwin at a specific folder
转自:https://stackoverflow.com/questions/9637601/open-cygwin-at-a-specific-folder# When you install Cy ...
- dockerd启动配置_修改IP和systemd管理
docker采用CS架构,dockerd是管理后台进程,默认的配置文件为/etc/docker/daemon.json(--config-file可以指定非默认位置). 一个完整的daemon.jso ...
- 在Linux添加定时任务删除5天前的日志文件
利用shell脚本自动清理,脚本如下 1.删除文件命令: find 对应目录 -mtime +天数 -name "文件名" -exec rm -rf {} \; 实例命令: fin ...