我有一个在Assembly lang中编写程序的任务,它接受3个参数到堆栈并在数组中搜索n值。
这里是完整的解释任务:
必须编写一个程序,接受三个参数 stack:一个字数组地址,数组中的对象数,以及a 数字(我们将在这里用n表示)。该程序将寻找n in 数组并在ax中返回第一个寄存器的地址 数组中的元素,其值等于n。 Ax记录。如果有价值 不在数组中,返回-1。在数据段中,有两个单词集 必须使用不同的值定义不同的长度。你必须 编写一个主程序,为每个程序运行查找过程 两个配置的数组,具有两个不同的搜索值。搜索 值将出现在数据段的另一个设置中。主要的 procedure打印值所在的地址,或者if 它没有找到。提醒:设置4的单词布局:arr1 dw 300,50, 15,48
我需要有关如何启动代码的帮助?如何将参数发送到堆栈? 预先感谢帮助者
编辑这是我现在的代码:
.STACK 64
.DATA
arr db 9 dup ?
arr1 dw 1,2,3,4,5
arr1size dw 5
newline db 0AH,0DH,'$' ; newline
arr2 dw 4,5,6,7,10,10
arr2size dw 6
resu dw ? ; result var
errmsg db "of - voer flow"
n dw 0
sendToStack proc
push bp
mov bp, sp
sub sp, 24
lea dx, arr1
push dx
pop dx
pop bp
end proc
start:
mov ax, @data
mov ds, ax
call sendToStack
end
建议继续?
答案 0 :(得分:0)
这是我在Linux上为32位x86
架构开发的代码,它在数组中找到一个数字。代码可能会帮助您入门,但不使用 stack
,因此堆栈版本仍然是您的功课。我使用gdb
调试器测试了代码以逐步执行指令并检查寄存器值,据我检查,代码按预期工作。
我们有以下makefile
,所以在linux终端上输入make
并编译和链接asmtut.s
文件中的汇编代码:
asmtut: asmtut.o
ld -o asmtut asmtut.o
asmtut.o: asmtut.s
nasm -f elf -o asmtut.o asmtut.s
clean:
rm *.o asmtut
asmtut.s
内的汇编代码是:
section .data
array dw 18,99,22,72,40,55,110,23 ; array to be searched
length dd 8 ; array length; note array length can be 32-bit
number dw 40 ; number we search for, i.e. wanted number
;number dw 88 ; this number will NOT be found: to check the not_found fork of the program
index dd 0 ; index of found number ; will be -1 if not found; note index is 32-bit
section .text
global _start
_start:
xor edi, edi ; set edi=0x00 ; stores current array element index; use 0-based indexing
xor ax, ax ; set ax=0x00 ; stores current array element
xor ebx, ebx ; ebx is used as an intermediary to store 32-bit index
jmp loop ; start the search loop
loop:
mov ax, [array+edi*2] ; move first array element to ax; note a word is 16bits=2bytes
cmp ax, [number] ; compare array element with wanted number
je found ; if equal, wanted value is found: jump to "found" address
inc edi ; increment element index
cmp edi, [length] ; see if the element was the last element:
je not_found ; if so, the wanted number if not found, jump to "not_found"
jmp loop ; repeat the loop
found:
mov ebx, edi ; wanted number is found: use "ebx" as an intermediary to store index
mov [index], bx ; store index to memory location for index
jmp end
not_found:
mov ebx, -1 ; wanted number is NOT found: use "ebx" as an intermediary to store -1
mov [index], ebx ; move -1 to the memory location for index
jmp end
end:
mov bx, 0 ; move interrupt argument to bx
mov ax, 1 ; move "1" to ax which means "exit" interrupt
int 0x80 ; interrupt: exit