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 是符号位。

还要记住 cxclch 组成,而 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
...