对于科学展览会,我需要三个程序,数量达到50,000,并按原样输出每个数字,我需要一个用c ++,一个用java,一个用汇编。我有c ++和java程序,但是我没有看到我的汇编代码出错:
[org 0x100]
[bits 32]
mov ax, 0
mov bx, target
jmp start
start:
mov cx, 0x01
add ax, cx
mov dx, ax
mov ah, 09
int 0x21
mov ax, dx
cmp ax, bx
jg term
jmp start
term:
mov dx, msgT
mov ah, 09
int 0x21
mov ah, 00
int 0x21
msgT db 'Terminating'
target dw 50000
我正在使用汇编程序NASM,现在,它计为50,000,但在计算它们时不会输出每个数字。
答案 0 :(得分:3)
从我的评论中复制:
如果您正在尝试制作16位MS-DOS com文件,则应该使用[位16]。正如@Vlad所说AH = 09h在DX中取一个字符串而不是一个数字(参见例如here关于如何将数字转换为字符串,同时请注意,你必须$ -terminate字符串而不是NUL-终止它)。
其他一些事情:
mov bx, target
将target
的地址移至bx
。你想:mov bx, [target]
。jg term
基于签名比较分支(您有效地将ax
与-15536
进行比较)。你想要ja term
。 程序的基本结构应该是这样的:
[org 0x100] ; DOS .COM files are loaded at CS:0100h
[bits 16] ; And are 16-bits
start:
mov ax, 0 ; The current count
printloop:
push ax ; Save current number
call myconvertfunc ; Some function to convert a number in ax and return a '$'-terminated string in dx
mov ah, 0x09
int 0x21
mov dx, newline ; Point dx to newline string
mov ah, 0x09 ; Print $-terminated string in dx
int 0x21
pop ax ; Restore current number
inc ax ; Next number
cmp ax, 50000 ; Compare number to the maximum number
jbe printloop ; Notice branching based on unsigned comparison is needed
mov ax, 0x4c00 ; Return 0. AH=4Ch AL=Return value
int 0x21
newline: db 13, 10, '$' ; String containing "\r\n$"
答案 1 :(得分:1)
我认为你没有正确地进行打印。
这个here表示使用Int 21 / AH = 09h你打印一个$
- 终止的字符串,你的字符串和你的数字都不是。
可能需要使用Int 21/AH=02h来逐位编码您自己的号码打印。
答案 2 :(得分:0)