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

我的程序有问题,麻烦大家指导一下!谢谢!

乖乖宝贝儿 发布于 2006-12-22 16:28, 1805 次点击
在内存建立一个表TABLE,其中存放20个字节型无符号数,从键盘输入一个数X(一位数),查找该数X在TABLE中是否存在,若存在,则在RESULT单元存入1,否则存入-1。(代码如下:)
请问在红色字段用什么能使程序正确或者有什么更好的方法!请大家指导!谢谢!
data segment
table db 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
org 20h
result db ?
org 30h
buffer db 3
db ?
data ends
code segment
assume cs:code,ds:data
begin:
mov ax,data
mov ds,ax
mov si,offset table
mov cx,20
mov dx,offset buffer
mov ah,0ah
int 21h
a: mov bl,[si]
xor al,bl
test al,01h
je b
inc si
loop a
mov al,-1
mov result,al
jmp over
b: mov ax,1
mov result,al
over: mov ah,4ch
int 21h
code ends
end begin
20 回复
#2
lefttime2006-12-22 17:17
[QUOTE]
......
xor al,bl
test al,01h
je b
......
[/QUOTE]
判断是否相等我们可以直接用CMP
......
cmp al,[si]
je b
......
#3
乖乖宝贝儿2006-12-22 17:31
谢谢lefttime

终于正确了!!
#4
乖乖宝贝儿2006-12-22 17:47
还有点小问题!!

如果我在键盘输入15为什么找不到这个数呢
#5
乖乖宝贝儿2006-12-22 17:50
而且好象输入1也找不到了!

奇怪
#6
24tian2006-12-22 18:23
你用 mov ah,0ah
int 21h
输入的字符啊,要转换成数字把
#7
lefttime2006-12-22 18:57

不好意思,刚刚没有答全
因为你输入的数没有经过处理,直接以ASCII码形式和你预存的数比较,所以会产生和预期不一样的结果
这里注意了按照你这样的思路,只能处理一位数据,所以输入两位数不符合你题目的要求,何况你已经说明一个数(一位数)

#8
乖乖宝贝儿2006-12-22 19:06
回复楼上的:

是这么要求的呀,一位数,但是输入表的内容是有2位数的,设置成一位不行了呀!

这个我都改了一天了,就是弄不好!

可以麻烦把相应位置的帮我指点一下吗?

[此贴子已经被作者于2006-12-22 19:11:14编辑过]

#9
乖乖宝贝儿2006-12-22 19:10
以下是引用24tian在2006-12-22 18:23:38的发言:
你用 mov ah,0ah
int 21h
输入的字符啊,要转换成数字把

这样的话怎么输入象15的数呀???

#10
乖乖宝贝儿2006-12-22 19:17
怎么把扑捉到的数变成数字的形式!而不是ASCII的形式?

#11
乖乖宝贝儿2006-12-22 19:37

一位的我知道,减去30H就行了,可是2位究竟怎么做呢?????????????????

#12
24tian2006-12-22 19:41

二位就 十位的*10+个位啊

#13
lefttime2006-12-22 19:50
姑且认为输入的是一个字节的数,且默认作10进制
DSEG SEGMENT
TABLE DB 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
X DB ?
RESULT DB 1 ;先假设存在
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,ES:DSEG
MAIN: MOV AX,DSEG
MOV DS,AX
MOV ES,AX
MOV CX,20
LEA DI,TABLE
MOV AH,1
INT 21H
MOV BH,AL
INT 21H
MOV BL,AL
AND BX,0F0FH ;这里对输入的10进制数进行转换
MOV AX,BX
AAD ;非BCD码调整,转换成实际数值
CLD
REPNZ SCASB ;串扫描都知道了吧
JZ FOUND
MOV RESULT,-1 ;找不到的话就给RESULT赋值-1
FOUND: MOV AX,4C00H
INT 21H
CSEG ENDS
END MAIN
#14
24tian2006-12-22 20:09

