我试着写集会

时间:2013-09-12 21:16:33

标签: assembly

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

我知道它很长很有效,但这是我现在能做的最好的事情。

2 个答案:

答案 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, aland al, altest al, al设置标记,js isnegative ...我猜你想要jns isntnegative

如果al不是否定的,则否定它。那么你想把否定的值放回你的数组吗?你不这样做。如果你这样做,那么100h的阵列就变得很重要!如果您离开ds DOS将其保留在.exe文件中,它将指向PSP(程序段前缀),偏移100h可能是您的代码启动的位置。你可能不想涂鸦!通过将ds设置为code,偏移量100h可能会超过此简单程序的代码。但它可能会增长!您可能希望将阵列放在更安全的地方。您可能希望使用已知值初始化它。您可能希望在“证明它有效”之前和之后显示它。好开始!