Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 把其余的人分为几个师_Assembly_X86 - Fatal编程技术网

Assembly 把其余的人分为几个师

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

我对汇编和这个论坛都是新手。我试着把剩下的部分分成几个部分,最后把结果打印出来。模拟十进制到二进制的转换

我试着做一个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 
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'
字符代码。