对于循环和穿过x86中的数组汇编代码
我正在尝试使用x86程序集(TASM)创建一个程序,该程序横贯两组数组,并使用for循环在两个数组之间进行基本的添加。但是,我从来没有在汇编中使用for循环或数组,所以我很困惑我将如何去实现它。对于循环和穿过x86中的数组汇编代码
所以我们说,我有这个pusodo代码:
for i := 0 to n-1 do
s := a[ i] + b[ i];
...
endfor;
的,这是我到目前为止的代码这需要在si and di
分别array a and b
和大小n
在cx
,我如何实现上述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循环和添加的部分。另外,你能否解释我将如何做到这一点,与示例代码(我是一个视觉学习者,所以我需要看看怎么做,对不起)。谢谢。
接下来是你想要的代码。由具有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).
这种方式可以以与阵列2的相反顺序的元素求和阵列1的元件。
希望它有帮助。
si和di都已经包含一个数组,所以我仍然需要做mov si,为两个数组都偏移array1? – ShadowViper 2015-03-25 03:23:59
是的,因为我们有两个不同的数组,SI必须指向数组1,DI指向数组2。您需要OFFSET指向每个数组的第一个元素。 – 2015-03-25 14:07:46
首先用'if'和'goto'重写'for'循环。这应该直接映射到稍后的程序集。如果你是一个视觉学习者,画一个流程图。 – Jester 2015-03-24 22:00:11