在程序集中写入文件时出现问题

2024-01-14

我正在尝试用汇编语言编写一个简单的程序,在其中打开一个现有文件并在其中写入一条消息,这是我在数据段中定义的消息。当我想写入文件时会出现问题。在我尝试写入后,AX 寄存器将包含 5,诺顿专家指南称这是“拒绝访问”错误代码。关于我做错了什么有什么想法吗?抱歉,如果这个问题很简单,我只是想为即将到来的测试学习一些汇编。我正在使用 TASM 来编译我的代码。我要写入的文件存在(因此打开它时没有错误)并且它是空的。

这是我的代码:

assume cs:code, ds:data
data segment
    errorMsg db 'Error at opening $'
    errorMsg2 db 'Error at writing $'
    msg db 'File name: $'
    maxFile db 12
    fileLength db ?
    fileName db 12 dup(?)
    buffer db 100, '$'
    text db "Here $"
    handle dw ?

data ends
code segment
start:
    mov ax, data
    mov ds, ax

    ;print 'File name: ' message on screen
    mov ah, 09h
    mov dx, offset msg
    int 21h

    ;enter name of file
    mov ah, 0ah
    mov dx, offset maxFile
    int 21h

    ; transform file name in an asciiz string which ends in 0
    mov al, fileLength
    xor ah, ah
    mov si, ax
    mov fileName[si], 0

    ;open file
    mov ah,3dh
    mov al, 0
    mov dx, offset fileName
    int 21h
    mov handle, ax; saving the file handle

    jc openError;jump if carry, will print 'error at opening'


    ;write in file
    mov ah, 40h
    mov bx, handle
    mov cx, 4 ;number of bytes to write
    mov dx, offset text
    int 21h

    jc openError2 ;jump if carry, will print 'error at writing'
    ;!!! here is where I get the error, my program jumps to openError2 label!!!;

    ;close file
    mov ah, 3eh
    mov bx, handle
    int 21h

    jmp endPrg;jump over errors if it reached this point

    openError:
        mov ah, 09h
        mov dx, offset errorMsg
        int 21h

    openError2:
        mov ah, 09h
        mov dx, offset errorMsg2
        int 21h

    endPrg:
        mov ax,4c00h
        int 21h
code ends
end start

好吧,实际上很抱歉这个问题,但我终于弄清楚了。当我打开文件时,我做了

mov al, 0

这意味着我以只读访问权限打开了该文件。我需要做的是

mov al, 1 (write-only access) or 
mov al, 2 (read+write access). 

