鱼C论坛

 找回密码
 立即注册
查看: 317|回复: 3

王爽汇编第13.2节问题一

[复制链接]
发表于 2023-11-23 18:20:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 吃饱了a 于 2023-11-23 18:27 编辑
  1. ;程序一
  2. ;4ch中断处理程序
  3. assume cs:code

  4. code segment
  5. start:
  6.   mov ax,cs
  7.   mov ds,ax
  8.   mov si,offset do
  9.   mov ax,0
  10.   mov es,ax
  11.   mov di,200h
  12.   mov cx,offset doend-offset do
  13.   cld
  14.   rep movsb;安装
  15.   
  16.   mov ax,0
  17.   mov es,ax
  18.   mov word ptr es:[496],200h
  19.   mov word ptr es:[498],0;设置向量表
  20.   
  21.   mov ax,4c00h
  22.   int 21h
  23. do:
  24.   mul ax;算平方

  25.   iret
  26. doend:nop
  27. code ends
  28. end start


  29. ;程序二
  30. ;计算2*3456^2
  31. assume cs:code

  32. code segment
  33. start:
  34.   mov ax,3456
  35.   int 7ch
  36.   add ax,ax
  37.   adc dx,dx
  38.   mov ax,4c00h
  39.   int 21h
  40. code ends
  41. end start
复制代码
为什么按照书上的代码运行完没有返回任何值,并且通过debug的“r”指令查看ax和dx寄存器均为零
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-23 18:21:14 | 显示全部楼层
按照你提供的问题描述,我无法直接了解到底是哪个具体的书上的代码和问题。不过,根据你提到的汇编代码运行后没有返回任何值,并且ax和dx寄存器的值都为零,这可能有以下几个原因:

1. 程序本身没有正确返回值:在某些汇编语言中,程序返回值通常存储在ax和dx寄存器中。如果程序运行完成后没有将想要返回的值存储到这两个寄存器中,那么可能会出现这种情况。

2. 程序没有正确调用返回函数:在汇编语言中,返回一个值通常需要通过调用返回函数来完成。如果程序没有正确调用返回函数,那么返回值就无法正确地传递给调用方。

3. 程序中存在其他错误:除了以上两点,程序中可能还存在其他错误,比如计算逻辑错误、寄存器使用错误等等。这些错误也可能导致程序没有返回正确的值。

为了更好地帮助你解决问题,我需要看到你具体的代码。请提供完整的代码,包括代码中的返回部分,以便我能够更详细地分析和回答你的问题。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-11-23 18:25:39 | 显示全部楼层
FishC_GPT 发表于 2023-11-23 18:21
按照你提供的问题描述,我无法直接了解到底是哪个具体的书上的代码和问题。不过,根据你提到的汇编代码运行 ...
  1. ;4ch中断处理程序
  2. assume cs:code

  3. code segment
  4. start:
  5.   mov ax,cs
  6.   mov ds,ax
  7.   mov si,offset do
  8.   mov ax,0
  9.   mov es,ax
  10.   mov di,200h
  11.   mov cx,offset doend-offset do
  12.   cld
  13.   rep movsb;安装
  14.   
  15.   mov ax,0
  16.   mov es,ax
  17.   mov word ptr es:[496],200h
  18.   mov word ptr es:[498],0;设置向量表
  19.   
  20.   mov ax,4c00h
  21.   int 21h
  22. do:
  23.   mul ax;算平方

  24.   iret
  25. doend:nop
  26. code ends
  27. end start
  28. ;计算2*3456^2
  29. assume cs:code

  30. code segment
  31. start:
  32.   mov ax,3456
  33.   int 7ch
  34.   add ax,ax
  35.   adc dx,dx
  36.   mov ax,4c00h
  37.   int 21h
  38. code ends
  39. end start
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-23 18:26:41 | 显示全部楼层
吃饱了a 发表于 2023-11-23 18:25
;4ch中断处理程序
assume cs:code

code segment
...

根据你提供的代码,这段汇编代码的功能是计算2乘以3456的平方。现在来逐行解释代码:
  1. assume cs:code
  2. code segment
  3. start:
  4.     mov ax, cs
  5.     mov ds, ax
  6.     mov si, offset do
  7.     mov ax, 0
  8.     mov es, ax
  9.     mov di, 200h
  10.     mov cx, offset doend - offset do
  11.     cld
  12.     rep movsb
复制代码

这部分代码是将段寄存器设置为代码段,设置源操作数的偏移地址,并将cx设置为要复制的字节数。然后使用cld指令将方向标志位清零,rep movsb指令执行字符串复制。
  1. ; 安装
  2.     mov ax, 0
  3.     mov es, ax
  4.     mov word ptr es:[200h], offset do
  5.     mov word ptr es:[202h], 0
复制代码

这部分代码是将do标签的偏移地址存储到中断向量表中的200h和202h处,实现了中断处理程序的安装。
  1. ; 设置向量表
  2.     mov ax, 4c00h
  3.     int 21h
复制代码

这部分代码是通过调用21h中断来终止程序的执行。

接下来是新的一段汇编代码,功能是计算2乘以3456的平方。
  1. assume cs:code
  2. code segment
  3. start:
  4.     mov ax, 3456
  5.     int 7ch
  6.     add ax, ax
  7.     adc dx, dx
  8.     mov ax, 4c00h
  9.     int 21h
复制代码

这段代码通过调用7ch中断,将3456的平方结果存储在ax和dx寄存器中。然后通过add指令将ax自身相加一次,得到2乘以3456的结果。最后通过int 21h中断终止程序的执行。

请注意,以上是对你提供的代码进行的逐行解释,但并未确定是否存在其他问题或者代码逻辑错误。如果你仍有疑问或者需要进一步的帮助,请提供更具体的问题描述或者代码上下文。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 16:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表