注册 登录
编程论坛 汇编论坛

[求助]一道关于实现右移的程序

珊蝴虫 发布于 2007-06-15 01:00, 1711 次点击

这道题的大概思路是:输入一个字符串(由0和1组成),然后根据为0还是为1,通过循环移位将寄存器DX中的各位变成相应的0或1,再将DX右移4位,最后根据DX中各位的情况转换成一个字符串输出。现在程序有错,我实在找不出来,恳请高人相助,谢谢!
data segment
buf db 18
db ?
db 16 dup(?)
crlf db 13,10,'$'
b db 16 dup(?)
db '$'
message db 'input 16 bits binary numbers:$'
data ends
code segment
assume cs:code,ds:data
begin: mov ax,data
mov ds,ax
lea dx,message
mov ah,9
int 21h
mov ah,10
lea dx,buf
int 21h
lea dx,crlf
mov ah,9
int 21h
mov cl,buf+1
lea si,buf+2
next: mov dl,[si]
mov ah,2
int 21h
inc si
dec cl
jne next

lea si,buf+2
mov dx,0
mov cx,16
clc
l1: cmp [si],30h
je next2
stc
next2: rcl dx,1
inc si
dec cx
jne l1

mov cl,4
shr dx,cl

lea si,b
mov cx,16
l2: shl dx,1
jnb next3
mov [si],31h
jmp next4
next3: mov [si],30h
next4: inc si
dec cx
jne l2
mov dl,13
int 21h
mov dl,10
int 21h


lea dx,b
mov ah,9
int 21h
mov ah,4ch
int 21h
code ends
end begin

10 回复
#2
爱以走远2007-06-15 12:33

data segment
buf db 18
db ?
db 16 dup(?)
crlf db 13,10,'$'
b db 16 dup(?)
db '$'
message db 'input 16 bits binary numbers:$'
data ends
code segment
assume cs:code,ds:data
begin: mov ax,data
mov ds,ax
lea dx,message
mov ah,9
int 21h
mov ah,10
lea dx,buf
int 21h
lea dx,crlf
mov ah,9
int 21h
mov cl,buf+1
lea si,buf+2
next: mov dl,[si]
mov ah,2
int 21h
inc si
dec cl
jne next

lea si,buf+2
mov dx,0
mov cx,16
clc
l1: cmp [si],byte ptr 30h
je next2
stc
next2: rcl dx,1
inc si
dec cx
jne l1

mov cl,4
shr dx,cl

lea si,b
mov cx,16
l2: shl dx,1
jnb next3
mov [si],byte ptr 31h
jmp next4
next3: mov [si],byte ptr 30h
next4: inc si
dec cx
jne l2
mov dl,13
int 21h
mov dl,10
int 21h


lea dx,b
mov ah,9
int 21h
mov ah,4ch
int 21h
code ends
end begin

#3
爱以走远2007-06-15 12:35
mov dl,[si]
mov [si],31h
mov [si],30h
这三个要加属性符 byte ptr
#4
珊蝴虫2007-06-15 18:08
谢谢!我去试一试
#5
野比2007-06-15 21:23
以下是引用爱以走远在2007-6-15 12:35:02的发言:
mov dl,[si]
mov [si],31h
mov [si],30h
这三个要加属性符 byte ptr

请教一下, BYTE PTR 应该加在[SI]前,还是31H前?
我觉得应该[SI]前吧? 31H作为操作数存到[SI]的那个字节中.
BYTE PTR 也可以修饰常数吗?

#6
菜鸟上路2007-06-15 22:28

我一般也加在[SI]前

#7
爱以走远2007-06-15 23:18
以下是引用野比在2007-6-15 21:23:27的发言:

请教一下, BYTE PTR 应该加在[SI]前,还是31H前?
我觉得应该[SI]前吧? 31H作为操作数存到[SI]的那个字节中.
BYTE PTR 也可以修饰常数吗?

因为[si]是字节 你要把后面的31H指定为字节形式
在这里就当然要加到31H的前面

#8
野比2007-06-15 23:30
以下是引用爱以走远在2007-6-15 23:18:17的发言:

因为[si]是字节 你要把后面的31H指定为字节形式
在这里就当然要加到31H的前面

那就是PTR可以修饰常数了?
收到

#9
zez26262007-06-16 09:42

我试过了,就按照2楼的说法去做,但不管我输的内容是什么,当然都是16进制数,结果全是 0000111111111111
为什么呀?

#10
菜鸟上路2007-06-16 11:33
输入的也是0和1
#11
爱以走远2007-06-16 12:54

那我就不知道拉 我没看程序
只检查拉一哈错误

1