如何从汇编中的不同内存位置启动数组?

时间:2018-01-10 20:00:44

标签: assembly emu8086

我对组装8086非常新。我需要编写一个程序,它只将地址0-10h中的正数复制到一个从20h开始的存储块,并在dh中保存正数。

我认为最好的方法是制作一个数组并在20h将其复制到第二个数组,但我不知道如何让arr2在20h开始,我也尝试将值设为“大小”每次循环执行时都包含。

到目前为止,这是我的代码:

org 0h


.DATA
arr1 DB 0h,-1h,2h,3h,-4h,5h,6h,-7h,8h,9h,10h
arr2 DB 11 dup(?)
size DB 1h

.CODE
main:
mov ax,@DATA  
mov si,0

copyloop:
 mov al, arr1[si]
 mov arr2[si], al
 inc size
 inc si
 cmp si, 9
 jne copyloop  
 move dh,size    
ret

2 个答案:

答案 0 :(得分:1)

由于您正在复制/移动数组条目,因此您可以在比较后充分利用https://support.office.com/en-ie/article/About-the-shared-workbook-feature-49b833c0-873b-48d8-8bf2-c1c59a628534?ui=en-US&rs=en-IE&ad=IELODSB instruction
JL如果比较变为“零”,则org 0h .DATA ; here the position is 0h arr1 DB 0h,-1h,2h,3h,-4h,5h,6h,-7h,8h,9h,10h org 20h ; set position to 20h ; here we are at position 20h arr2 DB 11 dup(?) size DB 1h .CODE main: mov ax,@DATA mov ds, ax ; set data segment lea si,arr1 ; address of source array (at 0h) lea di,arr2 ; address of destination array (at 20h) copyloop: lodsb ; load number in si and inc si cmp al, 0 ; check if number is positive jl copyloop ; jump next if AL is less than zero stosb ; store positive number in [di] and inc di cmp si, 10 ; check if maximum length of 9 is reached jbe copyloop ; if SI is below or equal to 9, continue loop mov dh, size ; unknown function (!!!) - you didn't address this function ret 会跳跃。

class ContactItem: UIView {
    var icon: RoundedIcon = PhoneRoundedIcon() {
        didSet {
            // get rid of the old icon
            oldValue.removeFromSuperview()
            // add a new one
            addSubview(icon)
            // setup layout (I'm not sure if you use autolayout or set frames, but I don't see any layout setup, which might also be a problem)
        }
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }

    func commonInit() {
        translatesAutoresizingMaskIntoConstraints = false

        addSubview(icon)
    }
    ...
}

答案 1 :(得分:1)

  

但我不知道如何让arr2在20h开始

使第二个数组从地址20h开始的一种方法是填充第一个数组的末尾和第二个数组的开头之间的间隙。
计算如下:

db (TargetAddress - CurrentAddress) dup 0

目标地址当然是20h,当前地址由特殊符号$。

给出
db 20h-$ dup (0)
  

在dh中保存正数。

如果您只对正数感兴趣,那么对于每次循环的迭代,inc size都没有帮助。如果复制到第二个数组的值为正,则只需递增计数器。

另外,为什么要将 size 变量初始化为一个?从零开始更有意义。

  

我需要编写一个程序,只复制地址0-10h中的正数

.DATA
arr1 db 0h, -1h, 2h, 3h, -4h, 5h, 6h, -7h, 8h, 9h, 10h
     db 20h-$ dup (0)
arr2 db 11 dup (?)
size db 0

.CODE
main:
 mov  ax, @DATA
 mov  ds, ax           ;You forgot this instruction!

 xor  bx, bx    
 xor  si, si
copyloop:
 mov  al, arr1[si]
 test al, al
 js   NotInterested    ;Skip negative number
 mov  arr2[bx], al     ;Copy positive number
 inc  bx
 inc  size
NotInterested:
 inc  si
 cmp  si, 11           ;Repeat for the 11 elements in first array
 jb   copyloop  
 mov  dh, size         ;Result to DH

 mov  ax, 4C00h        ;Preferred way to end program on emu8086
 int  21h

如果没有 size 变量,此解决方案很容易 计数已从BX中用于索引第二个数组的值中获得。

.DATA
arr1 db 0h, -1h, 2h, 3h, -4h, 5h, 6h, -7h, 8h, 9h, 10h
     db 20h-$ dup (0)
arr2 db 11 dup (?)

.CODE
main:
 mov  ax, @DATA
 mov  ds, ax           ;You forgot this instruction!

 xor  bx, bx    
 xor  si, si
copyloop:
 mov  al, arr1[si]
 test al, al
 js   NotInterested    ;Skip negative number
 mov  arr2[bx], al     ;Copy positive number
 inc  bx
NotInterested:
 inc  si
 cmp  si, 11           ;Repeat for the 11 elements in first array
 jb   copyloop  
 mov  dh, bl           ;Result to DH

 mov  ax, 4C00h        ;Preferred way to end program on emu8086
 int  21h