Assembly I';我试着用汇编语言写

Assembly I';我试着用汇编语言写,assembly,Assembly,我试着写下单元格的值​​coup将100h到110h的地址设置为负值​​. (如果该值为负数-它仍为负数)。不要使用比较CMP。所以我尝试用text命令检查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 isntne

我试着写下单元格的值​​coup将100h到110h的地址设置为负值​​. (如果该值为负数-它仍为负数)。不要使用比较CMP。所以我尝试用text命令检查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

我知道它很长很有效,但这是目前我能做的最好的了。

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

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


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

我想
int 21h
表示DOS。您需要在
ah
中输入一个子功能编号才能发挥作用。您最后一次触摸
ah
code
的高位字节!
假定
指令没有这样做。你尽可能的移动ax,code,你也可以移动ds,ax,所以你告诉
的假设实际上是真的

您需要
测试al,80h
以查看它是否为阴性。(您也可以
或al,al
和al,al
测试al,al
来设置标志,
js为负
…我想您应该
jns为负


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

现在还不清楚你想做什么,你在为什么平台写作,你期望得到什么样的结果。请编辑,并提供一些上下文。就像我说的,我尝试将正数转换为负数。您为什么希望在地址100h找到任何合理的内容?你的目标是什么平台?在Windows或Linux上,您的程序很可能会崩溃。在DOS上,它将处理无意义的数据。