Tasm如何以二进制形式输出寄存器内容

时间:2015-10-01 14:38:20

标签: assembly tasm

基本上,我的程序要做的是输出每个字符的二进制代码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

2 个答案:

答案 0 :(得分:3)

jl签名不到。因此,10000000b被认为是-128,这是8位上最小的有符号数,因此al永远不会小于此值,因此jl永远不会跳转而你得到1作为输出。要解决此问题,您可以完全放弃cmp并将jl替换为jns。请记住,shl设置标志,MSB是符号位。

另请注意,cxclch组成,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
...