我尝试通过单元格值将coup地址100h到110h写入负值。 (如果值为负 - 它仍为负数)。不要使用比较CMP。所以我尝试用文本命令检查MSB标志,它不起作用我写了这个
code segment
assume ds:code,cs:code
start: mov ax,code
mov cx,10
mov si,100h
check:
mov al,[si]
test al,10000000h//here i have problem!
je isntnegative
inc si
dec cx
cmp cx,0
jz finish
jmp check
isntnegative:
neg al
inc si
dec cx
cmp cx,0
jz finish
jmp check
finish:
int 21h
nop
code ends
end start
我知道它很长很有效,但这是我现在能做的最好的事情。
答案 0 :(得分:3)
AL是一个8位寄存器;你似乎期待它是32位。如果您正在使用32位数据,请改用EAX寄存器。如果您使用的是16位数据,请使用AX。如果您正在使用64位数据,请使用RAX。
如果你真的使用8位值,那么测试10h,而不是10000000h。
假设您不使用8位值,当您inc si
时,您可能需要将其递增4(对于32位值)或2(对于16位值)。< / p>
答案 1 :(得分:1)
我想int 21h
表示DOS。您需要ah
中的子功能号才能做任何好处。您上次触摸ah
的时间是code
的高字节! assume
指令并没有这样做。你尽可能地mov ax, code
,你也可以mov ds, ax
所以你所说的assume
实际上是真的。
您需要test al, 80h
才能看出它是否为负数。 (您也可以or al, al
或and al, al
或test al, al
设置标记,js isnegative
...我猜你想要jns isntnegative
)
如果al
不是否定的,则否定它。那么你想把否定的值放回你的数组吗?你不这样做。如果你这样做,那么100h
的阵列就变得很重要!如果您离开ds
DOS将其保留在.exe文件中,它将指向PSP(程序段前缀),偏移100h
可能是您的代码启动的位置。你可能不想涂鸦!通过将ds
设置为code
,偏移量100h
可能会超过此简单程序的代码。但它可能会增长!您可能希望将阵列放在更安全的地方。您可能希望使用已知值初始化它。您可能希望在“证明它有效”之前和之后显示它。好开始!