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 ...
随机推荐
- HashTable代码解析
HashTable继承关系如下: HashTable是一个线程安全的[键-值对]存储结构.其存储结构和HashMap相同,参考这里. 1. HashTable定义了一个类型为Entry<K,V& ...
- github远程建了分支,本地看不到的问题
原因:Git branch -a 查看的是本地仓库的所有分支 远程新建的没有同步前 就是看不到 解决:$git checkout master //首先切到master分支 $git pull ...
- Rabbit五种消息队列学习(一) – 总述
RabbitMQ支持五种消息传递类型,分别如下图所示: 上图中显示6中消息队列分别为: 1.简单队列 一个生产者将消息放到队列中,一个消费者监听队列 2.工作队列(Work queues) 一个生产者 ...
- Mssql Server2005中更改sa的用户名的多种方法
mssql安装上去时默认就是sa用户,大多数用户都会一直使用sa这个用户,这样数据库就存在很大的安全问题了,如果我们能把sa用户名修改,这样安全级别又高了一层哦,下面我们来看修改sa用户名的办法. ...
- 在 Visual Studio 2017 新建的项目中,无法设置项目版本号的通配符规则
错误信息:CS8357 指定的版本字符串中包含与确定性不兼容的通配符.从版本字符串删除通配符,或者禁用此编译的确定性 解决方法:删除项目文件中的配置,或将其设为 False :<Determin ...
- Cocos Lua的Touch 点击事件添加
两种方式: -- 触摸开始 local function onTouchBegan(touch, event) return true end -- 触摸结束 local function onTou ...
- [C++]深入解析结构化异常处理(SEH)
http://www.cppblog.com/weiym/archive/2015/02/27/209884.html 尽管以前写过一篇SEH相关的文章<关于SEH的简单总结>, 但那真的 ...
- hive sql求多个字段的最小值和最大值的办法
1. 准备数据表test2 create table test2( a int, b int, c int, d int, e int); 2. 准备2条数据 ,,,,); ,,,,); 查询显示如下 ...
- 2.静态AOP实现-装饰器模式
通过装饰器模式实现在RegUser()方法本身业务前后加上一些自己的功能,如:BeforeProceed和AfterProceed,即不修改UserProcessor类又能增加新功能 定义1个用户接口 ...
- dubbo+spring_maven 遇到的问题 Error creating bean with name '***': Instantiation of bean failed;
Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error ...