- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要从端口读取一些 16 位值并将它们保存到缓冲区。我正在使用的教程建议使用 REP INSW 指令,但我不知道如何使用它,甚至不知道它是如何工作的......
这条指令相当于两条IN指令吗?
最佳答案
答案就在 Intel® 64 and IA-32 Architectures Software Developer’s Manual第一卷:
Section 18.3 I/O ADDRESS SPACE
Any two consecutive 8-bit ports can be treated as a 16-bit port,and any four consecutive ports can be a 32-bit port. In this manner,the processor can transfer 8, 16, or 32 bits to or from a device inthe I/O address space. Like words in memory, 16-bit ports should bealigned to even addresses (0, 2, 4, ...) so that all 16 bits can betransferred in a single bus cycle. Likewise, 32-bit ports should bealigned to addresses that are multiples of four (0, 4, 8, ...). Theprocessor supports data transfers to unaligned ports, but there is aperformance penalty because one or more extra bus cycle must be used.
如果您查看第 2A 卷指令集引用中的 INSW
指令文档,它会这样说:
INS/INSB/INSW/INSD — Input from Port to String
INS m16, DX Input word from I/O port specified in DX into memory location
specified in ES:(E)DI or RDI.
INSW
从 IO 端口空间读取 16 位值到指定的内存地址。 INSW
将从 DX 中指定的指定 PORT 开始读取一个字节,并从 PORT+1 读取一个附加字节,这些字节存储在 ES:E(DI) 和 ES 中:分别为E(DI)+1。
为了回答有关 REP INSW
的问题,REP
将按照 E(CX) 中指定的次数重复此过程。 REP INSW
记录为:
REP/REPE/REPZ/REPNE/REPNZ — Repeat String Operation Prefix
REP INS m16, DX Input (E)CX words from port DX into ES:[(E)DI]
如果您使用REP INSW
从端口 0x1F0 E(CX) 读取 16 位数据,那么您实际上会执行以下操作:
假设您正在编写 32 位代码,然后从端口 0x1F0/0x1F1 读取 16 位 16 次,您可以在 NASM 中将其编码为:
bits 32
; It is assumed that ES is already set and depends on the environment
mov dx, 0x1f0 ; Read words from port 0x1F0 and 0x1F1
mov edi, buffer ; Address of BUFFER
mov ecx, 16 ; Repeat 16 times
rep insw
; Other code and data here
; 16 word buffer (total 32 bytes)
buffer: TIMES 16 dw 0x0000
如果编写 16 位代码,它将类似于:
bits 16
; It is assumed that ES is already set and depends on the environment
mov dx, 0x1f0 ; Read words from port 0x1F0 and 0x1F1
mov di, buffer ; Address of BUFFER
mov cx, 16 ; Repeat 16 times
rep insw
; Other code and data here
; 16 word buffer (total 32 bytes)
buffer: TIMES 16 dw 0x0000
假设您正在运行的环境中,您具有使用端口 IO 指令的权限级别,并且您具有读/写特定 IO 端口的权限。在实模式下没有任何限制。在保护模式、长模式和 v8086 模式下,您可能有也可能没有使用端口指令或访问特定端口的权限的权限级别。您必须查阅操作系统 (OS) 文档,或者如果您正在编写自己的操作系统,则必须使用权限级别/IOPL/IOPL 位图自行设置权限和端口访问限制。
rep insw
还可以使用操作数大小前缀在 64 位模式下使用(NASM 将通过添加 0x66 前缀来处理编码)。计数将以 RCX 为单位,ES 段不适用:
REP INS r/m32, DX Input RCX default size from port DX into [RDI].
关于assembly - REP INSW 做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57944636/
我有一个关于 JavaScript 语法的问题。实际上,我在自学 MEAN 堆栈教程时想出了编码(https://thinkster.io/mean-stack-tutorial#adding-aut
在我的书中它使用了这样的东西: for($ARGV[0]) { Expression && do { print "..."; last; }; ... } for 循环不完整吗?另外,do 的意义何
我已经编写了读取开关状态的代码,如果按 3 次 # 则退出。 void allkeypadTest(void) { static uint8_t modeKeyCount=0; do
因此,对于上周我必须做的作业,我必须使用 4 个 do-while 循环和 if 语句在 Java 中制作一个猜谜游戏。我无法成功完成它,类(class)已经继续,没有为我提供任何帮助。如果有人可以查
int i=1,j=0,n=10,k; do{ j+=i; i<<1; printf("%d\n",i); // printf("%d\n",12<<1); }while
此代码用于基本杂货计算器的按钮。当我按下按钮时,一个输入对话框会显示您输入商品价格的位置。我遇到的问题是我无法弄清楚如何获得 do ... while 循环以使输入对话框在输入后弹出。 我希望它始终恢
当我在循环中修改字符串或另一个变量时,它的条件是否每次都重新计算?或者在循环开始前一次 std::string a("aa"); do { a = "aaaa"; } while(a.size<10)
我刚刚写了这个,但我找不到问题。我使用代码块并编写了这个问题 error: expected 'while' before '{' token === Build finished: 1 errors
do { printf("Enter number (0-6): ", ""); scanf("%d", &Num); }while(Num >= 0 && Num 表示“超过”,<表
我有一个包含 10 个项目的 vector (为简单起见,所有项目都属于同一类,称其为“a”)。我想要做的是检查“A”不是 a) 隐藏墙壁或 b) 隐藏另一个“A”。我有一个碰撞函数可以做到这一点。
嗨,这是我的第二个问题。我有下表 |-----|-------|------|------| |._id.|..INFO.|.DONE.|.LAST.| |..1..|...A...|...N..|.
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicates: Why are there sometimes meaningless do/while and if/e
来自 wikibook在 F# 上有一小部分它说: What does let! do?# let! runs an async object on its own thread, then it i
我在 Real World Haskell 书中遇到了以下函数: namesMatching pat | not (isPattern pat) = do exists do
我有一个类似于下面的用例,我创建了多个图并使用 gridExtra 将它们排列到一些页面布局中,最后使用 ggsave 将其保存为 PDF : p1 % mutate(label2
当我使用具有 for 循环的嵌套 let 语句时,如果没有 (do (html5 ..)),我将无法运行内部 [:tr]。 (defpartial column-settings-layout [&
执行 vagrant up 时出现此错误: anr@anr-Lenovo-G505s ~ $ vagrant up Bringing machine 'default' up with 'virtua
# ################################################# # Subroutine to add data to the table Blas
我想创建一个检查特定日期格式的读取主机。此外,目标是检查用户输入是否正确,如果不正确,则提示应再次弹出。 当我刚接触编程时,发现了这段代码,这似乎很合适。我仍然在努力“直到” do {
我关注这个tutorial在谷歌云机器学习引擎上进行培训。我一步一步地跟着它,但是在将 ml 作业提交到云时我遇到了错误。我运行了这个命令。 sam@sam-VirtualBox:~/models/r
我是一名优秀的程序员,十分优秀!