如何在 Assembly x86 中将这些位分成 8 位块?
Posted
技术标签:
【中文标题】如何在 Assembly x86 中将这些位分成 8 位块?【英文标题】:How to separate these bits into blocks of 8 bits in Assembly x86? 【发布时间】:2012-03-06 22:22:25 【问题描述】:在我的程序中,您会看到如下内容: 000000000000001000000010000000010 但我想要这样的东西(更容易阅读): 00000000 00000100 000001000 00000100
(只是一个例子)
我该怎么做?我相信我需要更改我的 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
【问题讨论】:
为什么人们总是用古装书?一定是只有大写字母的时候;-) 【参考方案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 子例程是否存在,也不知道它使用什么寄存器或破坏。我只是假设它使用 AL 作为输入寄存器并保存所有内容。
【讨论】:
非常感谢!这帮助很大!以上是关于如何在 Assembly x86 中将这些位分成 8 位块?的主要内容,如果未能解决你的问题,请参考以下文章
在 ASP.NET 应用程序的生产环境中将 x86 更改为 x64 dll
VS 的编译选项 build下的 platform target -- Any CPU和x86有什么影响?