Assembly 将字符转换为二进制汇编语言

Assembly 将字符转换为二进制汇编语言,assembly,hex,masm,dosbox,Assembly,Hex,Masm,Dosbox,嗨,我正在使用dosbox和masm编译器。我想提示用户输入一个字符,并在下一行以十六进制和二进制打印字符的ASCII码。重复此过程,直到用户键入回车。以下代码可以很好地以十六进制显示字符,直到回车。如何修改此代码以同时显示字符的二进制 .MODEL SMALL .STACK 100H .DATA PROMPT_1 DB 0DH,0AH,'Enter the character : $' PROMPT_2 DB 0DH,0AH,'The ASCII code of

嗨,我正在使用dosbox和masm编译器。我想提示用户输入一个字符,并在下一行以十六进制和二进制打印字符的ASCII码。重复此过程,直到用户键入回车。以下代码可以很好地以十六进制显示字符,直到回车。如何修改此代码以同时显示字符的二进制

 .MODEL SMALL
 .STACK 100H

  .DATA
   PROMPT_1  DB  0DH,0AH,'Enter the character : $'
   PROMPT_2  DB  0DH,0AH,'The ASCII code of the given number in HEX       form     is : $'

 .CODE
  MAIN PROC
 MOV AX, @DATA                ; initialize DS  
 MOV DS, AX

 @START:                      ; jump label 
   LEA DX, PROMPT_1           ; load and display the string PROMPT_1
   MOV AH, 9
   INT 21H

   MOV AH, 1                  ; read a character
   INT 21H

   MOV BL, AL                 ; move AL to BL

   CMP BL, 0DH                ; compare BL with CR
   JE @END                    ; jump to label @END if BL=CR

   LEA DX, PROMPT_2           ; load and display the string PROMPT_2
   MOV AH, 9
   INT 21H

   XOR DX, DX                 ; clear DX
   MOV CX, 4                  ; move 4 to CX

   @LOOP_1:                   ; loop label
     SHL BL, 1                ; shift BL towards left by 1 position
     RCL DL, 1                ; rotate DL towards left by 1 position
                              ; through carry
   LOOP @LOOP_1               ; jump to label @LOOP_1 if CX!=0

   MOV CX, 4                  ; move 4 to CX

   @LOOP_2:                   ; loop label
     SHL BL, 1                ; shift BL towards left by 1 position
     RCL DH, 1                ; rotate DH towards left by 1 position
                              ; through carry
   LOOP @LOOP_2               ; jump to label @LOOP_2 if CX!=0

   MOV BX, DX                 ; move DX to BX
   MOV CX, 2                  ; initialize loop counter

   @LOOP_3:                   ; loop label
     CMP CX, 1                ; compare CX wiht 1
     JE @SECOND_DIGIT         ; jump to label @SECOND_DIGIT if CX=1
     MOV DL, BL               ; move BL to DL
     JMP @NEXT                ; jump to label @NEXT

     @SECOND_DIGIT:           ; jump label
       MOV DL, BH             ; move BH to DL

     @NEXT:                   ; jump label

     MOV AH, 2                ; set output function

     CMP DL, 9                ; compare DL with 9
     JBE @NUMERIC_DIGIT       ; jump to label @NUMERIC_DIGIT if DL<=9
     SUB DL, 9                ; convert it to number i.e. 1,2,3,4,5,6
     OR DL, 40H               ; convert number to letter i.e. A,B...F
     JMP @DISPLAY             ; jump to label @DISPLAY

     @NUMERIC_DIGIT:          ; jump label
       OR DL, 30H             ; convert decimal to ascii code

     @DISPLAY:                ; jump label
       INT 21H                ; print the character
   LOOP @LOOP_3               ; jump to label @LOOP_3 if CX!=0

   JMP @START                 ; jump to label @START

 @END:                        ; jump label

 MOV AH, 4CH                  ; return control to DOS
 INT 21H
 MAIN ENDP
 END MAIN
