汇编语言输入输出遇到问题,求高手帮忙

g975291783 2013-06-26 11:26:42
代码如下,想要完成10个学生信息的输入输出,请高手帮忙看看问题出在哪里?

data segment
student_id db 10 dup(5,?,5 dup('$')) ;学号4位
student_name db 10 dup(6,?,6 dup('$')) ; 姓名5位字符
student_sex db 10 dup (?)
student_score db 10 dup (2,?,2 dup('$'))
table dw 4 dup(?)
mess1 db "please input student's ID that you want to delete:",0ah,0dh,'$'
data ends
code segment
assume ds:data,cs:code,es:data
start:
mov ax,data
mov ds,ax
mov es,ax

;-------------------------------------------宏定义
pianyi macro num,ad ;opr1是cx,opr2是数组首地址
push cx
mov ax,10 ;循环3次
sub ax,num ;计算每个数组的偏移地址,存入AX
mul al,10 ;每个数组是10个元素
add ad,ax
pop cx
endm
;---------------------------------------------宏定义换行回车
endl macro
push dx
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
pop dx
endm
;-------------------------------------------- ;定义地址表
mov table ,offset student_id
mov table+2,offset student_name
mov table+4,offset student_sex
mov table+6,offset student_score
mov bx,offset table ;地址表首地址放入bx

;--------------------------------------------
call input

call delete

call print

mov ax,4c00h
int 21h

input proc near
mov cx,10

input_again:

mov dx,[bx] ;输入学号
pianyi cx,dx
mov ah,10
int 21h

endl

mov dx,[bx+2] ;输入姓名
pianyi cx,dx
mov ah,10
int 21h

endl

mov di,[bx+4] ;准备输入性别

mov ax,10 ;计算student_sex数组的偏移
sub ax,cx
add di,ax

mov ah,1
int 21h
mov byte ptr [di],al

endl

mov dx,[bx+6] ;输入成绩
pianyi cx,dx
mov ah,10
int 21h

endl

loop input_again ;循环10次

ret
input endp

print proc near
mov cx,10
mov dh,0

print_again:
mov dx,[bx]+2 ;输出学号
pianyi cx,dx
mov ah,9
int 21h

endl

mov dx,[bx+2]+2 ;输出姓名
pianyi cx,dx
mov ah,9
int 21h

endl

mov di,[bx+4] ;输出性别

mov ax,10 ;计算student_sex数组的偏移
sub ax,cx
add di,ax

mov al,byte ptr [di]
mov ah,2
int 21h

endl

mov dx,[bx+6]+2 ;输出成绩
pianyi cx,dx
mov ah,9
int 21h

endl

loop print_again ;循环10次

ret
print endp
;-----------------------------------------
delete proc near
lea dx,mess1
mov ah,9
int 21h
ret
delete endp
;------------------------------------------


code ends
end start
...全文
275 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
zara 2013-06-27
  • 打赏
  • 举报
回复
; 下面是个方法,仅供参考
print_again:
mov dx,[bx] ;输出学号
pianyi cx,dx,7
mov ah,9
call adjdx
int 21h
; ......

adjdx proc near
push bx
add dx, 2 ; 跳过输入缓冲区头2字节信息域
mov bx,dx
mov bl, [bx-1] ; 输入的字符个数
mov bh, 0
add bx, dx ; 指向到最后的回车字符
mov byte ptr [bx], 24h ; 替换为字符串输出所需的 '$' 字符
pop bx
ret
adjdx endp
g975291783 2013-06-26
  • 打赏
  • 举报
回复
那应该怎么样才能正确地跳过字符串开头的两个信息域呢?
zara 2013-06-26
  • 打赏
  • 举报
回复
输出是乱糟糟的吧。首先,你输出时,指向的是输入缓冲区,那里开头有两字节的信息域,并非一开始就是输入的内容,故应跳过这两字节,但这不是 mov dx,[bx??]+2 所能实现的(反而是错乱了这里的 dx!);其次,输入的内容满缓冲区时,原先的 '$' 全被覆盖了,所以会向后到一个最近的这个字符,也会乱的。
g975291783 2013-06-26
  • 打赏
  • 举报
回复
引用 1 楼 zara 的回复:
pianyi 宏定义里的 mul al,10 除非是使用 486 级的 imul 指令,否则只能是 mul reg/mem ,另外默认的因子是 al/ax 。 pianyi 里的计算方法也不对,每个数组是 10 个单元,但每个单元对不同的数组还有不同的长度,所以以现在的数据组织方式,要正确计算偏移来,至少要有 3 个参数,当前数组的起始地址、当前单元号、当前数组每单元字节数。 成绩域应该用至少 3 个字节,只有两个字节有效地存放数据;甚至更合理的需要 4 个字节,3 个字节来存放数据(ascii 字符形式的)。
按照你说的方法我将pianyi 部分改成了这样,但是为什么还是无法输出?? pianyi macro num1,ad,num2 ;num1是cx,ad是数组首地址,num2是每个数组一列的长度,因为num2涉及到mul指令,所以num2必须是寄存器或者存储器 push cx mov ax,10 ;循环10次 sub ax,num1 ;ax=(10-cx) mul num2 ;ax=ax*num2 add ad,ax ;ad=ad+ax pop cx endm 这是输入学号部分: mov dx,[bx] ;输入学号 mov ax,7 ; pianyi cx,dx,7 mov ah,10 int 21h
zara 2013-06-26
  • 打赏
  • 举报
回复
pianyi 宏定义里的 mul al,10 除非是使用 486 级的 imul 指令,否则只能是 mul reg/mem ,另外默认的因子是 al/ax 。
pianyi 里的计算方法也不对,每个数组是 10 个单元,但每个单元对不同的数组还有不同的长度,所以以现在的数据组织方式,要正确计算偏移来,至少要有 3 个参数,当前数组的起始地址、当前单元号、当前数组每单元字节数。
成绩域应该用至少 3 个字节,只有两个字节有效地存放数据;甚至更合理的需要 4 个字节,3 个字节来存放数据(ascii 字符形式的)。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