Assembly 将指令数修改为一条

Assembly 将指令数修改为一条,assembly,x86,emu8086,Assembly,X86,Emu8086,目前我的程序使用三行代码 add ax, Records[bx+4] add ax, Records[bx+6] add ax, Records[bx+8] 我想知道我是否可以修改程序,在循环中使用一条指令代替3条指令,因为我将同时更改bx和常量,我无法将其转换为一条指令 我可以将程序修改为在循环中使用单个指令吗 如果您可以接受编写循环,那么您必须接受循环带来的开销。 我对您的句子“使用单个指令”的理解是,您希望在循环中执行单个addax,…指令 下面

目前我的程序使用三行代码

    add    ax, Records[bx+4]
    add    ax, Records[bx+6]
    add    ax, Records[bx+8]
我想知道我是否可以修改程序,在循环中使用一条指令代替3条指令,因为我将同时更改bx和常量,我无法将其转换为一条指令

我可以将程序修改为在循环中使用单个指令吗

如果您可以接受编写循环,那么您必须接受循环带来的开销。
我对您的句子“使用单个指令”的理解是,您希望在循环中执行单个
addax,…
指令

下面是这样一个循环(相同的字节数[12]):


是的,您可以在循环中使用
add bx,2
增量来执行此操作,但是设置循环计数器需要一条指令,循环分支也需要一条指令,因此对于仅3条add指令,最好完全展开(也称为剥离)循环。您是对的,没有针对这一点的单一指令,即使是SSE2、AVX2或AVX-512 SIMD也没有。(现有的水平add SIMD指令只添加对,而且速度很慢。)
lodsw;添加bx,ax
是一个选项,但每次迭代也需要2条指令。在x64上,可以将记录[bx+4]中的uint64乘以0x00010001ull来执行整个序列,前提是可以访问第四个元素。是否编写通用x86汇编代码,或者专门针对8088/8086处理器进行优化?非常不同的事情。
add    ax, Records[bx+4]
add    ax, Records[bx+6]
add    ax, Records[bx+8]
  mov si, 6
More:
  add ax, Records[bx+si+2]  ; First ..[bx+8] then ..[bx+6] then ..[bx+4]
  sub si, 2
  jnz More