基本上,我的程序要做的是输出每个字符的二进制代码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
答案 0 :(得分:3)
jl
签名不到。因此,10000000b
被认为是-128
,这是8位上最小的有符号数,因此al
永远不会小于此值,因此jl
永远不会跳转而你得到1
作为输出。要解决此问题,您可以完全放弃cmp
并将jl
替换为jns
。请记住,shl
设置标志,MSB是符号位。
另请注意,cx
由cl
和ch
组成,loop
使用cx
作为计数器。因此,你的两个循环可能会相互冲突。
此外,输出函数可能会破坏al
中的值,因此最好使用push
/ pop
保存和恢复它。
PS:下次如果您需要其他人的帮助,请评论您的代码并使用英语作为礼貌。
答案 1 :(得分:3)
移位后,移出的位置于进位中。所以你可以直接进行条件跳转,比如
...
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
...