3

我尝试通过单元格值将地址 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

我知道这是漫长而有效的,但这是我目前能做的最好的。

4

2 回答 2

3

AL 是一个 8 位寄存器;您似乎期望它是 32 位。如果您使用 32 位数据,请改用 EAX 寄存器。如果您使用 16 位数据,请使用 AX。如果您碰巧使用 64 位数据,请使用 RAX。

如果你真的在使用 8 位值,那么测试 10h,而不是 10000000h。

并且假设您不使用 8 位值,当您使用 时inc si,您可能需要将其增加 4(对于 32 位值)或 2(对于 16 位值)。

于 2013-09-12T21:25:08.617 回答
1

我想int 21h表示DOS。您需要一个子功能编号ah来做任何好事。你最后一次触摸的是!ah的高字节。codeassume指令没有做到这一点。你走得越远越好mov ax, codemov ds, ax这样你所说的assume就会是真的。

你需要test al, 80h看看它是否是负面的。(您也可以or al, aland al, altest al, al设置标志,并且js isnegative......我猜你想要jns isntnegative

如果al不是负数,则否定它。然后你想把否定的值放回你的数组吗?你不这样做。如果你这样做了,那么你的数组在哪里就变得很重要了100h!如果您将dsDOS 留在 .exe 文件中的位置,它将指向 PSP(程序段前缀),并且偏移量100h可能是您的代码开始的位置。你可能不想在上面乱涂乱画!通过设置dscode,偏移量100h可能会超过这个简单程序的代码。不过,它可能会增长!您可能希望将阵列放在更安全的地方。您可能希望使用已知值对其进行初始化。您可能希望在“证明它有效”之前和之后显示它。好的开始!

于 2013-09-12T23:10:51.447 回答