【问题标题】:For Loops and Transversing through arrays in x86 Assembly Codex86 汇编代码中的 For 循环和遍历数组
【发布时间】:2015-03-24 21:53:10
【问题描述】:

我正在尝试使用 x86 程序集 (TASM) 创建一个程序,该程序穿过 2 组数组并使用 for 循环在两个数组之间进行基本添加。但是,我从未在汇编中使用过 for 循环或数组,所以我对如何实现它感到很困惑。

假设我有这个 pusodo 代码:

for i := 0 to n-1 do
        s := a[ i] + b[ i]; 
        ...
endfor;

到目前为止,这是我的代码,它分别采用 si and di 中的 array a and bcx 中的 n 大小,我将如何在我的代码中实现上述 pusodo 代码?

m   dw  ?
s   dw  ?


    .code

    extrn   putint: proc

    public  maxp_ip

maxp_ip proc ;(n)

; computes the max-plus inner product between two vectors a and b of length n
; input: CX = n
;        SI = a
;        DI = b  
; output: AX = m

; save regs
    push si
    push di 
    push ax ; assigned to m
    push bx ; assigned to s
    push cx 

; m := -32768   
    mov m, -32768

; for i := 0 to n-1 do

请注意,上面的代码不是我的全部代码,只是我想要实现 for 循环和加法的部分。另外,你能否用示例代码解释一下我将如何做到这一点(我是一个视觉学习者,所以我需要看看如何做到这一点,抱歉)。谢谢。

【问题讨论】:

  • 首先使用ifgoto 重写for 循环。那应该稍后直接映射到组装。如果您是视觉学习者,请绘制流程图。

标签: arrays for-loop assembly x86


【解决方案1】:

接下来是你想要的代码。使用 EMU8086 制作,只需复制、粘贴和运行:

.stack 100h
.data

array1 dw 2,4,6,8,10,12,14,16,18
array2 dw 2,3,5,7,11,13,17,19,23

.code          
;INITILIZE DATA SEGMENT.
  mov  ax,@data
  mov  ds,ax

;SUM ARRAY ELEMENTS.                              
  mov  si, offset array1
  mov  di, offset array2
  mov  cx, 9 ;LENGHT OF ARRAYS.
for:
  mov  ax, [ si ]
  mov  bx, [ di ]
  add  ax, bx ;SUM BOTH ELEMENTS.
  ;HERE WE DO SOMETHING WITH THE SUM, LIKE DISPLAY IT.
  add  si, 2 ;NEXT ELEMENT OF ARRAY 1 (DW = 2 BYTES).
  add  di, 2 ;NEXT ELEMENT OF ARRAY 2 (DW = 2 BYTES).
  loop for ;DECREASE CX. JUMP IF NOT ZERO.

;FINISH THE PROGRAM PROPERLY.
  mov  ax,4c00h
  int  21h           

它遍历数组的每个元素,将每对元素添加到 AX 中。注意 CX 被用作反向计数器(从 9 到 0),但数组元素的访问范围是从 0 到 8。指向数组的指针 SI 和 DI 都增加了 2,因为两个数组都是 DW 类型(两个字节长)。

您可以使用指针来更改访问数组元素的顺序。例如:

mov  di, offset array2 + 8
...
dec  di, 2 ;PREVIOUS ELEMENT OF ARRAY 2 (DW = 2 BYTES).

这样你可以将数组 1 的元素按顺序与数组 2 的元素以相反的顺序相加。

希望对你有帮助。

【讨论】:

  • si 和 di 都已经包含一个数组,所以我还需要为两个数组做 mov si, offset array1 吗?
  • 是的,因为我们有两个不同的数组,SI必须指向array1,DI指向array2。您需要 OFFSET 指向每个数组的第一个元素。
猜你喜欢
  • 2016-02-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
  • 1970-01-01
  • 2014-08-15
相关资源
最近更新 更多