Assembly 把其余的人分为几个师
我对汇编和这个论坛都是新手。我试着把剩下的部分分成几个部分,最后把结果打印出来。模拟十进制到二进制的转换 我试着做一个for,在这个for中,我做了div操作,然后做了一个if,从中我用IS_ZERO和IS_ONE标记分隔0和1,得到了每个余数,但没有打印任何内容。我迷路了,不知道我失败了什么 谢谢你的帮助Assembly 把其余的人分为几个师,assembly,x86,Assembly,X86,我对汇编和这个论坛都是新手。我试着把剩下的部分分成几个部分,最后把结果打印出来。模拟十进制到二进制的转换 我试着做一个for,在这个for中,我做了div操作,然后做了一个if,从中我用IS_ZERO和IS_ONE标记分隔0和1,得到了每个余数,但没有打印任何内容。我迷路了,不知道我失败了什么 谢谢你的帮助 mov cx, 26d jmp short @1@86 @1@58: mov ax,cx mov bl, 2 div bl mov cl,al mov dh,ah
mov cx, 26d
jmp short @1@86
@1@58:
mov ax,cx
mov bl, 2
div bl
mov cl,al
mov dh,ah
cmp ah,1
JZ IS_ZERO
jmp IS_ONE
IS_ZERO:
mov dl, 0; dl = dl + ASCII_0; Si dl = 0 -> dl = ASCII_0 ; Si dl = 1 -> dl = ASCII_0 + 1 = ASCII_1
mov ah, 2
int 21h
jmp short @1@86
IS_ONE:
mov dl, 1; dl = dl + ASCII_0; Si dl = 0 -> dl = ASCII_0 ; Si dl = 1 -> dl = ASCII_0 + 1 = ASCII_1
mov ah, 2
int 21h
jmp short @1@86
@1@86:
cmp al,1
jg short @1@58
您正在打印无法打印的二进制字节0和1,而不是ASCII字符。您有一条评论说要添加ASCII“0”,但实际上您从未这样做过。试试
mov-dl,'0'
和mov-dl,'1'
。顺便说一句,div
是一种非常低效的除以2的方法;想一想如何使用shr
重写。我不知道你最初的jmp是怎么写的@1@86
将起作用,因为此时未初始化al
。除非你遗漏了初始化的代码?哦,你的测试是向后的:在cmp
(实际上是减法)之后,如果值相等,则设置零标志。因此,如果除法的剩余部分是1,那么您将跳转到IS_ZERO
,并且您的所有位都将是相反的。通常在cmp
之后使用je
和jne
助记符会更清晰,这有助于您更容易地记住发生了什么。请注意,当此代码运行时,CX中的值实际上是二进制的;汇编程序将ASCII源代码中的十进制数转换为机器代码中的二进制数。因此,您的程序只是使用基数2将二进制整数转换为ASCII数字字符串。由于这些基础是相同的,正如Nate所说,如果dl最初为零,那么使用shr cx
/adc dl,'0'
可以更有效地获得'0'
或'1'
字符代码。