吃饱了a 发表于 2023-11-23 18:20:32

王爽汇编第13.2节问题一

本帖最后由 吃饱了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:,200h
mov word ptr es:,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寄存器均为零

FishC_GPT 发表于 2023-11-23 18:21:14

按照你提供的问题描述,我无法直接了解到底是哪个具体的书上的代码和问题。不过,根据你提到的汇编代码运行后没有返回任何值,并且ax和dx寄存器的值都为零,这可能有以下几个原因:

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

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

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

为了更好地帮助你解决问题,我需要看到你具体的代码。请提供完整的代码,包括代码中的返回部分,以便我能够更详细地分析和回答你的问题。
以上回复来自 -- ChatGPT(FishC官方接口),如未能正确解答您的问题,请继续追问。

吃饱了a 发表于 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:,200h
mov word ptr es:,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

FishC_GPT 发表于 2023-11-23 18:26:41

吃饱了a 发表于 2023-11-23 18:25
;4ch中断处理程序
assume cs:code

code segment
...

根据你提供的代码,这段汇编代码的功能是计算2乘以3456的平方。现在来逐行解释代码:

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

这部分代码是将段寄存器设置为代码段,设置源操作数的偏移地址,并将cx设置为要复制的字节数。然后使用cld指令将方向标志位清零,rep movsb指令执行字符串复制。

; 安装
    mov ax, 0
    mov es, ax
    mov word ptr es:, offset do
    mov word ptr es:, 0

这部分代码是将do标签的偏移地址存储到中断向量表中的200h和202h处,实现了中断处理程序的安装。

; 设置向量表
    mov ax, 4c00h
    int 21h

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

接下来是新的一段汇编代码,功能是计算2乘以3456的平方。

assume cs:code
code segment
start:
    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官方接口),如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 王爽汇编第13.2节问题一