鱼C论坛

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

王爽汇编第13.2节问题一

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

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

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

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

code segment
start:
  mov ax,cs
  mov ds,ax
  mov si,offset do
  mov ax,0
  mov es,ax
  mov di,200h
  mov cx,offset doend-offset do
  cld
  rep movsb;安装
  
  mov ax,0
  mov es,ax
  mov word ptr es:[496],200h
  mov word ptr es:[498],0;设置向量表
  
  mov ax,4c00h
  int 21h
do:
  mul ax;算平方

  iret
doend:nop
code ends
end start


;程序二
;计算2*3456^2
assume cs:code

code segment
start:
  mov ax,3456
  int 7ch
  add ax,ax
  adc dx,dx
  mov ax,4c00h
  int 21h
code ends
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
按照你提供的问题描述,我无法直接了解到底是哪个具体的书上的代码和问题。不过,根据你提到的汇编代码运行 ...
;4ch中断处理程序
assume cs:code

code segment
start:
  mov ax,cs
  mov ds,ax
  mov si,offset do
  mov ax,0
  mov es,ax
  mov di,200h
  mov cx,offset doend-offset do
  cld
  rep movsb;安装
  
  mov ax,0
  mov es,ax
  mov word ptr es:[496],200h
  mov word ptr es:[498],0;设置向量表
  
  mov ax,4c00h
  int 21h
do:
  mul ax;算平方

  iret
doend:nop
code ends
end start
;计算2*3456^2
assume cs:code

code segment
start:
  mov ax,3456
  int 7ch
  add ax,ax
  adc dx,dx
  mov ax,4c00h
  int 21h
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

code segment
...

根据你提供的代码,这段汇编代码的功能是计算2乘以3456的平方。现在来逐行解释代码:
assume cs:codecode segmentstart:    mov ax, cs    mov ds, ax    mov si, offset do    mov ax, 0    mov es, ax    mov di, 200h    mov cx, offset doend - offset do    cld    rep movsb
这部分代码是将段寄存器设置为代码段,设置源操作数的偏移地址,并将cx设置为要复制的字节数。然后使用cld指令将方向标志位清零,rep movsb指令执行字符串复制。
; 安装    mov ax, 0    mov es, ax    mov word ptr es:[200h], offset do    mov word ptr es:[202h], 0
这部分代码是将do标签的偏移地址存储到中断向量表中的200h和202h处,实现了中断处理程序的安装。
; 设置向量表    mov ax, 4c00h    int 21h
这部分代码是通过调用21h中断来终止程序的执行。

接下来是新的一段汇编代码,功能是计算2乘以3456的平方。
assume cs:codecode segmentstart:    mov ax, 3456    int 7ch    add ax, ax    adc dx, dx    mov ax, 4c00h    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-11-21 19:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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