。型号小
.烟囱100小时
.数据
提示_1db 0DH,0AH,'输入字符:$'
提示_2db 0DH,0AH,“十六进制形式的给定数字的ASCII码为:$”
.代码
主进程
MOV-AX,@DATA;初始化DS
MOV-DS,AX
@开始:;跳转标签
LEA DX,提示_1;加载并显示字符串提示\u 1
莫夫啊,9
INT 21H
MOV-AH,1;读一个字
INT 21H
MOV-BL,AL;将AL移动到BL
CMP-BL,0DH;比较BL和CR
JE@END;如果BL=CR,则跳转到标签@结束
LEA DX,提示_2;加载并显示字符串提示\u 2
莫夫啊,9
INT 21H
异或DX,DX;清除DX
MOV-CX,4;移动4到CX
@环_1:;循环标签
SHL-BL,1;将BL向左移动1个位置
RCL-DL,1;将DL向左旋转1个位置
; 直通运输
循环@LOOP_1;如果是CX,跳转到标签@LOOP_1=0
MOV-CX,4;移动4到CX
@环_2:;循环标签
SHL-BL,1;将BL向左移动1个位置
RCL-DH,1;将DH向左旋转1个位置
; 直通运输
LOOP@LOOP_2;如果是CX,跳转到标签@LOOP_2=0
MOV-BX,DX;将DX移到BX
MOV-CX,2;初始化循环计数器
@环_3:;循环标签
CMP-CX,1;将CX与1进行比较
JE@第二位数字;如果CX=1,跳转到标签@第二位
MOV-DL,BL;将BL移到DL
JMP@NEXT;跳转到标签@NEXT
@第二位数字:;跳转标签
MOV-DL,BH;将BH移动到DL
@下一个:;跳转标签
MOV-AH,2;设置输出函数
CMP-DL,9;将DL与9进行比较

JBE@NUMERIC_digital;跳转到标签@NUMERIC\u DIGIT如果DL当您在寄存器中有值时,它以位(0/1编码为低/高电流电压)存储在CPU中,因此它实际上是以二进制“格式化”的

您只需从最重要的一位开始,每位输出八个字符
'0'
/
'1'

当字符位于
AL
中时,输出二进制形式的代码可能如下所示:

    cx = 8   ; 8 bits to output
bin_loop:
    rcl al,1 ; move most significant bit into CF
    setc bl  ; bl = 0 or 1 by CF (80386 instruction)
    add bl,'0' ; turn that 0/1 into '0'/'1' ASCII char
    call display_bl ; must preserve al and cx
    loop bin_loop
根据您对
循环
使用的
cx
判断,您处于16b实模式。因此,如果您也不能使用80386指令(
setc
)(当以8086/80186/80286CPU为目标时,如
emu8086
仿真器),那么这可以通过其他方式实现(如两条指令,而不是一条)


从你在那些带有
shl/rcl
的循环中使用CF,我相信你会发现一些东西,它非常相似。

当你在寄存器中有值时,它以位(0/1编码为低/高电流电压)存储在CPU中,所以它实际上是以二进制“格式化”的

您只需从最重要的一位开始,每位输出八个字符
'0'
/
'1'

当字符位于
AL
中时,输出二进制形式的代码可能如下所示:

    cx = 8   ; 8 bits to output
bin_loop:
    rcl al,1 ; move most significant bit into CF
    setc bl  ; bl = 0 or 1 by CF (80386 instruction)
    add bl,'0' ; turn that 0/1 into '0'/'1' ASCII char
    call display_bl ; must preserve al and cx
    loop bin_loop
根据您对
循环
使用的
cx
判断,您处于16b实模式。因此,如果您也不能使用80386指令(
setc
)(当以8086/80186/80286CPU为目标时,如
emu8086
仿真器),那么这可以通过其他方式实现(如两条指令,而不是一条)


从你在那些带有
shl/rcl
的循环中使用CF,我相信你会发现一些东西,非常相似。

