【问题标题】:what's wrong with following assembly code to read file?以下汇编代码读取文件有什么问题?
【发布时间】:2012-07-14 16:26:22
【问题描述】:
;the code read 4 bytes from file and print it on screen
bits 16

org 100h

jmp start 

filename db 'example.file',0

handle dw 0

buffer db 255

start:

    mov ah,3dh
    mov al,0
    mov dx,filename
    int 0x21
    mov handle,ax

    mov ah,3fh
    mov cx,4
    mov dx,buffer
    mov bx,handle
    int 21h

    mov dx,buffer
    add dx,ax

    mov bx,dx
    mov byte[bx],'$'

    mov dx,buffer
    mov ah,9
    int 21h
    mov ah,4ch
    int 21h

【问题讨论】:

  • 代码正在打印垃圾。我认为问题出在指令 mov handle, ax .... 但我无法弄清楚。
  • 使用mov [handle],ax 可能会更好。然后是mov BX,[handle]。我们必须要么获取内存地址,要么获取存储在该地址的值。
  • 单步执行代码。是否将正确的数据读入缓冲区?
  • DOS 程序只能使用 8.3 文件名。 example.file 超出了扩展名的最大 3 个字符。您确定您的代码不会因此而无法打开文件吗?打开函数返回失败吗?

标签: assembly dos nasm


【解决方案1】:

您的缓冲区似乎是一个字节。如果您真正想要的是一个 255 字节的数组,那么您应该使用(假设这是针对 NASM):

buffer: times 255 dup 0

另外,如前所述,您应该在 NASM 代码中使用方括号来访问地址指向的值。只是mov ax,foo 会将 foo 的地址放在 ax 中,而不是存储在该地址的值。

【讨论】:

  • 是的,但有足够的未使用(已执行)代码来容纳正在读取的 4 个字节。所以,缓冲区大小本身不会是问题。
  • 如果他也像另一位评论者建议的那样在句柄周围加上方括号,假设文件存在,它应该可以工作。
猜你喜欢
  • 2012-07-13
  • 1970-01-01
  • 1970-01-01
  • 2012-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多