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 在汇编x86中,如何将这些位分成8位的块?_Assembly_X86 - Fatal编程技术网

Assembly 在汇编x86中,如何将这些位分成8位的块?

Assembly 在汇编x86中,如何将这些位分成8位的块?,assembly,x86,Assembly,X86,在我的程序中,您将看到如下内容: 00000000000000 10000001000000010 但是我想要这样的东西(更容易阅读): 00000000 00000 100 00000 1000 00000 100 (这只是一个例子) 我该怎么做?我相信我需要在我的PUT_BIN程序中更改一些内容,但我不知道是什么。 这是我的密码: PAGE 80,132 ;==========================================================

在我的程序中,您将看到如下内容:
00000000000000 10000001000000010
但是我想要这样的东西(更容易阅读):
00000000 00000 100 00000 1000 00000 100

(这只是一个例子)

我该怎么做?我相信我需要在我的PUT_BIN程序中更改一些内容,但我不知道是什么。 这是我的密码:

       PAGE    80,132
;===================================================================
;                   PROGRAM LISTING 5.1
;
;PROGRAM TO DEMONSTRATE SUBROUTINE INTERFACE
;
;===================================================================
       .MODEL  SMALL,BASIC,FARSTACK
;===================================================================
                                   ;PROCEDURES TO
       EXTRN   NEWLINE:FAR         ;DISPLAY NEWLINE CHARACTER
       EXTRN   PUTDEC:FAR          ;DISPLAY DECIMAL INTEGER
;===================================================================
; S T A C K   D E F I N I T I O N
;
       .STACK  256

SHL32   MACRO   REG1, REG2
    SHL     REG2, 1
    RCL     REG1, 1
    ENDM

SHR32   MACRO   REG1, REG2
    SHR     REG1, 1
    RCR     REG2, 1
    ENDM
;===================================================================
; C O D E   S E G M E N T   D E F I N I T I O N
;
       .CODE
;
 EX_5_1:
       MOV     BL,1               
       MOV     DI,0001H            
       MOV     SI,0010H
       MOV     DL,1 

       MOV      AX, DI
       CALL     PUT_BIN         
       MOV      AX, SI
       CALL     PUT_BIN         
       CALL     NEWLINE      


       SHL32   DI,SI

        MOV     AX, DI
       CALL     PUT_BIN         
       MOV      AX, SI
       CALL     PUT_BIN         
       CALL     NEWLINE                

                                   ;
                                   ;

        SHR32    DI,SI ;

       MOV      AX, DI
       CALL     PUT_BIN         
       MOV      AX, SI
       CALL     PUT_BIN         
       CALL     NEWLINE         

       CALL    NEWLINE             ;SKIP TO NEXT LINE ON DISPLAY
       .EXIT                       ;RETURN TO DOS
;
       PAGE
;===================================================================
; PROCEDURE TO DISPLAY AN 8- OR 16-BIT VALUE IN BINARY FORM
;
; INPUT:  AL-REG  8-BIT  VALUE TO BE DISPLAYED
;         BL=0    CODE FOR  8-BIT DISPLAY
;               OR
;         AX-REG  16-BIT VALUE TO BE DISPLAYED
;         BL<>0   CODE FOR 16-BIT DISPLAY
;
; OUTPUT: INPUT VALUE DISPLAYED IN BINARY FORM ON THE
;         SCREEN BEGINNING AT CURRENT CURSOR POSITION
;===================================================================
PUT_BIN    PROC    NEAR             ;PROCEDURE PUTBIN(NUMBER,CODE)
       PUSH    AX                  ;SAVE REGISTERS
       PUSH    DX
       PUSH    DI
       PUSH    BX
       PUSH    CX
       PUSHF                       ;SAVE FLAGS
       CMP     BL,0                ;IF   CODE = BYTE (BL=0)
       JNZ     _ELSE
       MOV     AH,0                ;THEN EXPAND NUMBER TO 16 BITS
       MOV     CX,8                ;     BIT_COUNT = 8
       JMP     _ENDIF
_ELSE:                                 ;ELSE
       MOV     CX,16               ;     BIT_COUNT = 16
_ENDIF:                                ;ENDIF
       MOV     BX,2
       MOV     DI,CX               ;SAVE BIT_COUNT
