我制作了2个程序 - 1个是主要功能,另一个是外部功能。两个代码似乎都写得正确,但我没有从外部程序中获得正确的值。
这是主程序:
EXTRN SWAPPROC:FAR
INCLUDE io.h
Cr EQU 0DH ; carriage return
Lf EQU 0AH ; line feed
TheStack SEGMENT STACK
DW 100H DUP (?)
TheStack ENDS
Data SEGMENT
Num Dw ?
Num2 Dw ?
Prompt1 DB 'Please enter the positive integer of your choice: ', 0
Prompt2 DB 'Please enter another positive integer of your choice: ', 0
String DB 40 DUP (?)
New DB 6 DUP (?), 0
New2 DB 6 DUP (?), 0
Data ENDS
Code SEGMENT
ASSUME Cs:Code, Ds:Data
Start: Mov Ax, SEG Data ; Load Data Segment Number.
Mov Ds, Ax
Prompt: Output Prompt1 ; Prompt for first number.
Inputs String, 40 ; Read the ASCII characters.
AToI String
Mov Num, Ax
Output Prompt2 ; Prompt for first number.
Inputs String, 40 ; Read the ASCII characters.
AToI String
Mov Num2, Ax
mov Ax, num
mov bx, num2
Itoa new, ax
Itoa new2, bx
Output new
Output new2
Lea ax, num
push ax
Lea bx, num2
push bx
call swapproc
Itoa new, ax
Itoa new2, bx
output new
Output new2
Quit: Mov Al, 0 ; Put return code of zero in Al.
Mov Ah, 4CH ; Put DOS function call in Ah.
int 21H ; Call DOS
Code ENDS
END Start
这是外部程序:
public swapproc
code segment
assume cs:code
SWAPPROC PROC FAR
push ax
push bx
main:
mov dx, 0
div bx
Mov AX, [bx]
mov [bx], Dx
cmp dx, 0
jne main
POP BX
POP AX
ret
swapproc endp
code ends
end
例如,当我在第一个程序中输入12和4的值时,它们会被正确返回,但是当调用另一个程序时,没有一个值被正确返回,或者至少没有返回正确的登记册。因为12和4的GCD是4,我应该从其他程序返回0的值 - 最后的余数 - 和4 - GCF。相反,无论输入什么值,我总是返回0和2.将程序组合成1表明数学编码是正确的。我使用命令tlink mainprog + swapproc + io使用tlink链接程序。在使用TASM组装程序并与tlink链接时,都没有出现错误或警告。通过对外部程序和主程序进行少量编辑,我似乎被困在一个疯狂的追逐圈子里只是为了坚持同样的问题。它给我带来了头痛,沮丧和困惑,因为我已经确保所有程序都是正确编写的,并且没有错别字或缺少命令 - 据我所知至少。什么会导致2个完美编写的程序最终导致其中1个返回不正确的值?为了使第二个程序返回正确的值,我需要做什么?这是DOS模拟器我使用(dos框)的问题吗?或者这个问题是否太复杂而无法理解和解决?