我对组装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
答案 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=IE和LODSB 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