-1

嘿,我是汇编初学者,我不会打开文件并从中读取值“整数”并将整数保存在缓冲区中以在屏幕上打印这是我的代码,它不起作用

include inout.asm
.model small,c
.486
.stack
.data
org 100h ; .com memory layout 
buf db ?
file db "c:\rtasm\bin\file.txt";the file name in bin
.code

mov dx, offset file ; address of file to dx 
mov al,0 ; open file (read-only) 
mov ah,3dh 
int 21h ; call the interupt 
mov bx,ax ; put handler to file in bx 


mov ah,40h
mov bx,ax
mov cx,2h                 ;; how many bytes you want to read
mov dx,offset buf  ;; where you want to store that data (see note on Offset above)
int 21h

call putchar,offset buf; print char on the screen


mov ah,3eh
mov bx,ax
int 21h 
.exit
END 
4

1 回答 1

2

Int 21h 函数 3Dh ("OPEN EXISTING FILE" )ds:dx. 您提供的字符串没有零终止符。文件名应声明为file db "c:\rtasm\bin\file.txt",0.

如果失败,函数 3Dh 和 40h 都会返回错误代码。如果发生错误,您应该检查这些并通知用户(在这种情况下是您自己),而不是假设操作总是会成功。

另一个问题是以下代码:

mov bx,ax ; put handler to file in bx 

mov ah,40h      
mov bx,ax    <-- gives you a nonsense file handle since ah now is 40h
mov cx,2h          ;; how many bytes you want to read
mov dx,offset buf  ;; where you want to store that data (see note on Offset above)
int 21h

第二个mov bx,ax是不必要bx的,因为已经包含文件句柄。事实上,这不仅没有必要而且不正确,因为您已经用值 40h覆盖了ax( ) 的高位部分。ah还有一个事实是,您正在将两个字节读入一个只有一个字节空间的缓冲区。

于 2013-05-01T17:55:04.147 回答