在Assembly 8086

时间:2017-06-14 17:32:03

标签: arrays assembly x86 x86-16

我有一个在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

建议继续?

1 个答案:

答案 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