我正在尝试将使用此代码读取的字符串转换为二进制和六进制。
READ_STRING:
MOV DX, offset buffer
MOV AH, 0Ah
INT 21h
MOV SI, 1d
MOV AX, 0
XOR CX, CX
MOV CL, buffer[SI]
INC SI
LOOP_1:
MOV DX, 10
MUL DX
MOV DL, buffer[SI]
SUB DL, 30h
MOV DH, 0
ADD AX, DX
INC SI
LOOP LOOP_1
RET
到目前为止,我有二进制输出的代码,但它总是打印“1001”(十进制9):
NEXT:
XOR AX, AX
XOR BX, BX
XOR CX, CX
MOV CL, 2
MOV AL, byte ptr[nombre]
MOV DI, offset binaire
; DIV : divide AX by CL. Remainder in AH and result in AL
LOOP:
DIV CL ; remainder in AH, quotient in AL
ADD AH, '0' ; 0 -> '0' , 1 -> '1'
MOV [DI], AH ; Saves the remainder in the array
INC DI
MOV AH, 0 ; reset AH for next division
CMP AL, 0 ; if result is 0, end
JNE LOOP
;Prints the binary number
MOV DX, offset binaire
CALL WRITE_STRING
谢谢!如果您还需要其他任何东西,请询问。
答案 0 :(得分:2)
在担心是否可以将值显示为二进制或十六进制之前;检查以确保您的代码正确地将用户的输入转换为整数(例如,使用调试器)。
对于二进制文件,请考虑以下内容:
mov bx,ax ;bx = the value to display as binary
mov cx,16 ;cx = number of bits to display
mov di,offset binaire ;es:di = address to store string
.nextBit:
xor ax,ax ;al = 0
add bx,bx ;bx = value * 2; carry flag = overflow
adc al,0 ;al = '0' or '1'
stosb ;Add new character to string
loop .nextBit
mov byte [di],0 ;Terminate the string (ASCIIZ?)
mov dx, offset binaire
call WRITE_STRING
对于十六进制,它是相同的基本思想,除了你需要提取最高的4位:
mov bx,ax ;bx = the value to display as binary
mov cx,4 ;cx = number of nibbles to display
mov di,offset binaire ;es:di = address to store string
.nextNibble:
mov ax,bx ;ax = value
shr ax,12 ;ax = highest 4 bits of value
shl bx,4 ;bx = value << 4
add al,'0'
cmp al,'9'
jbe .gotChar
add al,'A' - '9'
.gotChar:
stosb ;Add new character to string
loop .nextBit
mov byte [di],0 ;Terminate the string (ASCIIZ?)
mov dx, offset binaire
call WRITE_STRING
注1:我没有测试过上面的任何代码,我通常使用NASM(不是MASM),所以它可能不会“按原样”组装。
注2:上面的示例代码有意简单。对于性能,您可以使用查找表来做得更好。
注3:这些算法并不复杂,你不需要先用高级语言搞乱(除非你不理解二进制/十六进制转换背后的理论/数学)。另外,在一种语言中看起来优雅的算法在另一种语言中可能是一个丑陋的混乱(例如,您无法在C中以简单/干净的方式检测溢出,因此上面用于二进制转换的方法不会显而易见或优雅在C中;并且在C中优雅的另一种方法在组装中可能会很糟糕。)