assembly - 为什么 AL 寄存器周围没有括号?
问题描述
根据我的理解, %eax 表示 eax 包含的值, (%eax) 表示转到 eax 保留的地址
seta20.1:
inb $0x64, %al # Wait for not busy
testb $0x2, %al
jnz seta20.1
movb $0xd1,%al # 0xd1 −> port 0x64
outb %al, $0x64
那么,为什么 %al 周围没有括号呢?因为如果我想通过使用寄存器将 val 移动到地址,我应该这样做:
mov %ebx, (%eax)
正确的?
解决方案
inb
基本上是从 IO 空间加载到%al
. 所以类比是mov (%edx), %al
。
%al
是源 ( out
) 或目标 ( in
) 寄存器,而不是指针,所以当然不会有括号%al
。
如果在任何地方都有括号,它将在 IO 空间地址周围,例如(%dx)
. 或0x64()
。
但是inb
/outb
不使用普通寻址模式,它们使用立即%dx
数或 IO 空间地址。因此 AT&T 语法在 outb 目标或 inb 源中为它们使用立即或寄存器语法。IO 空间是特殊的,不能像内存一样被寻址。
奇怪的是, AT&T 反汇编objdump -d
确实使用(%dx)
了非立即形式的端口号,但 GAS 接受%dx
或(%dx)
输入,这对于内联 asm 很方便。
当然,两者都组装成相同的机器代码;使用 DX 的指令只有一种形式,字节操作数大小为:https ://www.felixcloutier.com/x86/in 。
0: ec in (%dx),%al
llvm-objdump -d
用途inb %dx, %al
(%dx)
绝不是有效的内存寻址模式:它是一个 16 位寄存器,而不是 BX、BP、SI 或 DI。
推荐阅读
- sql - 每个特定类型文档的 N1QL 查询计数
- r - 如何解决加载“Tidyverse”和“dplyr”的问题
- java - 使用乘数转换 Java 字符串中的值
- vb.net - 刚刚通过 WiFi 连接的 MS Access 数据库发生 System.AccessViolationException
- javascript - 我怎样才能拥有一个时刻对象但无法访问任何方法?
- c# - Unity3D:下载多个文件并实现回调
- javascript - 使用谷歌应用脚本 HTML 将文件上传到谷歌驱动器
- android - APK 未使用上传证书签名
- oracle - Oracle APEX 交互式报表有子句
- laravel - Laravel Voyager 属于关系形式显示“正在搜索”