Tasm如何以二进制形式输出寄存器内容
Tasm how to output register content in binary
基本上,我的程序打算做的是以二进制形式输出输入的每个字符的 ascii 代码。然而,无论我输入什么,我都会得到 1111111,这让我很烦,因为我不知道是什么导致了这个问题
这是代码:
.model small
.stack 200h
.data
buferis db 16 dup("z")
.code
pr1:
mov ax, @data
mov ds, ax
mov dx, offset buferis
mov ah, 0Ah
int 21h
mov bx, 02h
mov cl, buferis+01h
mov ah, 02h
mov dl, 10
int 21h
ciklas:
mov al, [buferis+bx]
mov ch, 7
vidinis_ciklas:
mov dl, '0'
shl al, 1
cmp al, 10000000b
jl toliau
mov dl, '1'
toliau:
int 21h
dec ch
cmp ch, 0
jne vidinis_ciklas
mov dl, ' '
int 21h
inc bx
loop ciklas
mov ah, 4ch
mov al, 00h
int 21h
end pr1
jl
小于号。因此,10000000b
被认为是 -128
,这是 8 位上最小的有符号数,因此 al
永远不会小于它,因此 jl
永远不会跳转,你得到 1
作为输出。要解决此问题,您可以完全删除 cmp
并将 jl
替换为 jns
。请记住,shl
设置标志,MSB 是符号位。
还要记住 cx
由 cl
和 ch
组成,而 loop
使用 cx
作为计数器。因此,您的两个循环可能会相互冲突。
此外,输出函数可能会破坏您在 al
中的值,因此最好使用 push
/pop
.[=28= 保存和恢复它]
PS: 下次如果您需要别人的帮助,请评论您的代码并礼貌使用英语。
移位后,移出的位放在进位中。所以你可以直接做一个条件跳转,比如
...
vidinis_ciklas:
mov dl, '0'
shl al, 1 ; moves the MSB into the carry
jnc toliau ; jump if carry NOT set
mov dl, '1'
toliau:
...
谈到旗帜,
...
dec ch
; cmp ch, 0 ; <-- this comparison is redundant, DEC sets the zero-flag
jne vidinis_ciklas
...
基本上,我的程序打算做的是以二进制形式输出输入的每个字符的 ascii 代码。然而,无论我输入什么,我都会得到 1111111,这让我很烦,因为我不知道是什么导致了这个问题 这是代码:
.model small
.stack 200h
.data
buferis db 16 dup("z")
.code
pr1:
mov ax, @data
mov ds, ax
mov dx, offset buferis
mov ah, 0Ah
int 21h
mov bx, 02h
mov cl, buferis+01h
mov ah, 02h
mov dl, 10
int 21h
ciklas:
mov al, [buferis+bx]
mov ch, 7
vidinis_ciklas:
mov dl, '0'
shl al, 1
cmp al, 10000000b
jl toliau
mov dl, '1'
toliau:
int 21h
dec ch
cmp ch, 0
jne vidinis_ciklas
mov dl, ' '
int 21h
inc bx
loop ciklas
mov ah, 4ch
mov al, 00h
int 21h
end pr1
jl
小于号。因此,10000000b
被认为是 -128
,这是 8 位上最小的有符号数,因此 al
永远不会小于它,因此 jl
永远不会跳转,你得到 1
作为输出。要解决此问题,您可以完全删除 cmp
并将 jl
替换为 jns
。请记住,shl
设置标志,MSB 是符号位。
还要记住 cx
由 cl
和 ch
组成,而 loop
使用 cx
作为计数器。因此,您的两个循环可能会相互冲突。
此外,输出函数可能会破坏您在 al
中的值,因此最好使用 push
/pop
.[=28= 保存和恢复它]
PS: 下次如果您需要别人的帮助,请评论您的代码并礼貌使用英语。
移位后,移出的位放在进位中。所以你可以直接做一个条件跳转,比如
...
vidinis_ciklas:
mov dl, '0'
shl al, 1 ; moves the MSB into the carry
jnc toliau ; jump if carry NOT set
mov dl, '1'
toliau:
...
谈到旗帜,
...
dec ch
; cmp ch, 0 ; <-- this comparison is redundant, DEC sets the zero-flag
jne vidinis_ciklas
...