抱歉打扰了大家,我很高兴我终于明白了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在程序集中写入文件时出现问题 的相关文章

  • C++ 中的 CPUID 实现

    我想知道这里是否有人有一些可以从任何托管 net 语言引用的 C CPUID 实现的好示例 另外 如果情况并非如此 我是否应该注意 X86 和 X64 之间的某些实现差异 我想使用 CPUID 来获取运行我的软件的机器上的信息 崩溃报告等
  • 这段汇编语言代码是什么意思?

    我是一名学生 刚刚开始学习汇编语言 为了更好地理解它 我只是用 C 写了一个简短的代码并将其转换为汇编语言 奇怪的是我有点听不懂 代码是 include
  • 为 Visual Studio 应用程序设置平台目标的目的是什么?

    对于任何 VS 项目 都可以在该项目的构建属性中设置平台目标 您可以将其设置为任何 CPU x86 x64 或 Itanium 我的问题是 如果我将此值设置为 x86 是否意味着我无法在 x64 计算机上运行该项目 如果是这样 为什么还要使
  • 即使我确实为变量设置了初始值,数据段也没有被初始化

    我已经编写了一个代码 该代码应该生成某种数字列表 但是即使我为它们分配了初始值 我的数据段变量也没有被初始化 This is how DS 0000 looks when I run it 这是我的代码 但数据段只保留垃圾值 MODEL s
  • 取消的分支与常规分支有何不同?

    特别是对于 SPARC Assembly 取消的分支与常规分支有何不同 我一直认为 当我需要填充分支指令的 nop 延迟槽时 需要取消分支指令 但是 我认为我在这一部分上是不正确的 因为您可以在不取消分支的情况下填充 nop 如果不采用分支
  • NASM 轮班操作员

    您将如何在寄存器上进行 NASM 中的位移位 我读了手册 它似乎只提到了这些操作员 gt gt lt lt 当我尝试使用它们时 NASM 抱怨移位运算符处理标量值 您能解释什么是标量值并举例说明如何使用 gt gt and lt lt 另外
  • 奇怪的 MSC 8.0 错误:“ESP 的值未在函数调用中正确保存...”

    我们最近尝试将一些 Visual Studio 项目分解为库 并且在测试项目中一切似乎都编译和构建得很好 其中一个库项目作为依赖项 然而 尝试运行该应用程序给我们带来了以下令人讨厌的运行时错误消息 运行时检查失败 0 ESP 的值未在函数调
  • 汇编基础知识:输出寄存器值

    我刚刚开始学习汇编语言 我已经陷入了 在屏幕上显示存储在寄存器中的十进制值 的部分 我使用 emu8086 任何帮助将不胜感激 model small Specifies the memory model used for program
  • 在linux x86平台上学习ARM所需的工具[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个 x86 linux 机器 在阅读一些关于 ARM 的各种信息时 我很好奇 现在我想花一些时间学
  • 近调用/跳转表并不总是在引导加载程序中工作

    一般问题 我一直在开发一个简单的引导加载程序 并在某些环境中偶然发现了一个问题 在这些环境中 此类指令不起作用 mov si call tbl SI Call table pointer call call tbl Call print c
  • 在 x86 ASM 中测试零通常哪个更快:“TEST EAX, EAX”与“TEST AL, AL”?

    测试 AL 中的字节是否为零 非零通常哪个更快 TEST EAX EAX TEST AL AL 假设之前有一个 MOVZX EAX BYTE PTR ESP 4 指令加载了一个带有零扩展的字节参数到 EAX 的其余部分 防止了我已经知道的组
  • 有没有办法使用 i387 fsqrt 指令获得正确的舍入?

    有没有办法使用 i387 fsqrt 指令获得正确的舍入 除了改变精确模式在 x87 控制字中 我知道这是可能的 但这不是一个合理的解决方案 因为它存在令人讨厌的重入型问题 如果 sqrt 操作中断 精度模式将出错 我正在处理的问题如下 x
  • 如何知道寄存器是否是“通用寄存器”?

    我试图了解寄存器必须具备什么标准才能被称为 通用寄存器 我相信通用寄存器是一个可以用于任何用途的寄存器 用于计算 将数据移入 移出等 并且是一个没有特殊用途的寄存器 现在我读到了ESP寄存器是通用寄存器 我猜是ESP寄存器可以用于任何事情
  • 从 NASM 调用 C 函数 _printf 会导致分段错误

    我一直在尝试使用 NASM 在 Mac OS 和 Windows 上学习 64 位汇编 我的代码是 extern printf section data msg db Hello World 10 0 section text global
  • 大会,你好世界问题

    我正在 Linux 上学习 asm noobuntu 10 04 我得到了以下代码 http asm sourceforge net intro hello html http asm sourceforge net intro hello
  • 从 exe 文件中获取汇编级代码?

    我当时正在做linux汇编编程 在过去的几天里我已经转而学习windows汇编编程 我在用ml作为我的汇编器和golink作为我的链接器 我有我的汇编代码并已获得我的exe从中 现在我需要取回它的十六进制 xff xab x55等等 在li
  • “mov (%ebx,%eax,4),%eax”如何工作? [复制]

    这个问题在这里已经有答案了 一直在从事装配作业 并且在很大程度上我对装配非常了解 或者至少对于这项任务来说足够好 但这个 mov 的声明让我很困惑 如果有人能解释这个 mov 语句如何操作寄存器值 我将非常感激 mov ebx eax 4
  • 程序集比较标志理解

    我正在努力理解汇编程序中的以下代码片段 if EAX gt 5 EBX 1 else EBX 2 在汇编程序中 可以写如下 根据我的书 模拟jge操作说明 https www felixcloutier com x86 jcc您通常会使用
  • CPU寄存器和多任务处理

    我目前正在学习汇编 我很困惑 CPU 寄存器如何与多任务一起工作 所以在多任务系统中 CPU可以随时暂停某个程序的执行并运行另一个程序 那么在这一步中寄存器值是如何保存的呢 寄存器是压入堆栈还是以其他方式 CPU 寄存器如何与多任务一起工作
  • 如何使用movntdqa避免缓存污染?

    我正在尝试编写一个 memcpy 函数 该函数不会将源内存加载到 CPU 缓存中 目的是避免缓存污染 下面的 memcpy 函数可以工作 但会像标准 memcpy 一样污染缓存 我正在使用带有 Visual C 2008 Express 的

随机推荐

  • PhoneGap 3.1 构建设备未定义

    我有一个煎茶触摸项目 我是用phonegap 2 9构建的 并且工作正常device uuid返回设备ID 当我尝试使用 3 1 device uuid 进行构建时 抛出 设备未定义 错误 我的配置 xml
  • 使用 XPATH 选择所有其他节点

    给定任意数量的节点来选择
  • 当两个标记相邻时,Google 地图错误的标记单击事件

    我已经为标记应用了自定义 PNG 图像 与默认标记聚类器圆的大小大致相同 并且发生了这种奇怪的事情 当两个标记靠近时 但即使它们不重叠 我需要点击一个标记两次 因为第一次点击错误地给了我前一个标记 That is 有两个标记 A 和 B 彼
  • React Native WebView 未加载源

    我正在遵循 React Native 文档中的示例 但不知道为什么我的 WebView 无法加载网站 这是我的代码 Sample React Native App https github com facebook react native
  • 你可以让 mongo $push 前置而不是附加吗?

    我希望在我的集合的开头添加push add 而不是在执行mongo push 时附加到末尾 是否可以进行原子推送更新 将元素添加为第一个而不是最后一个 2014年更新 是的你可以 http docs mongodb org manual r
  • WPF FlowDocument 绑定

    我正在使用微软的XAML HTML 转换器 http msdn microsoft com en us library aa972129 aspx将 HTML 从数据库转换为 XAML 字符串 Microsoft 转换器似乎正确设置了文本格
  • urlencode() 是否足以阻止 2011 年的所有 SQL 注入攻击

    我正在将一些简单的用户数据传递到 mysql 数据库中 PHP 的 urlencode 返回一个字符串 其中包含除 之外的所有非字母数字字符 已替换为百分号 后跟两个十六进制数字 我不担心空格变成加号 或其他格式问题 我也不担心 XSS 和
  • DPDK“端口数必须为偶数”一台以太网设备

    我正在尝试从 DPDK 源代码运行骨架示例 但每当我尝试在 make 过程后构建代码时 我都会收到一条错误消息 端口数必须为偶数 但是当我尝试查看以太网设备列表时我只能看到一台设备 我在 vmware 工作站环境下的 Ubuntu 中运行框
  • 使用 Runtime.getRuntime 在 Android 上运行 shell 命令

    我正在开发一个设备管理应用程序 已由制造商签名 我使用它来安装其他应用程序 使用以下适用于 android 9 的 adb shell 命令 cat sdcard Download myfolder newapp apk pm instal
  • 如何重试 Promise 决议 N 次,并在尝试之间有延迟?

    我想要一些 JavaScript 代码将 3 个东西作为参数 返回 Promise 的函数 最大尝试次数 每次尝试之间的延迟 我最终做的是使用for环形 我不想使用递归函数 这样 即使有 50 次尝试 调用堆栈也不会长 50 行 这里是打字
  • JPQL和日期比较(查询中的约束)

    我的应用程序模型对象包含一个日期字段 时间戳 Entity Table name MYTABLE public class Application private Date timeStamp 我正在尝试构建一个 JPQL 查询 该查询将选
  • SVN 说我需要执行清理,但清理失败

    这不是重复的问题 因为其他主题中提供的解决方案对我不起作用 当我尝试提交时 错误 工作副本 D Webs Drupal 6 已锁定错误 请执行 清理 命令 当我尝试进行清理时 清理无法处理以下路径 D Webs Drupal 6 有谁知道我
  • 如何在 Jinja2 模板中检查 2 个日期之间的差异是否 > 或 < 1 个月?

    我正在使用 jinja2 模板 带有 Ansible 在其中我需要检查两个日期之间的差异 我没有日期的纪元 但我有 yyy mm dd HH MM ss 格式 没有毫秒 所以我的问题是 1 jinja2中有没有办法比较两个日期 我不想安装任
  • `multirust` 在哪里安装 Rust 语言源代码?

    我安装了multirustRust 编程语言的版本 我试图配置racer代码完成包通过以下方式指向 Rust 源代码RUST SRC PATH环境变量 但是 我似乎找不到 Rust 源文件的位置 当我打字时which rustc我被指出 u
  • 无法在 Android 项目中导入 Google Cloud Endpoints 客户端库类

    我无法让 Google Cloud Endpoints 正常工作 我有一个在 GAE 上运行的 Python 端点项目 并且使用 api 资源管理器可以完美运行 然而 我正在努力正确生成客户端库并在我的 Android 应用程序中使用它 我
  • 如何格式化 Opera 浏览器的输入占位符文本?

    我使用下面的伪元素和伪类使用 CSS 设置了占位符文本的样式 这可以在除 Opera 之外的所有主要浏览器上完成工作 我的理解是 Opera 不支持占位符文本样式 有谁知道如何设计 Opera 输入占位符文本的样式 CSS webkit i
  • Sequelize:销毁/删除表中的所有记录

    我正在使用 Mocha 进行单元测试 当测试开始时 我想删除表中所有以前的记录 我尝试过的 db User destroy force true then gt then gt done db User destroy where unde
  • R 如何在将 csv 文件写入磁盘之前估计其大小

    R 有什么方法可以在实际将 csv 文件写入磁盘之前估计其文件大小write csv or readr write csv 如果用户不小心尝试在函数中将大文件写入磁盘 我想实现警告 数据帧的内存占用之间似乎存在某种关系 object siz
  • 加载 R 包时如何分配可用的变量?

    我已经弄清楚如何制作一个包含一些我经常使用的调色板的包 我修改了代码this https drsimonj svbtle com creating corporate colour palettes for ggplot2博客文章以使其发挥
  • 在程序集中写入文件时出现问题

    我正在尝试用汇编语言编写一个简单的程序 在其中打开一个现有文件并在其中写入一条消息 这是我在数据段中定义的消息 当我想写入文件时会出现问题 在我尝试写入后 AX 寄存器将包含 5 诺顿专家指南称这是 拒绝访问 错误代码 关于我做错了什么有什