楼上的大哥:你的这中2位的方法很好,受教了,但更多位的数值呢
如1234:
1
1*10
1*10+2
(1*10+2)*10+3
((1*10+2)*10+3)*10+4
另一种:
4*10
3*10*10
2*10*10*10
1*10*10*10*10
你还有更好的方法吗?

#15
lefttime2006-12-22 20:26
[QUOTE] 如1234:
1
1*10
1*10+2
(1*10+2)*10+3
((1*10+2)*10+3)*10+4
另一种:(这里应该是12340吧)
4*10
3*10*10
2*10*10*10
1*10*10*10*10
[/QUOTE]
上述两种方法不错,尤其是第一种,比较直接就能求得;
当然我是一个追求效率的人,如果换作我的话,我会对位数先进行比较,再进行折半比较(比较原始)出数来吧,因为乘除法对我来说,我会尽量避开
#16
lefttime2006-12-22 20:31
还有个好方法,当然纯属个人认为啦
我觉得你在程序中建个宏,通过移位运算用于乘10运算比较好
例如可以这样:
MUL_10 MACRO NUM ;这里的参数来源于输入的数
MOV AX,NUM
MOV BX,AX
MOV CL,3
SHL BX,CL
DEC CL
SHL AX,CL
ADD AX,BX
ENDM
#17
24tian2006-12-22 20:49
知道了,谢谢了
#18
乖乖宝贝儿2006-12-25 13:37
以下是引用lefttime在2006-12-22 19:50:45的发言:
姑且认为输入的是一个字节的数,且默认作10进制
DSEG SEGMENT
TABLE DB 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
X DB ?
RESULT DB 1 ;先假设存在
DSEG ENDS
CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG,ES:DSEG
MAIN: MOV AX,DSEG
MOV DS,AX
MOV ES,AX
MOV CX,20
LEA DI,TABLE
MOV AH,1
INT 21H
MOV BH,AL
INT 21H
MOV BL,AL
AND BX,0F0FH ;这里对输入的10进制数进行转换
MOV AX,BX
AAD ;非BCD码调整,转换成实际数值
CLD
REPNZ SCASB ;串扫描都知道了吧
JZ FOUND
MOV RESULT,-1 ;找不到的话就给RESULT赋值-1
FOUND: MOV AX,4C00H
INT 21H
CSEG ENDS
END MAIN

谢谢了!!!!多亏了帮忙啊!

#19
乖乖宝贝儿2006-12-25 13:40
看来小妹还是要多多努力学习呀!!!


谢谢你们了!!!!
#20
king2084012006-12-28 10:56

谁能帮我解决一下这几个汇编的题目1.(12分)已知某数据段的定义如下,画出变量在内存中的存储情况
DSEG SEGMENT
X1 DB 0,’1’,-1,31H
X2 DW 10,’ABCD’
X3 DW X2
DSEG ENDS

2.(10分)假如在程序的括号中分别填入指令: LOOP L20
试说明程序执行完后AX,BX,CX,DX四个寄存器的内容分别是什么?
CSEG SEGMENT
ASSUME CS:CSEG
BEGIN: MOV AX,01H
MOV BX,02H
MOV DX,0AH
MOV CX,03H
L20: INC AX
ADD BX,AX
SHR DX,1
( )
MOV AH,4CH
INT 21H
CSEG ENDS
END BEGIN
3.(10分)根据给定功能,填写方框中的指令。

1 X>1

以下程序实现Y= X -1≤X≤1

-1 x<-1
DATA SEGMENT
X DB ?
Y DB ?
DATA ENDS
STACK SEGMENT STACK
DB 100 DUP(0)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA

MOV AL,X


JG NEXT1
CMP AL,-1


MOV Y,AL


NEXT1: MOV Y,1
JMP EXIT
NEXT2: MOV Y,-1
EXIT: MOV AH,4CH
INT 21H
CODE ENDS
END START
4.(10分)用非压缩BCD码,实现23+15的运算。试编写程序。


#21
乖乖宝贝儿2006-12-28 17:12

建议你自己重新发个帖子

在我这个上面发大家看不见

1