Assembly I';我试着用汇编语言写
我试着写下单元格的值coup将100h到110h的地址设置为负值. (如果该值为负数-它仍为负数)。不要使用比较CMP。所以我尝试用text命令检查MSB符号,但它不起作用,我写了这个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
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上,它将处理无意义的数据。