好的,Sarah,我对你的代码做了更改,现在它显示二进制,我添加了两个变量,所有的更改都由
◄■箭头:

 .MODEL SMALL
 .STACK 100H

  .DATA
   PROMPT_1  DB  0DH,0AH,'Enter the character : $'
   PROMPT_2  DB  0DH,0AH,'The ASCII code of the given number in HEX       form     is : $'
   PROMPT_3  DB  0DH,0AH,'The ASCII code of the given number in BIN       form     is : $'
   MY_CHAR   DB  ?          ; ◄■ char entered by user.
   BINARY    DB  9 DUP('$') ; ◄■ zeroes and ones.

 .CODE
  MAIN PROC
 MOV AX, @DATA                ; initialize DS  
 MOV DS, AX

 @START:                      ; jump label 
   LEA DX, PROMPT_1           ; load and display the string PROMPT_1
   MOV AH, 9
   INT 21H

   MOV AH, 1                  ; read a character
   INT 21H                                      

   MOV MY_CHAR, AL ; ◄■ save char to use in binary conversion.
   MOV BL, AL                 ; move AL to BL

   CMP BL, 0DH                ; compare BL with CR
   JE @END                    ; jump to label @END if BL=CR

   LEA DX, PROMPT_2           ; load and display the string PROMPT_2
   MOV AH, 9
   INT 21H

   XOR DX, DX                 ; clear DX
   MOV CX, 4                  ; move 4 to CX

   @LOOP_1:                   ; loop label
     SHL BL, 1                ; shift BL towards left by 1 position
     RCL DL, 1                ; rotate DL towards left by 1 position
                              ; through carry
   LOOP @LOOP_1               ; jump to label @LOOP_1 if CX!=0

   MOV CX, 4                  ; move 4 to CX

   @LOOP_2:                   ; loop label
     SHL BL, 1                ; shift BL towards left by 1 position
     RCL DH, 1                ; rotate DH towards left by 1 position
                              ; through carry
   LOOP @LOOP_2               ; jump to label @LOOP_2 if CX!=0

   MOV BX, DX                 ; move DX to BX
   MOV CX, 2                  ; initialize loop counter

   @LOOP_3:                   ; loop label
     CMP CX, 1                ; compare CX wiht 1
     JE @SECOND_DIGIT         ; jump to label @SECOND_DIGIT if CX=1
     MOV DL, BL               ; move BL to DL
     JMP @NEXT                ; jump to label @NEXT

     @SECOND_DIGIT:           ; jump label
       MOV DL, BH             ; move BH to DL

     @NEXT:                   ; jump label

     MOV AH, 2                ; set output function

     CMP DL, 9                ; compare DL with 9
     JBE @NUMERIC_DIGIT       ; jump to label @NUMERIC_DIGIT if DL<=9
     SUB DL, 9                ; convert it to number i.e. 1,2,3,4,5,6
     OR DL, 40H               ; convert number to letter i.e. A,B...F
     JMP @DISPLAY             ; jump to label @DISPLAY

     @NUMERIC_DIGIT:          ; jump label
       OR DL, 30H             ; convert decimal to ascii code

     @DISPLAY:                ; jump label
       INT 21H                ; print the character
   LOOP @LOOP_3               ; jump to label @LOOP_3 if CX!=0


;▼ FROM CHAR TO BINARY ▼
     LEA SI, BINARY+7 ; ◄■ point to string in data segment.
     MOV CX, 8        ; ◄■ maximum number of binary digits.
   @BIN_CONVERSION:
     SHR MY_CHAR,1    ; ◄■ get rightmost bit.
     JC  @BIT1
     MOV [BYTE PTR SI], '0'
     JMP @BIN_SKIP
   @BIT1:
     MOV [BYTE PTR SI], '1'
   @BIN_SKIP:
     DEC SI
     LOOP @BIN_CONVERSION

     LEA DX, PROMPT_3 ; ◄■ display message.
     MOV AH, 9
     INT 21H         
     LEA DX, BINARY   ; ◄■ display binary.
     MOV AH, 9
     INT 21H         

   JMP @START                 ; jump to label @START

 @END:                        ; jump label

 MOV AH, 4CH                  ; return control to DOS
 INT 21H
 MAIN ENDP
 END MAIN
。型号小
.烟囱100小时
.数据
提示_1db 0DH,0AH,'输入字符:$'
提示_2db 0DH,0AH,“十六进制形式的给定数字的ASCII码为:$”
提示_3db 0DH,0AH,'BIN格式中给定数字的ASCII码为:$'
我的_CHAR DB;◄■ 用户输入的字符。
二进制DB9DUP(“$”);◄■ 零和一。
.代码
主进程
MOV-AX,@DATA;初始化DS
MOV-DS,AX
@开始:;跳转标签
LEA DX,提示_1;加载并显示字符串提示\u 1
莫夫啊,9
INT 21H
MOV-AH,1;读一个字
INT 21H
MOV MY_CHAR,AL;◄■ 保存用于二进制转换的字符。
MOV-BL,AL;将AL移动到BL
CMP-BL,0DH;比较BL和CR
JE@END;如果BL=CR,则跳转到标签@结束
LEA DX,提示_2;加载并显示字符串提示\u 2
莫夫啊,9
INT 21H
异或DX,DX;清除DX
MOV-CX,4;移动4到CX
@环_1:;循环标签
SHL-BL,1;将BL向左移动1个位置
RCL-DL,1;将DL向左旋转1个位置
; 直通运输
循环@LOOP_1;如果是CX,跳转到标签@LOOP_1=0
MOV-CX,4;移动4到CX
@环_2:;循环标签
SHL-BL,1;将BL向左移动1个位置
RCL-DH,1;R