- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在尝试弄清楚如何将指针寄存器 SI
指向的内存中的第一个字节添加到 AX
寄存器的当前内容中。
因此,如果 SI
包含某个地址,并且该地址在内存中的值是:00 和 01,我希望将 00 添加到 AX
寄存器.
我的汇编菜鸟自己尝试的第一个指令是 add ax, byte ptr [SI]
但当然,没有骰子,因为我正在尝试添加不同大小的操作数。
我目前的解决方法是
mov dx,0000h ;empty the contents of dx
mov dl,byte ptr [si] ;get the value of the first byte in a register
add ax,dx ;perform the originally desired addition
但这是非常浪费的,并且确实损害了我执行的指令数(这是运行多次的子例程的一部分)。
我仅限于 8086 指令集,所以 this question/answer by Peter Cordes不幸的是,这表明 movzx
压缩我的前两行是不可行的。
最佳答案
正如您所说,如果您可以假设一个 386 兼容的 CPU,一个不错的选择(尤其是对于现代 CPU)是 movzx dx, byte ptr [mem]
/add ax, dx
。如果不是,我想我们可以假装我们正在调整一个真正的 8086,where code size in bytes is often more important than instruction count . (特别是在 8088 上,它的 8 位总线。)所以你肯定想使用 xor dx, dx
来将 DX 归零(2 字节而不是 3 for mov reg, imm16
),如果您无法完全避免归零指令。
将 DX(或 DH)的归零提升到任何循环之外,因此您只需 mov dl, [mem]
/add ax, dx
。如果函数只执行一次,您可能需要(手动)将函数内联在循环调用它的调用站点中,如果它足够小以至于有意义的话。或者选择一个调用者负责将上半部分设为零的寄存器。
正如 Raymond 所说,您可以选择任何其他寄存器,您知道其高半部分在函数的那个点为零。也许你可以 mov cx, 4
而不是 mov cl, 4
如果你之前碰巧需要 CL=4 来做其他事情,但到那时你已经完成了 CX你需要添加到 AX 中。 mov cx, 4
仅长 1 个字节,因此您只需增加 1 个字节的代码大小即可将 CH 清零。 (相对于 xor cx, cx
花费 2 个字节)
另一个选项是字节添加/adc,但这对于代码大小来说并不理想。 (或在更高版本的 CPU 上的性能。)
add al, [mem] ; 2 bytes + extra depending on addr mode
adc ah, 0 ; 3 bytes
所以这比你已经有一个备用的上零寄存器多了 1 个字节:
mov dl, [mem] ; 2 bytes (+ optional displacement)
add ax, dx ; 2 bytes
但从好的方面来说,add/adc 根本不需要任何额外的寄存器。
有了 SI 中的指针,如果您真的要优化代码大小,就值得寻找利用 lodsb
的方法。这会执行 mov al, [si]
/inc si
(如果 DF=1,则改为 dec si
),但不会影响 FLAGS。所以你想添加到不同的寄存器中。
xchg ax, reg
只有 1 个字节,但如果您需要两次交换,如果您实际上必须返回 AX,而不是其他寄存器,它可能无法收回成本。
关于assembly - 从内存中添加一个字节到 AX 寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68263286/
这显然是不寻常的 AX 问题的一周。我在 AX 中有自定义的、与公司无关的表,在第一个 View 中总是显示一个特定的记录。如果您从表单访问它们、直接查看表等,就会发生这种情况。 打开使用故障表之一作
This question already has answers here: How many memory barriers instructions does an x86 CPU have?
Dynamics AX 的新手,如何获取特定 wmslocation 中的所有项目以及 b/w wmslocation 和inventTable 的关系是什么? 最佳答案 执行此操作的最简单方法是为该
from datetime import datetime fig=plt.figure() ax=fig.add_subplot(1,1,1) data=pd.read_csv(r"C:\Users
我正在拼命寻找 Dynamics AX 2009 数据库图表。有人有吗? 谢谢 最佳答案 有关 AX 2009 中的表列表,请参阅 MSDN 文档 Dynamics AX 2009 Tables 要创
我正在寻找一种方法来启用某些表的日志记录更改。 我已经尝试并测试了以编程方式将表添加到数据库日志中,但到目前为止取得了各种成功 - 有时它有效,有时它不起作用(大多数情况下它不起作用) - 似乎只是将
from datetime import datetime fig=plt.figure() ax=fig.add_subplot(1,1,1) data=pd.read_csv(r"C:\Users
我正在学习如何从 osdev 制作引导加载程序。我正在使用 NASM 来组装我的代码,并使用 x86 机器来运行我的引导加载程序。这是一段打印字符并进入无限循环的代码: BITS 16 xor ax,
我正在拼命寻找 Dynamics AX 2009 数据库图表。有人有吗? 谢谢 最佳答案 有关 AX 2009 中的表列表,请参阅 MSDN 文档 Dynamics AX 2009 Tables 要创
“该元素没有原点值。该元素必须有一个非空的原点值。” 我使用Wizard Wizard(微软在这个名字上没有获得任何创意点数..)来创建一个新的Wizard,这个最佳实践错误是在系统生成的表单中。 最
下面两行有什么区别? mov ax, bx mov ax, [bx] 如果bx包含值100h,并且内存地址100h处的值是23,那么第二个是否将23复制到ax? 另外,下面两行有什么区别? mov a
我正在查看程序的反汇编(因为它崩溃了),并注意到很多 xchg ax, ax 我用 google 搜索了一下,发现它本质上是一个 nop,但为什么 Visual Studio 会执行 xchg
任何人都可以向我解释以下行为吗? 当 AX 表中的字段类型设置为枚举时,您可以选择任何枚举值作为该字段的值。 但是,如果您将该字段设置为必填,则无法再通过用户界面选择列表中的第一个枚举值。 显然,这可
有人可以解释一下这三个指令的功能吗? ORG 1000H MOV AX,CS MOV DS,AX 我知道理论上的代码、数据和额外段是什么,但是: 在这个程序中它们是如何实现的? 为什么整个
import matplotlib.pyplot as plt fig, ax = plt.subplots() plt.getp(ax) 为什么ax.patch没有列在plt.getp(ax)的输
我这里有一个小众问题,我找不到任何特定于此的指南。我想知道是否有人知道如何正确处理 matplotlib 包中轴标签的以下文本: ax.set_xlabel(r'$1.005116" per pixe
我正在尝试查找应用程序对象中使用标签的位置。 在标签编辑器中有一个按钮 Used By应该执行此功能。但是,它只会打开一个空对话框。 在此之前是否需要先设置某种索引? 最佳答案 是的,您需要从这里更新
Axapta 中是否有类似于 C# 中著名的 toString() 方法? 我尝试运行底层代码: info(this.dataSource()); 但它给了我这个错误消息:“参数'txt'与所需的类型
我想知道如何使用 C# (.Net Business Connector) 从 AX 调用内核函数。 具体来说,你可以调用像 fieldName2Id、tableName2Id 和 curUserId
在 Matlab 中求解方程最耗时的方法是什么: exp(ax)-ax+c=0 a 和 c 是常量,x 是我要查找的值?目前我正在使用内置的求解器函数,我知道解是单值的,但它花费的时间比我想要的要长。
我是一名优秀的程序员,十分优秀!