LOOPTOP:                               ;REPEAT
       MOV     DX,0                ;   BIT = NUMBER mod 2
       DIV     BX                  ;   NUMBER = NUMBER / 2
       PUSH    DX                  ;   PUSH BIT
       LOOP    LOOPTOP             ;   DECREMENT BIT_COUNT
                                   ;UNTIL BIT_COUNT = 0
       MOV     CX,DI               ;RESTORE BIT_COUNT
       MOV     BH,0                ;<DISPLAY CODE>
_REPEAT:                               ;REPEAT
       POP     AX                  ;   POP BIT
       CALL    PUTDEC              ;   DISPLAY BIT
       LOOP    _REPEAT             ;   DECREMENT BIT_COUNT
                                   ;UNTIL BIT_COUNT = 0
       POPF                        ;RESTORE FLAGS
       POP     CX                  ;RESTORE REGISTERS
       POP     BX
       POP     DI
       POP     DX
       POP     AX
       RET                         ;RETURN
PUT_BIN    ENDP                     ;END PUTBIN
       END     EX_5_1
第80132页
;===================================================================
;                   程序清单5.1
;
;演示子程序接口的程序
;
;===================================================================
.型号小型、基本、FARSTACK
;===================================================================
;程序
外向新线:远;显示换行符
EXTRN PUTDEC:FAR;显示十进制整数
;===================================================================
; 这是我的名字
;
.堆栈256
SHL32宏REG1,REG2
SHL REG2,1
RCL REG1,1
ENDM
SHR32宏REG1,REG2
SHR REG1,1
RCR REG2,1
ENDM
;===================================================================
; C O D E G M E N T D F I I T N
;
.代码
;
EX_5_1:
MOV BL,1
莫夫迪,0001H
MOV SI,0010H
MOV DL,1
MOV AX,DI
打电话给PUT_BIN
MOV AX,SI
打电话给PUT_BIN
呼叫新线
SHL32-DI,SI
MOV AX,DI
打电话给PUT_BIN
MOV AX,SI
打电话给PUT_BIN
呼叫新线
;
;
SHR32-DI,SI;
MOV AX,DI
打电话给PUT_BIN
MOV AX,SI
打电话给PUT_BIN
呼叫新线
呼叫新线;跳到显示的下一行
出口返回待办事项
;
页
;===================================================================
; 以二进制形式显示8位或16位值的过程
;
; 输入:要显示的AL-REG 8位值
;         BL=8位显示的0代码
;               或
;         要显示的AX-REG 16位值
;         16位显示器的BL0代码
;
; 输出:以二进制形式显示在屏幕上的输入值
;         从当前光标位置开始的屏幕
;===================================================================
把_BIN PROC放在附近;程序PUTBIN(编号、代码)
推斧;保存寄存器
推送DX
推迪
推BX
推送CX
PUSHF;保存标志
CMP-BL,0;如果代码=字节(BL=0)
其他
MOV-AH,0;然后将数字扩展到16位
MOV-CX,8;比特计数=8
JMP_ENDIF
_其他:;其他的
MOV-CX,16;比特计数=16
_ENDIF:;恩迪夫
MOV BX,2
MOV-DI,CX;保存位计数
环顶:;重复
MOV-DX,0;位=数字模2
分区BX;数字=数字/2
推送DX;推钻头
环路陀螺;递减位计数
;直到位_计数=0
MOV-CX,DI;恢复位u计数
MOV-BH,0;
_重复:;重复
爆裂斧;弹跳钻头
调用PUTDEC;显示位
循环重复;递减位计数
;直到位_计数=0
POPF;恢复标志
流行性感冒;还原寄存器
波普BX
波普迪
波普DX
爆斧
RET;返回
把_BIN ENDP;终点站
完EX_5_1
之后

    ...
_REPEAT:
插入类似于

    test    cx, 7       ;test if loop counter can be divided by eight
    jnz     nospace
    mov     al, 32      ;a space
    call    PUTCHAR
nospace:
在那之后,旧的程序继续进行

    POP     AX
    ...

我不知道PUTCHAR子例程是否存在,也不知道它使用了什么寄存器或clobbres。我只是假设它使用AL作为输入寄存器并保存所有内容。

为什么人们总是使用古老的汇编书籍?一定是只有大写字母的时候;-)非常感谢你!这帮了大忙!